1、自定义的一种数据类型,要在hadoop的各个节点之间传输,应该遵循hadoop的序列化机制
就必须实现hadoop相应的序列化接口Writable
实现的方法包括:write(),readFields()
public class FlowBean implements Writable{ private String phoneNB; private long upFlow; private long downFlow; private long sumFlow; //将对象数据序列化到流中 public void write(DataOutput out) throws IOException{ } //从数据流中反序列出对象的数据 public void readFields(DataInput in) throws IOException{ } }
序列化:hadoop的序列化机制不会传递对象的继承结构信息。
hadoop不需要很复杂的继承结构。
2.reduce分组并发是MapReduce框架自带的一种机制
默认按照哈希分组的方式进行分组(HashPartitioner)
如果需要改变默认的分组方式,需要自定义改造两个机制:
1)改造分区的逻辑,自定义一个Partitioner
在job中进行设定:job.setPartitionerClass(MyPartitioner.class)
2)自定义reducer task的并发任务数(应该和分组的数量保持一致)
job.setNumReduceTasks(taskNum)
3.shuffle机制(分组&排序)
map task 的并发数是由切片的数量决定的,有多少个切片就启动多少个map task,
切片是一个逻辑的概念,指的就是文件中数据的偏移量范围。
切片的具体大小应该根据所处理的文件的大小来调整。
1)每一个map有一个环形内存缓冲区,用于存储内存的输出,默认大小100MB(io.sort.mb属性),一旦达到阀值0.8(io.sort.spill.percent),一个后台线程把内容写到磁盘的指定目录下的新建的一个溢出写文件。
2)写磁盘前,要Partition,sort。如果有combiner,combine排序后输出。
3)等最后记录写完,合并全部溢出写文件为一个分区且排序的文件。
4.压缩文件不能被切片,有些压缩文件需要全部获取才能有意义
5.文件切片的源码分析
6.《hadoop权威指南》
7.倒排索引
Map程序中可以获取切片所在文件的信息,通过Context类获取相关信息
FileSplit inputSplit = context.getInputSplit();
String filename=inputSplit.getPath().getName();