在Hadoop环境中STDIN或文件作为映射器输入?

时间:2011-01-29 16:48:42

标签: python hadoop mapreduce

因为我们需要在非Hadoop中读取一堆文件到mapper 环境,我使用os.walk(dir)file=open(path, mode)来读取 每个文件。

但是,在Hadoop环境中,我读到了HadoopStreaming转换 文件输入到mapper的stdin并将reducer的stdout转换为file 输出,我有几个关于如何输入文件的问题:

  1. 我们是否必须在mapper.py中设置STDIN的输入并让它 HadoopStreaming将hdfs输入目录中的文件转换为STDIN?

  2. 如果我想分别读取每个文件并解析每一行,如何 我可以在mapper.py中设置文件输入吗?

  3. 我以前用于非Hadoop环境集的Python代码: 对于root,dirs,os.walk中的文件('non-hdfs'的路径)   .....

    但是,在Hadoop环境中,我需要将'非hdfs的路径'更改为 我将copyFromLocal复制到HDFS的路径,但我尝试了许多没有 成功,例如os.walk('/user/hadoop/in') - 这就是我检查的内容 通过运行bin / hadoop dfs -ls和os.walk('home/hadoop/files') - 这个 是我在非Hadoop环境中的本地路径,甚至是os.walk('hdfs:// host:fs_port/user/hadoop/in') ....

    有人能告诉我是否可以使用文件从文件输入 在mapper.py中操作还是我必须从STDIN输入?

    感谢。

1 个答案:

答案 0 :(得分:1)

Hadoop流 从STDIN获取输入。我认为你所遇到的困惑是你正在尝试编写代码来完成Hadoop Streaming为你做的一些事情。当我第一次开始Hadooping时,我就这样做了。

Hadoop流可以读取多个文件甚至多个压缩文件,然后一次一行地解析到映射器的STDIN。这是一个有用的抽象,因为您然后将映射器编写为独立的文件名/位置。然后,您可以使用映射器和缩减器进行任何稍后方便的输入。另外,您不希望您的映射器尝试抓取文件,因为您无法知道稍后将使用多少映射器。如果文件被编码到映射器中,那么如果单个映射器失败,则永远不会从该映射器中硬编码的文件中获得输出。因此,让Hadoop进行文件管理,让代码尽可能通用。