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

Hadoop streaming with Python: splitting input files manually

我是 Hadoop 的新手,正在尝试将其流功能与 Python 编写的映射器和缩减器一起使用。问题是我的原始输入文件将包含要由映射器识别的行序列。如果我让 Hadoop 拆分输入文件,它可能会在序列的中间进行拆分,因此不会检测到该序列。所以,我正在考虑手动拆分文件。这也会破坏一些序列,因此,除此之外,我还将提供替代拆分,以创建与 "first" 拆分重叠的文件。这样我就不会丢失任何序列。

我将运行下面的命令描述在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. map/reduce的地图部分要求您绘制线路所需的所有数据都驻留在线路上。试图解决这个问题是非常糟糕的做法,可能会被认为是你做错了什么的味道。
  2. Hadoop 仅拆分可拆分的输入文件,例如 bz2 或未压缩的文件。 Gzip does not get split for instance.
  3. 如果您正在分析序列或 "things that require a particular order to them to make sense",这通常在 reducer 中完成,因为流向它的数据总是按 the Hadoop sort key 排序(这就是为什么您将键映射出来).
  4. 数据集排序后,reducer 会收到来自 mappers 的拆分数据集,为了避免分离所有需要去同一个 reducer 进行解释的信息,使用 the Hadoop partitioning key

请注意,所有链接都指向同一页面,只是不同的章节。总的来说,我认为从上到下阅读该页面将使您对如何以流方式使用 Hadoop 有更坚定的认识。

额外提示: 如果你想用 python 做 map/reduce,我建议你看看 Apache Spark for Python, which runs on Hadoop, but is A whole lot faster 它还可以让你使用 iPython 控制台来开发你的 map/reduce 算法,它极大地提高了开发速度。