暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MapReduce分区/自定义输入输出

编译未来 2018-12-07
455

一、分区实现:

MapperReduce程序中默认只有reducer组件,只有一个分区。

分区的实现是key的哈希算法实现。

分区只负责将对应的key-value键值对放在那个reducer组件中去执行

1、创建自定义分区类,继承Partitioner

2、在Partitioner指定类型和Reducer组件的输入类型相同

3、在getPartition(key,value)方法设定分区策略(自定义)

4、在驱动程序中设定 job.setPartitionerClass()分区类

5、指定分区的数量(必须和分区策略相对应)


代码实现:


    import org.apache.hadoop.io.Text;

    import org.apache.hadoop.mapreduce.Partitioner;

    *

     * 泛型类型的是由Reducer的输入类型决定的

     */

    public class FlowPartition extends Partitioner<Text, FlowBean>{

    

    @Override

    public int getPartition(Text key, FlowBean value, int numPartitions) {

    String addr=key.toString();

    if("北京".equals(addr)){

    return 0;//0号分区

    }else if("上海".equals(addr)){

    return 1;//1号分区

    }else{

    return 2;//2号分区

    }

    }

   

    

    }


Driver中:


//指定使用自定义分区

job.setPartitionerClass(FlowPartition.class);

//指定有多少个reducer组件(分区)

job.setNumReduceTasks(3);


二、自定义格式输入:

-默认mapper输入为LongWritable,Text若要修改输入类型需要自定义


步骤:

1.创建自定义格式输入类,继承FileInputFormat<K,V> 

-K,V为指定输入类型  即mapper组件的输入类型

2.添加createRecordReader()

-在该方法中需要返回一个真正读取数据的对象

-(该对象是RecordReader本身或它的一个子类)

-RecordReader本身返回的K,V

-K:字符偏移量

-V:每行数据

3、创建一个RecordReader子类

-在该类中,首先需要指定输入mapper的key,value 

-类型必须和自定义格式输入类中指定的相同

-指定输入文件FileSplit;行读取器LineReader

4.重写5个方法:

-initialize() 

为FileSplit/LineReader初始化

-nextKeyValue()

为key、value指定具体的内容

-getCurrentKey()

返回Key

-getCurrentValue()

返回value

-close()

关闭资源:LineReader

5.在步骤2中返回一个RcordReader子类对象。

6.在Mapper组件中使用的key、value的类型必须和上面指定相同。

7.在驱动程序中通过 job.setInputFormatClass 方法指定自定义输入类型。



代码实现:


回复 " mapreduce "获取







三、自定义格式输出:

-输出key、value之间用指定符号分隔

-指定输出文件名称(完全、不完全替代)


1.定义自定义输出类,继承FileOutputFormat类,有两个泛型,将FileOutputFormat类上的泛型添加到自定义输出类上

2.重写getRecordWriter();返回一个RecordWriter的实例或子类对象;

3.创建RecordWriter的类,重写writer()、close()方法。

-定义输出流,定义带参的构造函数,用来对输出流初始化。

-write方法用来向最终结果文件输出数据。   

-可以在该方法中定制输出格式

-close方法用来关闭输出流

4.在自定义输出类的getRecordWriter()方法中

-可以通过调用 super.getDefaultWorkFile()方法,来获取用户输入的路径

-由该路径指定文件系统,以及确定输出流

5.将该输出流传递给RecorWriter的子类实例。


代码实现:


 回复 " mapreduce "获取







文章转载自编译未来,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论