getSplits()方法究竟返回了什么? 根据apache docs,它返回InputSplit数组,这是什么意思?
它是否返回映射器将要运行的文件字节块?
假设我们有3个文件,每个50MB,然后在[0],64MB(第二个36MB,第三个28MB),36MB(第三个文件)返回64MB(50MB + 14MB第二个文件)的字节每个都由3个不同的映射器处理?
如果我们有一个120MB的大文件,那么它会为同一个文件返回64MB的块?
我甚至不确定我所问的是合乎逻辑的,我是Hadoop堆栈的新手。
答案 0 :(得分:1)
方法getSplits()
返回拆分 - 有关文件部分的元数据。每个地图处理一个拆分。
如果您的文件很大,它会被分成具有HDFS块大小的部分(至少64MB)。在你的第二个例子中,它将是64MB和56MB的两个分区。虽然,现在推荐的块大小是128MB甚至256MB。
如果文件小于块大小,则它将在单独的拆分中。在您的第一个示例中,您将有三个拆分,每个拆分50MB。如果您想将它们合并并在一个Mapper中处理,可以使用CombineFileInputFormat(example)。
答案 1 :(得分:0)
MapReduce中的输入拆分是映射器阶段的并行化单位。如果您有十个输入拆分,那么您将有十个映射器。在一般情况下,文件块将映射到输入拆分。
InputSplit对象包含有关拆分的信息,但不包含拆分数据本身。根据子类(例如FileSplit),此信息可能是项目,例如拆分的位置及其大小。