MapReduce: Mrjob 如何持久保存结果

1 投票
1 回答
1276 浏览
提问于 2025-04-17 14:58

我正在尝试实现一个有三个步骤的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可以停止输出显示在屏幕上(我在上面的第一步中用了这个,你可能不想看到中间结果,但在第二步中为了演示差别就没用)。如果你需要三个步骤,可以在前两步中不加这个,在第三步中加上。或者把第三步的输出写到一个你能方便读取的文件夹里。

如果你遇到什么问题,告诉我,应该会比较简单。

撰写回答