作家
登录

Hive、MapReduce、Spark分布式生成唯一数值型ID

作者: 来源: 2017-04-12 10:21:27 阅读 我要评论

在实际营业场景下,经常会碰到在Hive、MapReduce、Spark中须要生成独一的数值型ID。

一般常用的做法有:

MapReduce中应用1个Reduce来生成;

Hive中应用row_number分析函数来生成,其实也是1个Reduce;

数据量不大年夜的情况下,可以直接应用1和2办法来生成,但如不雅数据量巨大年夜,1个Reduce处理起来就异常慢。

在数据量异常大年夜的情况下,如不雅你仅仅须要独一的数值型ID,留意:不是须要”持续的独一的数值型ID”,那么可以推敲采取本文中介绍的办法,不然,请应用第3种办法来完成。

Spark中生成如许的非持续独一数值型ID,异常简单,直接应用zipWithUniqueId()即可。

参考zipWithUniqueId()的办法,在MapReduce和Hive中,实现如下:

借助HBase或Redis或Zookeeper等其它框架的计数器来生成;

下面的UDF可以在Hive中直接应用:

在Spark中,zipWithUniqueId是经由过程应用分区Index作为每个分区ID的开端值,在每个分区内,ID增长的步长为该RDD的分区数,那么在MapReduce和Hive中,也可以照此思路实现,Spark中的分区数,即为MapReduce中的Map数,Spark分区的Index,即为Map Task的ID。Map数,可以经由过程JobConf的getNumMapTasks(),而Map Task ID,可以经由过程参数mapred.task.id获取,格局如:attempt_1478926768563_0537_m_000004_0,朝长进步m_000004_0中的4,再加1,作为该Map Task的ID肇端值。留意:这两个只均须要在Job运行时才能获取。别的,大年夜图中也可以看出,每个分区/Map Task中的数据量不是绝对一致的,是以,生成的ID不是持续的。

  1. package com.lxw1234.hive.udf; 
  2.   
  3. import org.apache.hadoop.hive.ql.exec.MapredContext; 
  4. import org.apache.hadoop.hive.ql.exec.UDFArgumentException; 
  5. import org.apache.hadoop.hive.ql.metadata.HiveException; 
  6. import org.apache.hadoop.hive.ql.udf.UDFType; 
  7. import org.apache.hadoop.hive.ql.udf.generic.GenericUDF; 
  8. import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector; 
  9. import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory; 
  10. import org.apache.hadoop.io.LongWritable; 
  11.   
  12. @UDFType(deterministic = false, stateful = true
  13. public class RowSeq2 extends GenericUDF { 
  14.      
  15.     private static LongWritable result = new LongWritable(); 
  16.     private static final char SEPARATOR = '_'
  17.     private static final String ATTEMPT = "attempt"
  18.     private long initID = 0l; 
  19.     private int increment = 0; 
  20.      
  21.      
  22.     @Override 
  23.     public void configure(MapredContext context) { 
  24.         increment = context.getJobConf().getNumMapTasks(); 
  25.         if(increment == 0) { 
  26.             throw new IllegalArgumentException("mapred.map.tasks is zero"); 
     1/4    1 2 3 4 下一页 尾页

      推荐阅读

      软件开发人员的编程障碍,你知道多少?

    没有人知足Java开辟人员这种已经“竭尽全力”改变世界的速度,每小我都欲望代码像消防水管里的水一样可以或许源源赓续地流出来,但没有人愿意供给给开辟人员更好地完成工作的前>>>详细阅读


    本文标题:Hive、MapReduce、Spark分布式生成唯一数值型ID

    地址:http://www.17bianji.com/lsqh/34744.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)