我了解hadoop
我很想知道它是如何工作的。
确切地说,我想知道它是如何划分/拆分输入文件的。
它在大小方面是否分成相等的块?
或者它是可配置的东西。
我确实看过这篇文章,但我无法理解
这取决于 InputFormat,对于大多数基于文件的格式,InputFormat 是在FileInputFormat
基类中定义的。
有许多可配置的选项表示 hadoop 将如何获取单个文件并将其作为单个拆分处理,或者将文件分成多个拆分:
InputFormat.isSplittable()
实现mapred.min.split.size
,mapred.max.split.size
它们在将块分解为拆分时有助于输入格式。请注意,输入格式可能会覆盖最小大小(可能具有固定的最小输入大小)如果您想了解更多信息,并且可以轻松查看源代码,请查看中的getSplits()
方法FileInputFormat
(新旧 api 具有相同的方法,但它们可能存在一些细微差别)。
当您提交 map-reduce 作业(或 pig/hive 作业)时,Hadoop 首先计算输入拆分,每个输入拆分大小通常等于 HDFS 块大小。例如,对于 1GB 大小的文件,如果块大小为 64MB,则将有 16 个输入拆分。但是,拆分大小可以配置为小于/大于 HDFS 块大小。输入拆分的计算是使用 FileInputFormat 完成的。对于这些输入拆分中的每一个,都必须启动一个映射任务。
但是您可以通过配置以下属性来更改输入拆分的大小:
mapred.min.split.size: The minimum size chunk that map input should be split into.
mapred.max.split.size: The largest valid size inbytes for a file split.
dfs.block.size: The default block size for new files.
输入拆分的公式为:
Math.max("mapred.min.split.size", Math.min("mapred.max.split.size", blockSize));
您可以在此处查看示例。