我是hadoop的新手,刚刚安装了oracle的virtualbox和hortonworks的沙箱。然后,我下载了最新版本的hadoop并将jar文件导入我的java程序。我复制了一个示例wordcount程序并创建了一个新的jar文件。我使用沙箱将此jar文件作为作业运行。 wordcount按预期完美地运行。但是,在我的作业状态页面中,我看到输入文件的映射器数量被确定为28.在我的输入文件中,我有以下行。
Ramesh正在XXXXXXXXXX XX XXXXX XX XXXXXXXXX学习。
总映射器如何确定为28?
我将以下行添加到我的wordcount.java程序中进行检查。
FileInputFormat.setMaxInputSplitSize(job, 2);
另外,我想知道输入文件是否只能包含2行。 (即)假设我有一个输入文件,如下所示。
ROW1,ROW2,ROW3,ROW4,ROW5,ROW6 ....... row20
我应该将输入文件拆分为20个不同的文件,每个文件只有2行吗?
答案 0 :(得分:3)
HDFS块和MapReduce拆分是两回事。块是数据的物理划分,而Split只是在MR作业期间完成的逻辑划分。 InputFormat
的任务是根据给定的集合数据创建拆分,并根据Splits的数量确定Mappers的数量。当您使用setMaxInputSplitSize
时,您会否决此行为并给出您自己的分割大小。但是给setMaxInputSplitSize一个非常小的值将是一个过度杀伤,因为会有很多非常小的Splits,你最终会有很多不必要的Map任务。
实际上我认为您不需要在WC程序中使用FileInputFormat.setMaxInputSplitSize(job, 2);
。此外,您似乎错误地认为2
。它不是文件中的行数。这是您希望在MR工作中使用的long
分割尺寸。您可以在文件中包含任意数量的行作为MR输入。
这听起来不错吗?
答案 1 :(得分:1)
这意味着您的输入文件在HDFS中被分成大约28个部分(块),因为您说28个地图任务被安排 - 但是,不是可能不是总共28个并行地图任务。并行性取决于群集中的插槽数量。我正在谈论Apache Hadoop。我不知道Horton的作品是否对此有任何修改。
Hadoop喜欢使用大文件,那么,您想将输入文件拆分为20个不同的文件吗?