MapReduce开发技巧
2016-03-18 13:53
274 查看
数据类型的选择
自定义数据类型
参考:Hadoop提交作业自定义排序和分组MapWritable/SortedMapWritable
Hadoop中可传输的Map集合,和Java中的Map用法差不多,但是可以用与mapper和reducer之间的数据传输Map输出不同类型的Value
使用自定义的数据类型继承自GenericWritable可以实现在mapper中输出多个不同类型的value//使用这个数据类型将可以输出IntWritable和Text两种类型的value public class MultiValueWritable extends GenericWritable{ private static Class[] CLASSES = new Class{ IntWritable.class, Text.class } public MultiValueWritable(){ } public MultiValueWritable(Writable value){ set(value); } protected Class[] getTypes(){ return CLASSES; } }
mapper中context.write的时候可以使用如下的格式:
context.write(key,new MultiValueWritable(new Text("1"))); context.write(key,new MultiValueWritable(IntWritable Text(1)));
reducer的Values迭代器中可以通过这种方式来判断value是那种数据类型:
Writable value = value.get(); if(value instanceof Text){ ... }
选择合适的InputFormat/OutputFormat
基本上每个InputFormat都会有一个对应的OutputFormatTextInputFormat
默认的输入格式,按行读取,key为每行偏移量,value为行的内容NLineInputFormat
可以指定一次数据文件多少行的内容://设置一次读取50行的内容 NLineInputFormat.setNumLinesPerSplit(job,50);
SequenceFileInputFormat
输入的格式为keylen,key,valuelen,value,适合用于多个job之间的数据连接DBInputFormat
处理数据库输入,待使用测试自定义的InputFormat
参考:自定义分片策略解决大量小文件问题同时处理不同类型的输入
参考:多个Mapper和Reducer处理多个输入Partitioner的选择
TotalOrderPartitioner
对所有reducer中的结果进行排序,默认情况下每个reducer中的内容都是各自排序互不影响的自定义partitioner
参考:Hadoop作业中自定义分区和归约KeyFieldBasedPartitioner
在分区的时候mapper的key部分会参与计算配合参数
map.output.key.field.separator num.key.fields.for.partition
指定分隔符和要参与分区的字符索引
例如:key=”name-price”,指定map.output.key.field.separator=”-“,num.key.fields.for.partition=1表示key的price部分参与分区计算
二次排序
setSortComparatorClass
map中每个分区调用进行排序,reduce中shuffle之后再次调用setGroupingComparatorClass
第二次排序,属于同一组的顺序记录并放入同一个value迭代器分布式缓存的使用
参考:MapReduce中的DistributedCache作者:@小黑
相关文章推荐
- DX8数学库(2013-08-03 11:48:34)
- ArrayList循环迭代 HashMap IO读写文件
- mysql 主键重复问题解决 Duplicate entry '787192513' for key 'PRIMARY'
- ORACLE 闪回技术操作
- 根据鼠标起点和落点判断鼠标操作
- MapReduce开发技巧
- 关于css3中transform的理解(只是改变状态未改变其真正的属性)
- LearnMVC5-AddController
- 2821: 作诗(Poetize)
- jetty和jboss和linux的关联
- spring和ssh和udp的关联
- tcp和com和groovy的关联
- ant和plsql和excel的关联
- oracle和com和javascript的关联
- android ListView嵌入EditText焦点和值错误问题
- android 一些基础用法
- 进入cmd 输入dir 列出所有内容。
- C# 把DataGridView控件数据,转成DataTable
- Thinkphp页数显示
- Android项目:手机安全卫士(14)—— 短信备份