发布于2021-06-12 14:17 阅读(686) 评论(0) 点赞(17) 收藏(2)
我们在编码步骤那章简单介绍了一下分区。
其实通俗来说,分区就是根绝K的某个特征属性(可能是大小、长度以及尾号等等),将K的数据写到不同的文件里。
比如我们根据ID来分区,我们可以根据尾号来分10个文件。
有几个分区就有几个Reduce Task。
实现分区案例:
我们根据hdfs文件中的这个字段大小进行分区,大于15的一个区,小于15的一个区,最终有两个out文件。
- package partitiondemo;
-
- import org.apache.hadoop.io.LongWritable;
- import org.apache.hadoop.io.NullWritable;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.mapreduce.Mapper;
-
- import java.io.IOException;
-
-
- /**
- * 传入四个参数,第一个参数是这一行的起始点在文件中的偏移量 第二个就是读取到的内容
- * 第三个 第四个 是我们输出的K2 V2类型
- * 思路:将文本内容作为K2。 V2直接为空
- */
- public class MyMapper extends Mapper<LongWritable, Text,Text, NullWritable> {
- @Override
- protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
- //value 直接写入空值
- context.write(value, NullWritable.get());
- }
- }
- package partitiondemo;
-
- import org.apache.hadoop.io.NullWritable;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.mapreduce.Partitioner;
-
- /**
- * 这里的两个参数就是map的K2 V2
- */
- public class MyPartitioner extends Partitioner<Text, NullWritable> {
-
- @Override
- public int getPartition(Text text, NullWritable nullWritable, int i) {
- //取出根据数值分区的那个值
- String num = text.toString().split("\t")[5];
-
- //分区
- if(Integer.parseInt(num)>15){
- return 1;
- }else {
- return 0;
- }
- }
- }
- package partitiondemo;
-
- import org.apache.hadoop.io.NullWritable;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.mapreduce.Reducer;
-
- import java.io.IOException;
-
- /**
- * 没有处理
- */
- public class MyReducer extends Reducer<Text, NullWritable, Text, NullWritable> {
- @Override
- protected void reduce(Text key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException {
- context.write(key,NullWritable.get());
- }
- }
-
- package partitiondemo;
-
- import org.apache.hadoop.conf.Configuration;
- import org.apache.hadoop.fs.Path;
- import org.apache.hadoop.io.NullWritable;
- import org.apache.hadoop.io.Text;
- import org.apache.hadoop.mapreduce.Job;
- import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
- import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
-
- public class ReducerMain {
-
- public static void main(String[] args) throws Exception{
- //创建job
- Configuration configuration = new Configuration();
- Job job = Job.getInstance(configuration, "my-partition");
- //指定job所在jar包
- job.setJarByClass(ReducerMain.class);
- //指定文件读取方式 路径
- job.setInputFormatClass(TextInputFormat.class);
- TextInputFormat.addInputPath(job, new Path("hdfs://192.168.40.150:9000/test.txt"));
- //指定mapper
- job.setMapperClass(MyMapper.class);
- job.setMapOutputKeyClass(Text.class);
- job.setMapOutputValueClass(NullWritable.class);
-
- //指定自定义分区类
- job.setPartitionerClass(MyPartitioner.class);
-
- //指定reducer
- job.setReducerClass(MyReducer.class);
- job.setOutputKeyClass(Text.class);
- job.setOutputValueClass(NullWritable.class);
-
- //设置分区个数 我们是两个reducer
- job.setNumReduceTasks(2);
- //指定输出方式类以及输出路径 目录必须不存在
- job.setOutputFormatClass(TextOutputFormat.class);
- TextOutputFormat.setOutputPath(job, new Path("hdfs://192.168.40.150:9000/lgy_test/res"));
- //将job提交到yarn集群
- boolean bl = job.waitForCompletion(true);
- System.exit(bl?0:1);
-
- }
- }
原文链接:https://blog.csdn.net/qq_40771567/article/details/117745451
作者:你不要惹我
链接:http://www.javaheidong.com/blog/article/222244/2e7293808950a778a45d/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!