2011-01-29 104 views
1

由于我们需要在一堆文件中读取到映射器,在非Hadoop的 环境中,我使用os.walk(dir)file=open(path, mode)来读取 中的每个文件。STDIN或文件作为Hadoop环境中的映射器输入?

然而,在Hadoop的环境,因为我读了HadoopStreaming转换 文件输入到减速机的映射,与CONVER标准输出的标准输入到文件 输出,我有几个问题如何输入文件:

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

  2. 如果我想单独读取每个文件并解析每一行,如何在mapper.py中设置输入文件的输入方式 ?

我非Hadoop的环境套以前的Python代码: 根目录,文件在os.walk文件( '非HDFS的路径') .....

然而,在Hadoop环境中,我需要将'非hdfs的路径'更改为 HDFS的路径,其中我copyFromLocal为,但我尝试了许多没有 的成功,例如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

Hadoop流式传输需要STDIN的输入。我认为您遇到的困惑是您正在尝试编写代码来完成Hadoop Streaming为您做的一些事情。我刚开始创建Hadooping时就这么做了。

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

+0

嗨@JD Long,我在hdfs目录中有很多csv文件,我想从目录中读取所有csv文件,你能建议我该怎么做。我很困惑该怎么做。正如我在本地从目录读取csv文件的脚本测试。如果我在服务器上运行它,它会在输入流上工作,所以我读取文件时发生异常(流式传输命令失败)。我是新的python for hadoop,所以我不知道该怎么做。请建议我该怎么做 – MegaBytes

+0

你试过了什么?看看这个,然后尝试破解一些东西。如果遇到困难,请将其形成StackOverflow问题。然后重复这个过程:http://blog.cloudera.com/blog/2013/01/a-guide-to-python-frameworks-for-hadoop/ –

相关问题