Hadoop流式传输:每个地图单个文件或多个文件。不要拆分

时间:2012-12-25 04:07:30

标签: hadoop hadoop-streaming mapper

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

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-1)

而不是根据最小分割大小我建议更简单的方法是Gzip你的文件。

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

http://www.gzip.org/

如果您使用的是Linux,则使用

压缩提取的数据
gzip -r /path/to/data

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