【问题标题】:STDIN or file as mapper input in Hadoop environment?STDIN 或文件作为 Hadoop 环境中的映射器输入?
【发布时间】:2011-01-29 16:48:41
【问题描述】:

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

但是,在 Hadoop 环境中,当我读到 HadoopStreaming 转换 文件输入到映射器的标准输入并将减速器的标准输出转换为文件 输出,我有几个关于如何输入文件的问题:

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

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

我之前针对非 Hadoop 环境设置的 Python 代码: 对于 os.walk('非 hdfs 的路径') 中的根目录、目录和文件 .....

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

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

谢谢。

【问题讨论】:

    标签: python hadoop mapreduce


    【解决方案1】:

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

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

    【讨论】:

    • 嗨@JD Long,我在 hdfs 目录中有很多 csv 文件,我想从目录中读取所有 csv 文件,你能建议我该怎么做吗?我很困惑该怎么做。正如我对从目录中本地读取的 csv 文件进行测试的脚本一样。如果我在服务器上运行它,它适用于输入流,所以读取文件时出现异常(流命令失败)。我是 hadoop 的 python 新手,所以我不知道该怎么做。请建议我该怎么做
    • 你试过什么?看看这个,然后尝试破解一些东西。如果遇到障碍,请将其形成一个 StackOverflow 问题。然后重复这个过程:blog.cloudera.com/blog/2013/01/…
    猜你喜欢
    • 2011-04-12
    • 1970-01-01
    • 2014-01-06
    • 2013-11-06
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多