当前位置: 首页 > 工具软件 > mrjob > 使用案例 >

mrjob运行runner参数

董胡非
2023-12-01

本地测试

在本地测试作业python your_mrjob_sub_class.py <log_file >output
此脚本会使用InlineMRJobRunner自动调用自身运行各个步骤。如果要更接近Hadoop,可以使用--runner=local,这个参数不会将你当前的工作目录加到PYTHONPATH,而是设置一些Hadoop环境变量,使用多个子处理器来处理任务。
也可以使用参数--mapper--reducer来运行单一的步骤。
缺省情况下,程序从stdin读入数据,但也可以指定一个活多个输入文件。程序会自动解压缩 .gz文件和.bz2文件。
python your_mr_job_sub_class.py log_01.gz log_02.bz2 log_03

测试作业

mrjob可以在没有Hadoop的情况下运行。虽然并不高效,但是一个很好的测试方法。

Inline runner

inline runner是mrjob的默认runner(当运行Python mr_your_job.py 没有任何 -r选项时使用)。它在单个处理器上运行作业,以便于快速得到反馈并且方便调试。

多划分

inline runner不会同时运行mapper或reducer,但是在每一步中至少有两个mapper,两个reducer。这样有助于获得相关MapReduce编程模型的不好的假设。

from mrjob.job import MRJob

 class MRCountLinesWrong(MRJob):

     def mapper_init(self):
         self.num_lines = 0

     def mapper(self, _, line):
         self.num_lines += 1

     def mapper_final(self):
         yield None, self.num_lines

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

是单处理器,但的确有两个mapper,如果在main函数里加上一个输出的话,只会输出一次。

隔离工作空间

就像Hadoop,Inline runner在mapper和reducer各自临时的工作目录中运行每个mapper和reducer。它会把原始的工作目录加入到$PYTHONPATH,以便它仍可以访问本地资源。

模拟jobconf

inline runner 模拟Hadoop中设置的jobconf变量/属性
*   mapreduce.job.cache.archives (mapred.cache.archives)
*   mapreduce.job.cache.files (mapred.cache.files)
*   mapreduce.job.cache.local.archives (mapred.cache.localArchives)
*   mapreduce.job.cache.local.files (mapred.cache.localFiles)
*   mapreduce.job.id (mapred.job.id)
*   mapreduce.job.local.dir (job.local.dir)
*   mapreduce.map.input.file (map.input.file)
*   mapreduce.map.input.length (map.input.length)
*   mapreduce.map.input.start (map.input.start)
*   mapreduce.task.attempt.id (mapred.task.id)
*   mapreduce.task.id (mapred.tip.id)
*   mapreduce.task.ismap (mapred.task.is.map)
*   mapreduce.task.output.dir (mapred.work.output.dir)
*   mapreduce.task.partition (mapred.task.partition)
可以利用jobconf_from_env()从作业环境处读取

设置mapper和reducer的数量

如果想要更多或更少的划分,你可以使用设置Hadoop的方法来设置inline runner:使用mapreduce.job.maps和mapreduce.job.reduces的jobconf选项:

>$ python -m mrjob.examples.mr_count_lines_wrong --jobconf mapreduce.job.maps=5 README.rst 2> /dev/null
null        24
null        33
null        38
null        30
null        12

Local runner

local runner(LocalMRJobRunner;-r local)支持以上特性,但是它使用的是子处理器。
local runner同时运行多个子处理器,但这并不意味这它可以取代Hadoop,只是用来测试。
这意味着可以用来测试在单处理器上不可以测试的选项,包括:python_bin、setup、steps_python_bin。

在自己的Hadoop集群上运行

- 设置一个Hadoop集群http://hadoop.apache.org/common/docs/current/
- 确认设置了$HADOOP_PREFIX
- p使用-r hadoop参数运行作业
python your_mr_job_sub_class.py -r hadoop <input >output
注意:不需要在Hadoop集群的节点上安装mrjob或任何其他的库,但是需要一个版本和你的作业兼容的Python。

在EMR上运行

- 设置亚马逊账号和证书http://pythonhosted.org/mrjob/guides/emr-quickstart.html#amazon-setup
- 使用参数-r emr运行作业:
 python your_mr_job_sub_class.py -r emr <input >output

 类似资料: