hadoop-MR
Mapreduce: 编程模型,适用于分布式计算 Map: 映射 预处理 Reduce: 化简 聚合 shuffle: 网络间分发 combiner: Map端的reduce partitioner: 分区,默认hash分区 combiner: 最大值,最小值 平均值不适用 文件格式和切片的关系: MR的job提交流程: 1、计算Map数和文件切片: Map运行的基本单位,切片数=map数 FileInputFormat中getSplits方法: minSize:1 maxSize:Long.Max_VALUE 确定文件夹下面的所有文件并进行迭代(listStatus方法) 判断文件是否可切割: 1、默认文本文件格式TextInputFormat 2、通过文件后缀的判断,得到文件的压缩编解码器(bzip2可切割) 3、如果文件可切割: 选择(minSize,blockSize,maxSize)中的中间值作为切片大小 ///重点切片算法 2、使用LocalJobRunner的submitJob方法,真正开始提交作业 3、开始Map作业提交: ExecutorService mapService = createMapExecutor(); runTasks(mapRunnables, mapService, "map"); //执行MapTaskRunnables对象的run函数 //map中除了partition、combiner还有sort阶段 使用maptask的runNewMapper方法开始正式的map阶段 1、根据自定义map类名,获得自定义map对象 2、调用Mapper的run函数来运行用户自定义的map方法 //设置相关变量或者参数,一个map只调用一次 setup(context); try { while (context.nextKeyValue()) { //使用while循环调用自定义map的方法 map(context.getCurrentKey(), context.getCurrentValue(), context); } } finally { //清理过程,包括清理一些没用的k-v cleanup(context); } Spill:溢出 //当map中的数据超出内存空间的80%,超出的数据就会被本地化 map端的输出称为ifile:key-len, value-len, key, value shuffle在调用的时候对ifile进行处理 4、通过shuffle进行网络间分发,reduce的调用过程类似于map过程 5、细节:FileInputFormat ====> RecordReader ==> map ===> partition ===> sort ===> combiner ===> shuffle ====> reduce RecordWriter ====> FileOutputFormat FileInputFormat: TextInputFormat =====> createRecordReader ====> LineRecordReader //负责处理文件,定义以行为单位读取和文件类型为UTF-8 通过LineReader中的readDefaultLine来读行 CR //carriage return 回车 LF //line feed 换行 CRLF // 回车换行 /* We're reading data from in, but the head of the stream may be 流的头部可能已经被buffer所缓存 1. 缓冲区中没有换行符,我们需要拷贝所有然后读取另一个缓冲区 2. 在buffer中含有明确的换行符,只需要拷贝即可 3. 在buffer中没有明确的换行符, 比如buffer以回车作为末尾. 我们拷贝内容到回车符为止到字符串中,我们需要观察什么在回车符之后 1)回车符后有换行符,将CR和LF作为一个整体,作为一个整行结尾 2)回车符后没有换行符,用flag来标记,如果恰好在buffer最后,需要观察下一个buffer的字符 设置更小的切片,考察MR的切片原则 数据倾斜:处理数据的时候,大部分数据都涌入同一个节点 e.g. hash分区,分区数为2,传入的key是数字类型,末尾为1,3,5,7,9等等奇数 1、重新设计key 2、设置随机分区 keyValueTextInputFormat: 识别每行的以\t分割的k-v值 排序: 部分排序:每个reduce中的key有序 默认实现 全排序: 所有reduce中所有的key均排序 1、使用一个reduce 2、自定义分区函数 气温:<0 0-100 >100 3、采样,在样本(源数据)中采样得到两个key <5 5-20 >20 二次排序:在key排序的基础上对value进行排序