在本地测试作业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是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,以便它仍可以访问本地资源。
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()
从作业环境处读取
如果想要更多或更少的划分,你可以使用设置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(LocalMRJobRunner;-r local)支持以上特性,但是它使用的是子处理器。
local runner同时运行多个子处理器,但这并不意味这它可以取代Hadoop,只是用来测试。
这意味着可以用来测试在单处理器上不可以测试的选项,包括:python_bin、setup、steps_python_bin。
- 设置一个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。
- 设置亚马逊账号和证书http://pythonhosted.org/mrjob/guides/emr-quickstart.html#amazon-setup
- 使用参数-r emr运行作业:
python your_mr_job_sub_class.py -r emr <input >output