使用 mrjob subprocess.CalledProcessError 的 Python hadoop mapreduce 作业

标签 python hadoop mrjob

我正在尝试在我的自定义数据上运行 mrjob 网站上的基本示例。我已经使用流式传输成功运行了 Hadoop MapReduce,我也成功尝试了没有 Hadoop 的脚本,但现在我尝试通过以下命令通过 mrjob 在 Hadoop 上运行它。

./mapred.py -r hadoop --hadoop-bin /usr/bin/hadoop -o hdfs:///user/cloudera/wc_result_mrjob hdfs:///user/cloudera/books

mapred.py的源代码如下:

#! /usr/bin/env python

from mrjob.job import MRJob


class MRWordFrequencyCount(MRJob):

    def mapper(self, _, line):
        yield "chars", len(line)
        yield "words", len(line.split())
        yield "lines", 1

    def reducer(self, key, values):
        yield key, sum(values)

if __name__ == '__main__':
    MRWordFrequencyCount.run()

不幸的是我收到以下错误:

no configs found; falling back on auto-configuration
no configs found; falling back on auto-configuration
creating tmp directory /tmp/mapred.cloudera.20140824.195414.420162
writing wrapper script to /tmp/mapred.cloudera.20140824.195414.420162/setup-wrapper.sh
STDERR: mkdir: `hdfs:///user/cloudera/tmp/mrjob/mapred.cloudera.20140824.195414.420162/files/': No such file or directory
Traceback (most recent call last):
File "./mapred.py", line 18, in <module>
MRWordFrequencyCount.run()
File "/usr/lib/python2.6/site-packages/mrjob/job.py", line 494, in run
mr_job.execute()
File "/usr/lib/python2.6/site-packages/mrjob/job.py", line 512, in execute
super(MRJob, self).execute()
File "/usr/lib/python2.6/site-packages/mrjob/launch.py", line 147, in execute
self.run_job()
File "/usr/lib/python2.6/site-packages/mrjob/launch.py", line 208, in run_job
runner.run()
File "/usr/lib/python2.6/site-packages/mrjob/runner.py", line 458, in run
self._run()
File "/usr/lib/python2.6/site-packages/mrjob/hadoop.py", line 238, in _run
self._upload_local_files_to_hdfs()
File "/usr/lib/python2.6/site-packages/mrjob/hadoop.py", line 265, in _upload_local_files_to_hdfs
self._mkdir_on_hdfs(self._upload_mgr.prefix)
File "/usr/lib/python2.6/site-packages/mrjob/hadoop.py", line 273, in _mkdir_on_hdfs
self.invoke_hadoop(['fs', '-mkdir', path])
File "/usr/lib/python2.6/site-packages/mrjob/fs/hadoop.py", line 109, in invoke_hadoop
raise CalledProcessError(proc.returncode, args)
subprocess.CalledProcessError: Command '['/usr/bin/hadoop', 'fs', '-mkdir', 'hdfs:///user/cloudera/tmp/mrjob/mapred.cloudera.20140824.195414.420162/files/']' returned non-zero exit status 1

在我看来,mrjob 无法在 HDFS 中创建某些目录,但不幸的是我不知道如何解决这个问题。

我的Hadoop是cloudera CDH5.1。快速入门。

预先感谢您的任何建议和意见。

编辑:

我尝试在cloudera CDH4.7上运行相同的代码。快速启动并且效果很好。所以我修改的问题是:是cloudera CDH5.1。 mrjob框架支持吗?如果是这样,那么如何运行它?

最佳答案

我遇到了同样的错误,我所做的解决方法是更改​​:

self.invoke_hadoop(['fs', '-mkdir', 路径])

self.invoke_hadoop(['fs', '-mkdir','-p', 路径])

修改的文件是: /usr/lib/python2.6/site-packages/mrjob/hadoop.py

我的 MRJOB 已经运行了几个月,没有出现任何问题,所以这对我来说看起来不错。

我本人很想知道同样的替代方案。

关于使用 mrjob subprocess.CalledProcessError 的 Python hadoop mapreduce 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25475860/

相关文章:

mysql - 无法启动 Hive 并且 Trino 中不存在目录 'hive'

python - mrjob.conf 文件的位置是什么?

python - gdb.execute 阻塞 python 脚本中的所有线程

python - 将 pandas 表写入 impala

python - 如何安装 pyCurl?

hadoop - 获取ClassNotFound异常:在Hadoop中转储配置时

python - 弹性 map 减少误差

python - 使用 MRJob 更改 Mapreduce 中间输出位置

python - 是否建议通过启动多个网络驱动程序来使用 Selenium 加速抓取速度?

python - 如何在 postgresql 中使用 datetime 实例作为时间戳?