MapReduce: Mrjob 如何持久保存结果
我正在尝试实现一个有三个步骤的mapreduce任务,并且在每个步骤之后,我都需要获取到目前为止所有步骤的数据。有没有人能给我一个例子或者想法,关于如何在mrjob中把mapper或reducer的结果保存到磁盘上?
1 个回答
1
你可以把多个输入传给一个任务,只需要把上一个任务的输出作为输入就可以了。
当你说想把结果保存到磁盘时,听起来你是希望输出能直接显示在屏幕上?其实这只是个方便的功能(可以关闭),在MRJob中,所有的数据都会先存到磁盘上。
如果你有一个两阶段的任务,可以这样做:
job1 = firstMR(['-r', mode, inputDir, '-o', outputDir, '--no-output'])
job1.set_up_logging()
with job1.make_runner() as runner1:
runner1.run()
firstOutput = runner1.get_output_dir()
job2 = secondMR(['-r', mode, firstOutput, anyOtherInput, '-o', finalOutputDir, '--no-output'])
job2.set_up_logging()
with job2.make_runner() as runner2:
runner2.run()
有几点需要注意:
- 在hadoop上运行时,所有的目录最好都用hdfs://some/path/这样的格式。
- 任何传给MapReduce的参数,如果不是标志,也没有选项前缀,就会被当作输入文件或目录。
- 使用--no-output可以停止输出显示在屏幕上(我在上面的第一步中用了这个,你可能不想看到中间结果,但在第二步中为了演示差别就没用)。如果你需要三个步骤,可以在前两步中不加这个,在第三步中加上。或者把第三步的输出写到一个你能方便读取的文件夹里。
如果你遇到什么问题,告诉我,应该会比较简单。