因为我们需要在非Hadoop中读取一堆文件到mapper
环境,我使用os.walk(dir)
和file=open(path, mode)
来读取
每个文件。
但是,在Hadoop环境中,我读到了HadoopStreaming转换 文件输入到mapper的stdin并将reducer的stdout转换为file 输出,我有几个关于如何输入文件的问题:
我们是否必须在mapper.py中设置STDIN的输入并让它 HadoopStreaming将hdfs输入目录中的文件转换为STDIN?
如果我想分别读取每个文件并解析每一行,如何 我可以在mapper.py中设置文件输入吗?
我以前用于非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输入?
感谢。
答案 0 :(得分:1)
Hadoop流 从STDIN获取输入。我认为你所遇到的困惑是你正在尝试编写代码来完成Hadoop Streaming为你做的一些事情。当我第一次开始Hadooping时,我就这样做了。
Hadoop流可以读取多个文件甚至多个压缩文件,然后一次一行地解析到映射器的STDIN。这是一个有用的抽象,因为您然后将映射器编写为独立的文件名/位置。然后,您可以使用映射器和缩减器进行任何稍后方便的输入。另外,您不希望您的映射器尝试抓取文件,因为您无法知道稍后将使用多少映射器。如果文件被编码到映射器中,那么如果单个映射器失败,则永远不会从该映射器中硬编码的文件中获得输出。因此,让Hadoop进行文件管理,让代码尽可能通用。