使用Python进行Hadoop流式传输:手动拆分输入文件

时间:2015-05-10 02:00:21

标签: hadoop mapreduce hadoop-streaming

我是Hadoop的新手,我正在尝试使用Python编写的mapper和reducer的流功能。问题是我的原始输入文件将包含要由映射器标识的行序列。如果我让Hadoop拆分输入文件,它可能会在序列中间执行,因此,不会检测到该序列。所以,我正在考虑手动拆分文件。这也将打破一些序列,因此,除了我还提供和替代分裂,将创建重叠"第一"分裂。这样我就不会松开任何序列。

我将运行this article中描述的以下命令:

hduser@ubuntu:/usr/local/hadoop$ bin/hadoop jar contrib/streaming/hadoop-*streaming*.jar \
-file /home/hduser/mapper.py    -mapper /home/hduser/mapper.py \
-file /home/hduser/reducer.py   -reducer /home/hduser/reducer.py \
-input /user/hduser/seq_files/* -output /user/hduser/output_files

我计划将输入文件(即手动分割生成的文件)放在 / user / hduser / seq_files /

问题是:

  1. 如何配置Hadoop以获取每个输入文件并将其原样发送给映射器?

  2. 如果输入文件的数量大于节点数,是否会映射所有文件? 感谢。

1 个答案:

答案 0 :(得分:1)

这里有许多问题需要考虑。

  1. map / reduce的地图部分要求您映射该行所需的所有数据都位于该行上。试图解决这个问题是非常糟糕的做法,可能会被认为是你做错了什么的气味。
  2. Hadoop仅拆分可拆分的输入文件,例如bz2或未压缩文件。 Gzip does not get split for instance
  3. 如果您正在分析序列或需要特定顺序的事物以使它们有意义,那么这通常在reducer中完成,因为流式传输的数据总是在{{3}上排序(这就是你把密钥映射出来的原因)。
  4. 在对数据集进行排序后,reducer将从映射器接收拆分数据集,以避免将所有需要转移到同一个reducer的信息分离,使用the Hadoop sort key
  5. 请注意,所有链接都指向同一页面,只是指向不同的章节。一般来说,我认为从上到下阅读该页面将为您提供一个更加坚定的概念,即如何以流媒体方式使用Hadoop。

    奖金提示: 如果你想用python做map / reduce,我建议你看看the Hadoop partitioning key,它在Hadoop上运行,但是Apache Spark for Python它还允许你使用iPython控制台来开发你的map / reduce算法,这极大地提高了开发速度。