python + Streaming框架的MR实践与优化
Streaming是Hadoop提供的一个可以使用其他编程语言来进行MR编程的API,它使用Unix标准输入输出作为Hadoop和其他编程语言的开发接口,非常轻便。而开发者可以选择自己擅长的编程语言,并且只需要在MR程序中实现计算逻辑后,指定输出即可。
Python可以通过Streaming非常高效地实现MR编程,执行效率也非常快,且基于Python本身的简洁美,特别适合MR的快速开发。
另外,对于Python MR编程,Dumbo, Happy 与 mrjob 也是很好的选择,只是则性能上要逊于Streaming。其中,Dumbo为MR应用提供了更加灵活易用的Python API,它支持将mapper.py与reduce.py封装在一起使用,而Happy则为Jython开发者使用Hadoop框架提供了便利,另外,mrjob则允许用户写多步骤的MapReduce的工作流程。
对于Streaming的实现原理,数据流程,参数设置以及任务执行等方面的介绍,社区有很详细的介绍,本文不再赘述。http://hadoop.apache.org/docs/stable/streaming.html
(一)Map + Reduce
Map阶段按流读入数据,进行字段的拆分以及格式化等操作。
Reduce阶段实现PV, UV的计算
注意:日志文件以不可见字符chr(05)作为分隔符
#!/usr/bin/env python
import sys for line in sys.stdin:
line = line.strip()
word = line.split('\005')
print '%s\005%s' % (word[9],word[5]) # url + cookie_id
#!/usr/bin/env python
from operator import itemgetter
import sys word2count = {}
cookies = set()
for line in sys.stdin:
url,cookie = line.strip().split('\005')
coo = '\006'.join([url,str(cookie)])
try:
act = word2count.get(url)
flg = coo in cookies
if not flg:
cookies.add(coo)
if act is None:
word2count[url] = [1, 1]
else:
uv = not flg and 1 or 0
word2count[url] = [act[0] + 1, act[1] + uv]
except ValueError:
sys.exit(1) #recordsort = sorted(word2count.items(), key=itemgetter(1,0),reverse=True)
recordsort = sorted(word2count.items(), key=lambda word2count:(int(word2count[1][1]),word2count[0]), reverse=True) for real_url, val in recordsort:
print '%s\t%s\t%s'% (real_url, val[0], val[1])
(二)执行Streaming:
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-0.19.1-dc-streaming.jar \
-input /group/alidw/dhwdata1/alilog/CnLog/20130603/23 \
-output /group/alidw/ali-log/wfs/log \
-mapper mapper.py \
-reducer reduce.py \
-file /home/dwapp/fusen.wangfs/MR/wfs/mapper.py \
-file /home/dwapp/fusen.wangfs/MR/wfs/reduce.py \
-jobconf mapred.reduce.tasks=1 \
-jobconf mapred.job.name="sum_test"
----可能会报错:java.io.IOException: Task process exit with nonzero status of 137. !!!
---原因:只有一个Reduce,计算节点资源不足(比如:磁盘配额不够)
#!/usr/bin/env python
"""A more advanced Mapper, using Python iterators and generators."""
import sys def read_input(file):
for line in file:
# split the line into words
fields = line.split('\005')
yield (fields[9],fields[5]) def main():
data = read_input(sys.stdin)
for field in data:
print '%s|||%s' % (field[0], field[1]) if __name__ == "__main__":
main()
2. Reduce.py
#!/usr/bin/env python
"""A more advanced Reducer, using Python iterators and generators.""" import sys word2count = {}
cookies = set() def read_mapper_output(file):
for line in file:
yield line.rstrip().split('|||') # url + cookie_id def main():
# input comes from STDIN (standard input)
data = read_mapper_output(sys.stdin)
for url,cookie in data:
coo = '|'.join((url,str(cookie)))
try:
act = word2count.get(url)
flg = coo in cookies
if not flg:
cookies.add(coo)
if act is None:
word2count[url] = [1, 1]
else:
uv = not flg and 1 or 0
word2count[url] = [act[0] + 1, act[1] + uv]
except ValueError:
pass
recordsort = sorted(word2count.items(), key=lambda word2count:(int(word2count[1][1]),word2count[0]), reverse=True) for real_url, val in recordsort:
print '%s\t%s\t%s'% (real_url, val[0], val[1]) if __name__ == "__main__":
main()
python + Streaming框架的MR实践与优化的更多相关文章
- Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架
Django 与 Tornado 各自的优缺点Django优点: 大和全(重量级框架)自带orm,template,view 需要的功能也可以去找第三方的app注重高效开发全自动化的管理后台(只需要使 ...
- python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架
Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...
- Python玩转人工智能最火框架 TensorFlow应用实践 ☝☝☝
Python玩转人工智能最火框架 TensorFlow应用实践 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 全民人工智能时代,不甘心只做一个旁观者,那就现在 ...
- 基于Python玩转人工智能最火框架 TensorFlow应用实践✍✍✍
基于Python玩转人工智能最火框架 TensorFlow应用实践 随着 TensorFlow 在研究及产品中的应用日益广泛,很多开发者及研究者都希望能深入学习这一深度学习框架.而在昨天机器之心发起 ...
- 基于Python玩转人工智能最火框架 TensorFlow应用实践
慕K网-299元-基于Python玩转人工智能最火框架 TensorFlow应用实践 需要联系我,QQ:1844912514
- Python玩转人工智能最火框架 TensorFlow应用实践
Python玩转人工智能最火框架 TensorFlow应用实践 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课 ...
- Python开源框架
info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...
- Hadoop Streaming框架学习(一)
Hadoop Streaming框架学习(一) Hadoop Streaming框架学习(一) 2013-08-19 12:32 by ATP_, 473 阅读, 3 评论, 收藏, 编辑 1.Had ...
- Awesome Python,Python的框架集合
Awesome Python A curated list of awesome Python frameworks, libraries and software. Inspired by awes ...
随机推荐
- php 使用curl 将文件上传
<?php /** * curl文件上传 * @var struing $r_file 上传文件的路劲和文件名 */ function upload_file($r_f ...
- grails 获取domainClassName
domian截图:
- 006android初级篇之jni数据类型映射
JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++) 使用JNI的副作用 一旦使用JNI,JAVA程序就丧失了JAV ...
- OpenCV学习笔记十三:opencv_videostab模块
一,简介: 该库用于视频稳像.
- CBV流程
django CBV 源码分析 FBV和CBV FBV(function base views) 就是在视图里使用函数处理请求. 在之前django的学习中,我们一直使用的是这种方式,所以不再赘述. ...
- C#中的Form,textBox,Bitmap,PictureBox,Button,WebBrowser
因为今天是用的家里的电脑,用的不是retena屏的mac,因此稍后截图的时候大家看到的图片可能会有一些模糊,还请大家海涵... 兄弟们,我胡汉三又回来啦! 以下開始我们的第一个C#程序.我们之前已经通 ...
- Andriod - 创建自定义控件
控件和布局的继承结构: 可以看到,我们所用的所有控件都是直接或间接继承自 View的,所用的所有布局都是直接或间接继承自 ViewGroup 的.View 是 Android 中一种最基本的 UI 组 ...
- HTML学习笔记——标准网页设计+使用CSS、Javascript
一.标准网页设计 1.标准网页概述: 标准网页设计要遵循,内容与表现相分离. 内容 + 表现 = 页面 --- 即 :XHTML + CSS = PAGE 内容与变现相分离,也就是内容使用HT ...
- 【BZOJ4849】[Neerc2016]Mole Tunnels 模拟费用流
[BZOJ4849][Neerc2016]Mole Tunnels Description 鼹鼠们在底下开凿了n个洞,由n-1条隧道连接,对于任意的i>1,第i个洞都会和第i/2(取下整)个洞间 ...
- Python 通过字符串调用函数、接近属性
需求:传入的是函数名.属性名,想通过字符串调用函数,接近属性. 通过字符串接近.变动属性 变量:model_name, field_name # 获取 model model = AppConfig. ...