mrjob是个非常好的python和hadoop连接的方式,可以本地调试,通过后再放在hadoop上跑。
mrjob的最简单sample是一个计数的程序
<span style="font-size:18px;"><span style="font-size:18px;">from mrjob.job import MRJob
class MRWordFrequencyCount(MRJob):
def mapper(self, _, line):
yield "chars", len(line)
yield "words", len(line.split())
yield "lines", 1
def reducer(self, key, values):
yield key, sum(values)
if __name__ == '__main__':
MRWordFrequencyCount.run()</span></span>
mrjob中,所有的job任务都是从MRJob中继承的类定义的。这个类通过定义step的方式定义方法。
step由mapper,combiner,reducer组成。
mapper接受参数为一个键(key)一个值(value),然后yields零个或者很多键值对作为输出,单一step中输出的所有键值对都是通过同一个键打包的。
combiner接受参数为一个键和键对应的值的子集,输出零个或者多个键值对。combiner是一个优化器,在每个mapper后立刻执行,用于减少总的数据传输。
reducer接受参数为一个键和当前step下键对应的全集(