InputFormat 数据输入
-
切片与 MapTask 并行度决定机制
1、问题引出
MapTask 的并行度决定 Map 阶段的任务处理并发度,进而影响到整个 job 的处理速度。
思考:1G 的数据,启动8个 MapTask,可以提高集群的并发处理能力。那么1K 的数据,也启动8个 MapTask,会提高集群性能吗?MapTask 并行任务是否越多越好呢?哪些因素影响了 MapTask 并行度?
2、MapTask 并行度决定机制
数据块:Block 是 HDFS 物理上把数据分成一块一块。数据块是 HDFS 存储数据单位。
数据切片:数据切片只是在逻辑上对输入进行分片,并不会在磁盘上将其切分成片进行存储。数据切片是 MapReduce 程序计算输入数据的单位,一个切片会对应启动一个 MapTask。
-
Job 提交流程源码和切片源码详解
1、Job 提交流程源码详解
2、FileInputFormat 切片源码解析
FileInputFormat 切片机制
TextInputFormat
1、FileInputFormat 实现类
思考:在运行 MapReduce 程序时,输入的文件格式包括:基于行的日志文件、二进制 格式文件、数据库表等。那么,针对不同的数据类型,MapReduce 时如何第七这些数据的 呢?
FileInputFormat 常见的接口实现类包括:TextInputFormat、 KeyValueTextInputFormat、NLineInputFormat、CombineTextInputFormat 和自定义 InputFormat 等。
2、TextInputFormat
TextInputFormat 是默认的 FileInputFormat 实现类。按行读取每条记录。键是存储该行在整个文件中的其实字节偏移量,LongWritable 类型。值是这行的内容,不包括任何行终止符(换行符和回车符),Text 类型。
CombineTextInputFormat 切片机制
框架默认的 TextInputFormat 切片机制是对任务按文件规划切片,不管文件多小,都会是一个单独的切片,都会交给一个 MapTask,这样如果有大量小文件,就会产生大量的 MapTask,处理效率极其低下。
1、应用场景:
CombineTextInputFormat 用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文将就可以交割一个 MapTask 处理。
2、虚拟存储切片最大值设置
CombineTextInputFormat.setMaxInputSplitSize(job,4194304);//4M
注意:虚拟存储切片最大值设置最好根据实际的小文件大小情况来设置具体的值。
3、切片机制
生成切片过程包括:虚拟存储过程和切片过程两部分。
a、虚拟存储过程:
将输入目录下所有文件大小,依次和设置的 setMaxInputSplitSize 值比较,如果不 大于设置的最大值,逻辑上划分一个块。如果输入文件大于设置的最大值且大于两倍, 那么以最大值切割一块;当剩余数据大小超过设置的最大值且不大于最大值2倍,此时 将文件均分成2个虚拟存储块(防止出现太小切片)。
例如 setMaxInputSplitSize 值为4M,输入文件大小为8.02M,则先逻辑上分成一 个4M。剩余的大小为4.02M,如果按照4M 逻辑划分,就会出现0.02M 的小的虚拟存储 文件,所以将剩余的4.02M 文件切分成(2.01M 和2.1M)两个文件。
b、切片过程:
①判断虚拟存储的文件大小是否大于 setMaxInputSplitSize值,大于等于则单独形成 一个切片。
②如果不大于则跟下一个虚拟存储文件进行合并,共同形成一个切片。
③测试举例:
CombineTextInputFormat 案例实操
MapReduce 工作流程
-
MapReduce 详细工作流程(一)
-
MapReduce 详细工作流程(二)