2

我有很多需要由 C++ 库处理的 zip 文件。所以我使用 C++ 来编写我的 hadoop 流程序。该程序将读取一个 zip 文件,将其解压缩并处理提取的数据。我的问题是:

  1. 我的映射器无法获得一个文件的内容。它通常会得到类似 2.4 文件或 3.2 文件的内容。Hadoop 会向我的映射器发送几个文件,但至少有一个文件是部分的。你知道 zip 文件不能这样处理。每张地图我可以只得到一个文件吗?我不想使用文件列表作为输入并从我的程序中读取它,因为我想拥有数据局部性的优势。

  2. 如果 Hadoop 不拆分 zip 文件,我可以接受每个地图的多个 zip 文件的内容。我的意思是 1、2、3 个文件,而不是 2.3 个文件。实际上它会更好,因为我的程序需要加载大约 800MB 的数据文件来处理解压缩的数据。我们可以这样做吗?

4

2 回答 2

3

您可以在这里找到解决方案:

http://wiki.apache.org/hadoop/FAQ#How_do_I_get_each_of_a_job.27s_maps_to_work_on_one_complete_input-file_and_not_allow_the_framework_to_split-up_the_files.3F

我建议的最简单的方法是设置mapred.min.split.size一个较大的值,这样您的文件就不会被拆分。

如果这不起作用,那么您将需要实现一个InputFormat不是很难做到的,您可以在以下位置找到步骤:http: //developer.yahoo.com/hadoop/tutorial/module5.html#fileformat

于 2012-12-25T11:59:54.750 回答
-1

而不是取决于最小分割大小,我建议一种更简单的方法是 Gzip 你的文件。

有一种方法可以使用 gzip 压缩文件

http://www.gzip.org/

如果您使用的是 Linux,您可以使用以下命令压缩提取的数据

gzip -r /path/to/data

现在您已经将此数据作为您的 hadoop 流式传输作业中的输入传递。

于 2014-11-22T01:44:42.467 回答