Python 从MRjob的hdfs访问流输出

Python 从MRjob的hdfs访问流输出,python,hadoop,mapreduce,hdfs,mrjob,Python,Hadoop,Mapreduce,Hdfs,Mrjob,我正在尝试使用Python驱动程序来运行迭代MRjob程序。退出标准取决于计数器 作业本身似乎正在运行。如果我从命令行运行单个迭代,那么我可以hadoop fs-cat/user/myname/myhdfsdir/part-00000并查看单个迭代的预期结果 但是,我需要使用Python驱动程序来运行代码并从运行程序访问计数器。这是因为它是一种迭代算法,需要计数器的值来确定退出标准 OUTPUT_PATH = /user/myname/myhdfsdir !hadoop fs -rm -r {O

我正在尝试使用Python驱动程序来运行迭代MRjob程序。退出标准取决于计数器

作业本身似乎正在运行。如果我从命令行运行单个迭代,那么我可以
hadoop fs-cat/user/myname/myhdfsdir/part-00000
并查看单个迭代的预期结果

但是,我需要使用Python驱动程序来运行代码并从
运行程序访问计数器。这是因为它是一种迭代算法,需要计数器的值来确定退出标准

OUTPUT_PATH = /user/myname/myhdfsdir
!hadoop fs -rm -r {OUTPUT_PATH}

from my_custom_MRjob import my_custom_MRjob

mr_job = my_custom_MRjob(args=["localDir/localTextFile.txt", 
                                     "-r", "hadoop", 
                                     "--output-dir=hdfs://"+OUTPUT_PATH, 
                                     "--no-output"])

while True:
    with mr_job.make_runner() as runner:
        print runner.get_opts()
        runner.run()
        with open('localDir/localTextFile.txt', 'w') as f:
            for line in runner.stream_output():
                key,value =  mr_job.parse_output_line(line)
                #
                f.write(key +'\t'+ value +'\n')
        print "End of MRjob iteration. Counters: {}".format(runner.counters())
        # read a particular counter
        # use counter value to evaluate exit criteria
        if exit_criteria_met:
            break
这会产生以下错误:

IOErrorTraceback (most recent call last)
<ipython-input-136-aded8ecaa727> in <module>()
     25         runner.run()
     26         with open('localDir/localTextFile.txt', 'w') as f:
---> 27             for line in runner.stream_output():
     28                 key,value =  mr_job.parse_output_line(line)
     29                 #

/home/myname/.conda/envs/py27/lib/python2.7/site-packages/mrjob/util.pyc in _to_lines(chunks)
    391     leftovers = []
    392 
--> 393     for chunk in chunks:
    394         # special case for b'' standing for EOF
    395         if chunk == b'':

/home/myname/.conda/envs/py27/lib/python2.7/site-packages/mrjob/runner.pyc in cat_output(self)
    555                 yield b''  # EOF of previous file
    556 
--> 557             for chunk in self.fs._cat_file(filename):
    558                 yield chunk
    559 

/home/myname/.conda/envs/py27/lib/python2.7/site-packages/mrjob/fs/composite.pyc in _cat_file(self, path)
     75 
     76     def _cat_file(self, path):
---> 77         for line in self._do_action('_cat_file', path):
     78             yield line
     79 

/home/myname/.conda/envs/py27/lib/python2.7/site-packages/mrjob/fs/hadoop.pyc in _cat_file(self, filename)
    272 
    273         if returncode != 0:
--> 274             raise IOError("Could not stream %s" % filename)
    275 
    276     def mkdir(self, path):

IOError: Could not stream hdfs://hdfs:/user/myname/myhdfsdir/part-00000

我需要读取初始输入文件,总是从本地文件系统读取(即使在Hadoop模式下)。然后运行MRjob迭代,其输出覆盖本地文件系统输入文件。然后从运行程序访问计数器并评估退出条件。如果不满足退出条件,请使用本地文件系统的输入再次运行作业,这次使用上次运行时更新的本地输入文件。

只要您有一个包含
hdfs://
的路径,您就不会成功,因为该路径将永远无效

在您提到的评论中,您试图手动添加
hdfs://
,这可能是一个不错的攻击,但在您的代码中,我没有看到您“清理”错误的
hdfs://
。因此,即使您添加了正确的前缀,接下来的事情将是错误的,代码仍然没有成功的机会

所以,请把它清理干净



实用说明:这个问题来自不久前,如果软件本身存在问题,现在可能已经解决了。如果问题仍然存在,则可能是您尝试使用的代码中存在一些奇怪的东西。也许可以从可靠来源的一个小例子开始,排除这种可能性。

我已经尝试过使用。还是一样的问题
“--output dir=“+fully\u qualification\u hdfs\u path(output\u path)
尝试用
mrjob.util.to\u行(runner.cat\u output())
(根据弃用说明)替换
runner.stream\u output()
,但再次看到相同的问题和相同的堆栈跟踪。
mr_job = my_custom_MRjob(args=["localDir/localTextFile.txt"])