hadoop+MapReduce入手记录

在日志统计的时候由于日志量超大,效率较低。需要用MapReduce进行提速。

MapReduce是Google提出的分布式计算模型,解决海量数据的计算问题。尽管Hadoop框架是用java写的,但是我们可以用C++或者Python进行编程(官网给的例子是java编写的并打包成Jar文件)今天主要说的是Python编写MapReduce.

使用Python编写MapReduce是非常容易入手且易写的,用MapRduce界的“hello world”为例,只需要填两个函数十几行代码就可以完成。map函数将读入流文本的每一个单词进行抽离出来扔给reduce函数,reduce对扔进来的进行归并。然后对于这么多个reduce任务跑出来的结果,我们再执行一次归并就好了。

MapReduce的思想很容易,面对这样的海量数据的处理,主要需要考虑的思路就是Map函数和Reduce函数的选择上面。比如我之前就遇到一个这样的场景,由于数据部门的操作失误,误将一些非release版本的数据上线了,导致了用户的一些操作失误。因此在进行事故case分析的时候,需要统计用户检索的id出现在这些非release版本中的id中的数据量。我们的数据量(基本可以理解为小半天的pv量)是很大的,主要有4个机房的148个实例,每个实例每小时的日志量的数据大小在几百M这样,因此计算有500M*8*148≈1PB的大小,这个数据量如果用直接暴力统计是非常慢的,此时我们就可以考虑用map-reduce来统计。我们的数据在HDFS上,数据格式是pb格式。最终我的处理思路是对于所有的数据先反解成正常的json格式数据,然后map出所有的uid,在reduce中去判断是否出现在非release bid中。代码如下:

map.py

reduce.py

启动脚本

Ref

Writing an Hadoop MapReduce Program in Python

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注