我对hadoop
有所了解我很想知道它是如何运作的。
准确地说,我想知道它是如何划分/拆分输入文件的。
它在大小方面是否按相同的块划分?
或者它是可配置的东西。
我确实经历了这个post,但我无法理解
答案 0 :(得分:1)
这取决于InputFormat,对于大多数基于文件的格式,它在FileInputFormat
基类中定义。
有许多可配置的选项可以表示hadoop如何处理单个文件并将其作为单个拆分处理,或者将文件划分为多个拆分:
InputFormat.isSplittable()
实现mapred.min.split.size
和mapred.max.split.size
,这些属性在将块拆分为分割时有助于输入格式。请注意,最小大小可以通过输入格式(可能具有固定的最小输入大小)覆盖如果您想了解更多内容,并且能够轻松查看来源,请查看getSplits()
中的FileInputFormat
方法(新旧API都采用相同的方法,但它们可能有一些suttle差异)。
答案 1 :(得分:0)
当您提交map-reduce作业(或pig / hive作业)时,Hadoop首先计算输入拆分,每个输入拆分大小通常等于HDFS块大小。例如,对于1GB大小的文件,如果块大小为64MB,则将有16个输入拆分。但是,拆分大小可以配置为小于/大于HDFS块大小。使用FileInputFormat完成输入拆分的计算。对于每个输入拆分,必须启动一个map任务。
但您可以通过配置以下属性来更改输入拆分的大小:
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));
您可以查看示例here。