1

我是 hadoop 新手,刚刚安装了 oracle 的 virtualbox 和 hortonworks 的沙箱。然后,我下载了最新版本的 hadoop 并将 jar 文件导入到我的 java 程序中。我复制了一个示例 wordcount 程序并创建了一个新的 jar 文件。我使用沙箱将此 jar 文件作为作业运行。字数按预期工作得很好。但是,在我的工作状态页面中,我看到输入文件的映射器数量被确定为 28。在我的输入文件中,我有以下行。

Ramesh 在 XXXXXXXXXX XX XXXXX XX XXXXXXXXX 学习。

映射器总数是如何确定为 28 的?

我将以下行添加到我的 wordcount.java 程序中进行检查。

FileInputFormat.setMaxInputSplitSize(job, 2);

另外,我想知道输入文件是否只能包含 2 行。(即)假设我有一个输入文件,如下所示。

第1行,第2行,第3行,第4行,第5行,第6行.......第20行

我应该将输入文件拆分为 20 个不同的文件,每个文件只有 2 行吗?

4

2 回答 2

3

HDFS 块和 MapReduce 拆分是两个不同的东西。块是数据的物理划分,而拆分只是在 MR 作业期间完成的逻辑划分。从给定的集合数据创建拆分是职责,InputFormat并根据拆分的数量决定映射器的数量。当您使用 时setMaxInputSplitSize,您会否决此行为并提供您自己的拆分大小。但是给 setMaxInputSplitSize 一个非常小的值将是一种矫枉过正,因为会有很多非常小的拆分,你最终会有很多不必要的 Map 任务。

实际上,我认为您不需要FileInputFormat.setMaxInputSplitSize(job, 2);在 WC 程序中使用。另外,看起来你弄错了2这里。它不是文件中的行数。long这是您希望为您的 MR 工作设置的拆分大小,in 。您可以在文件中使用任意数量的行作为 MR 输入。

这听起来好吗?

于 2013-06-19T19:06:57.250 回答
1

这意味着您的输入文件在 HDFS 中被拆分为大约 28 个部分(块),因为您说计划了 28 个映射任务 - 但是,可能不是总共 28 个并行映射任务。并行度将取决于集群中的插槽数。我说的是 Apache Hadoop。我不知道霍顿的作品是否对此进行了修改。

Hadoop 喜欢处理大文件,所以,您想将输入文件拆分为 20 个不同的文件吗?

于 2013-06-19T18:31:29.967 回答