hadoop如何自定义分区(hadoop,开发技术)

时间:2024-05-10 06:16:48 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

分区概念

分区这个词对很多同学来说并不陌生,比如Java很多中间件中,像kafka的分区,mysql的分区表等,分区存在的意义在于将数据按照业务规则进行合理的划分,方便后续对各个分区数据高效处理

Hadoop分区

hadoop中的分区,是把不同数据输出到不同reduceTask ,最终到输出不同文件中

hadoop 默认分区规则

  • hash分区

  • 按照key的hashCode % reduceTask 数量 = 分区号

  • 默认reduceTask 数量为1,当然也可以在driver 端设置

以下是Partition 类中摘取出来的源码,还是很容易懂的

hadoop如何自定义分区

hash分区代码演示

下面是wordcount案例中的driver部分的代码,默认情况下我们不做任何设置,最终输出一个统计单词个数的txt文件,如果我们在这段代码中添加这样一行

hadoop如何自定义分区

再次运行下面的程序后,会出现什么结果呢?

publicclassDemoJobDriver{publicstaticvoidmain(String[]args)throwsException{//1、获取jobConfigurationconfiguration=newConfiguration();Jobjob=Job.getInstance(configuration);//2、设置jar路径job.setJarByClass(DemoJobDriver.class);//3、关联mapper和Reducerjob.setMapperClass(DemoMapper.class);job.setReducerClass(DemoReducer.class);//4、设置map输出的key/val的类型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);//5、设置最终输出的key/val类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);//6、设置最终的输出路径StringinputPath="F:\\网盘\\csv\\hello.txt";StringoutPath="F:\\网盘\\csv\\wordcount\\hello_result.txt";//设置输出文件为2个job.setNumReduceTasks(2);FileInputFormat.setInputPaths(job,newPath(inputPath));FileOutputFormat.setOutputPath(job,newPath(outPath));//7提交jobbooleanresult=job.waitForCompletion(true);System.exit(result?0:1);}}

hadoop如何自定义分区

可以看到,最终输出了2个统计结果文件,每个文件中的内容有所不同,这就是默认情况下,当reducer个数设置为多个时,会按照hash分区算法计算结果并输出到不同分区对应的文件中去

自定义分区步骤

  • 自定义类继承Partitioner

  • 重写getPartition方法,并在此方法中根据业务规则控制不同的数据进入到不同分区

  • 在Job的驱动类中,设置自定义的Partitioner类

  • 自定义Partition后,要根据自定义的Partition逻辑设置相应数量的ReduceTask

业务需求

将下面文件中 的人物名称按照姓氏,“马”姓的放入第一个分区,“李”姓的放入第二个分区,其他的放到其他第三个分区中

hadoop如何自定义分区

自定义分区

importorg.apache.commons.lang3.StringUtils;importorg.apache.hadoop.io.IntWritable;importorg.apache.hadoop.mapreduce.Partitioner;importorg.apache.hadoop.io.Text;publicclassMyPartionerextendsPartitioner<Text,IntWritable>{@OverridepublicintgetPartition(Texttext,IntWritableintWritable,intpartion){Stringkey=text.toString();if(StringUtils.isNotEmpty(key.trim())){if(key.startsWith("马")){partion=0;}elseif(key.startsWith("李")){partion=1;}else{partion=2;}}returnpartion;}}

将自定义分区关联到Driver类中,注意这里的ReduceTasks个数和自定义的分区数量保持一致

job.setNumReduceTasks(3);job.setPartitionerClass(MyPartioner.class);

下面运行Driver类,观察最终的输出结果,也是按照预期,将不同的姓氏数据输出到了不同的文件中

hadoop如何自定义分区

hadoop如何自定义分区

关于自定义分区的总结

  • 如果ReduceTask的数量 > 自定义partion中的分区数量,则会多产生几个空的输出文件

  • 如果 1 < ReduceTask < 自定义partion中的分区数量,有一部分的数据处理过程中无法找到相应的分区文件存储,会抛异常

  • 如果ReduceTask = 1 ,则不管自定义的partion中分区数量为多少个,最终结果都只会交给这一个ReduceTask 处理,最终只会产生一个结果文件

  • 分区号必须从0开始,逐一累加

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:hadoop如何自定义分区的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:typeScript的interface接口怎么定义使用下一篇:

4 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18