沉沙
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
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
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号