大数据技术 hadoop的自定义分组实现
沉沙 2018-09-25 来源 : 阅读 1834 评论 0

摘要:本篇教程探讨了大数据技术 hadoop的自定义分组实现,希望阅读本篇文章以后大家有所收获,帮助大家对大数据技术的理解更加深入。

本篇教程探讨了大数据技术 hadoop的自定义分组实现,希望阅读本篇文章以后大家有所收获,帮助大家对大数据技术的理解更加深入。

<


       hadoop开发中我们会遇到类似这样的问题,比如 如何将不同省份的手机号分别输出到不同的文件中,本片文章将对hadoop内置的Partition类进行重写以解决这个问题。
 
  MapReduce的使用者通常会指定Reduce任务和Reduce任务输出文件的数量(R)。用户在中间key上使用分区函数来对数据进行分区,之后在输入到后续任务执行进程。Hadoop中自带了一个默认的分区类HashPartitioner,它继承了Partitioner类,提供了一个getPartition的方法,它的定义如下所示:
    
 有些人死活不明白 key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; 这段代码到底是怎么运算的,不要紧 ,我们main方法运行一下不久完了吗。



[html] view plain copy
 



public class Txt {  
/*  
 * 将key均匀分布在ReduceTasks上,举例如果Key为Text的话,Text的hashcode方法跟String的基本一致,  
 * 都是采用的Horner公式计算,得到一个int,string太大的话这个int值可能会溢出变成负数,  
 * 所以与上Integer.MAX_VALUE(即0111111111111111),然后再对reduce个数取余,这样就可以让key均匀分布在reduce上。  
 */  
    public static void main(String[] args) {  
        String key = "a,b,c,d,e,f,sdf,hth,iu,44,efwfqegergegew,h,ww,b,mm,lwefwefwfwefwefkj";  
        String[] fields = key.split(",");  
        int numReduceTasks = 4 ;   
        for (int i = 0; i < 16; i++) {  
            int j = ( fields[i].hashCode() & Integer.MAX_VALUE) % numReduceTasks;   
            System.out.println("与结果:"+(fields[i].hashCode() & Integer.MAX_VALUE)+" --> key值: "+fields[i]+" 所在区间数 :"+j);  
        }  
    }  
}  

结果 : 

从结果我们简单明了的看出,通过这个算法的key具体是分布到那个区间,有几个区间,就是靠你的 reducetasks值决定的,如上图代码我们写死reducetasks数量为4,也就是 4个reduce ,  那么输出结果为 0 , 1, 2, 3 个数值, 既为 4个区间。各个key值也较为均匀的分布再来 0,1,2,3 这四个区间之间的任意一个。
1,自定义 partitioner , 这是一坨数据,我们将根据相同省份的手机号放到不同文件中,省份根据手机号前三位判断。
    
2, 继承重写Partitioner中的getPartition()方法,根据key不同值返回不同 int 值, 共4组。
    public class AreaPartitioner extends Partitioner{private static HashMap map = new HashMap<>();static{map.put("135", 0);map.put("136", 1);map.put("137", 2);map.put("150", 3);  //其余情况既返回4}//map数据分组机制 hash(key)%1 == 0 ,既只有一组,所有手机号都放到一个分组里面//现在可 返回  0 1 2 3  ,既 总共4组//main方法中控制 reduce 任务数@Overridepublic int getPartition(KEY key, VALUE value, int numPartitions) {//从key中拿到手机号,不同的省份返回不同的组号int a  = map.get(key.toString().substring(0, 3))==null?4:map.get(key.toString().substring(0, 3));return a;}    }
   3,  在main方法中定义reduce的任务数量, 改数量大于等于 你的分组数 4 。
    public static void main(String[] args) throws Exception {Configuration conf = new Configuration();Job job = Job.getInstance(conf);job.setJarByClass(FlowSumArea.class);job.setMapperClass(FlowSumAreaMapper.class);job.setReducerClass(FlowSumAreaReducer.class);//设置我们自定义的分组逻辑定义job.setPartitionerClass(AreaPartitioner.class);job.setOutputKeyClass(Text.class);job.setOutputValueClass(FlowBean.class);//设置reduce的任务并发数,应该跟分组的数量保持一致job.setNumReduceTasks(4);FileInputFormat.setInputPaths(job, new Path(args[0]));FileOutputFormat.setOutputPath(job, new Path(args[1]));System.exit(job.waitForCompletion(true)?0:1); 
}
4  , 重新打jar包, 在虚拟机上运行下,如果看到结果产生了多个文件,既为成功。
5, 这里的流程原理就是 haoop中 mapreduce中间过程 , 叫做shuffle     

本文由职坐标整理发布,学习更多的大数据技术相关知识,请关注职坐标大技术云计算大技术技术频道!

本文由 @沉沙 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved