【问题标题】:Hadoop streaming with Python: splitting input files manually使用 Python 进行 Hadoop 流式传输:手动拆分输入文件
【发布时间】:2015-05-10 02:00:20
【问题描述】:

我是 Hadoop 的新手,正在尝试将其流式传输功能与 Python 编写的映射器和缩减器一起使用。问题是我的原始输入文件将包含要由映射器识别的行序列。如果我让 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. 如果输入文件的数量大于节点的数量,是否会映射所有文件? 谢谢。

【问题讨论】:

    标签: hadoop mapreduce hadoop-streaming


    【解决方案1】:

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

    1. map/reduce 的 map 部分要求映射线所需的所有数据都驻留在该线上。试图绕过这种做法是非常糟糕的做法,并且可能会被视为您做错了什么的气味。
    2. Hadoop 仅拆分可拆分的输入文件,例如 bz2 或未压缩文件。 Gzip does not get split for instance
    3. 如果您正在分析序列或“需要特定顺序才能使它们有意义的事物”,这通常在 reducer 中完成,因为流向它的数据总是按 the Hadoop sort key 排序(这就是为什么您映射出密钥)。
    4. reducer 将在数据集排序后从映射器接收拆分数据集,以避免分离所有需要到同一个 reducer 进行解释的信息,请使用 the Hadoop partitioning key

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

    额外提示: 如果你想用 python 做 map/reduce,我可以推荐查看 Apache Spark for Python,它在 Hadoop 上运行,但是是 A whole lot faster 它还允许你使用 iPython 控制台来开发你的 map/reduce 算法,从而提高开发速度非常好。

    【讨论】:

    • 谢谢,这太棒了!确实,处理减速器中的顺序是一个更好的主意。这里有一个问题:有关行排序的信息,例如行号,可能仍应传递到映射器中,否则该信息将丢失。我想知道我是否应该在文件中的每一行前面手动添加该行号作为键(即手动预处理输入文件)或者Hadoop在其流机制中自动为文件中的每一行分配一个“行号”键在将其传递给减速器之前?谢谢。
    • @jazzblue,映射器唯一的工作是更改输入行,使其适合您对排序、分区和归约的需求。原始数据中的任何内容都不会自动传输到 reducer,如果需要,您必须自己在映射器代码中输出。
    • 谢谢。再想一想:如果我仍然想控制如何拆分输入文件,例如,我可以从每个行块(分区)中制作 JSON 列表,并将每个列表作为一行放入新的输入文件中。这样,整个块将驻留在一行上,并将被发送到同一个映射器。我想知道,这种 JSON 操作是否是一种可接受的做法,或者它是否有一些缺点?谢谢。
    • @jazzblue,json 反序列化非常慢,我建议你远离它。此外,每一行都应该是原子的。这意味着,如果您将数据进一步拆分,它将失去意义。将许多行粘合在一起是 reducer 的工作,这是应该完成的工作,尝试在 mapper 手动破坏 map/reduce 的目的之前完成它。请记住,您可以在 Hadoop 中运行两个流式作业,其中一个输出是下一个的输入。因此,您首先按照您现在描述的方式整理数据集,然后进行实际缩减。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 2012-01-24
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多