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)作为分隔符

1. Mapper.py  
  1. #!/usr/bin/env python
  2. import sys
  3.  
  4. for line in sys.stdin:
  5. line = line.strip()
  6. word = line.split('\005')
  7. print '%s\005%s' % (word[9],word[5]) # url + cookie_id
2. Reduce.py     #注意:计算UV时, 如果不指定partitioner, 只能设置一个reduce!!!
  1. #!/usr/bin/env python
  2. from operator import itemgetter
  3. import sys
  4.  
  5. word2count = {}
  6. cookies = set()
  7. for line in sys.stdin:
  8. url,cookie = line.strip().split('\005')
  9. coo = '\006'.join([url,str(cookie)])
  10. try:
  11. act = word2count.get(url)
  12. flg = coo in cookies
  13. if not flg:
  14. cookies.add(coo)
  15. if act is None:
  16. word2count[url] = [1, 1]
  17. else:
  18. uv = not flg and 1 or 0
  19. word2count[url] = [act[0] + 1, act[1] + uv]
  20. except ValueError:
  21. sys.exit(1)
  22.  
  23. #recordsort = sorted(word2count.items(), key=itemgetter(1,0),reverse=True)
  24. recordsort = sorted(word2count.items(), key=lambda word2count:(int(word2count[1][1]),word2count[0]), reverse=True)
  25.  
  26. for real_url, val in recordsort:
  27. print '%s\t%s\t%s'% (real_url, val[0], val[1])

(二)执行Streaming:

  1. $HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-0.19.1-dc-streaming.jar \
  2. -input /group/alidw/dhwdata1/alilog/CnLog/20130603/23 \
  3. -output /group/alidw/ali-log/wfs/log \
  4. -mapper mapper.py \
  5. -reducer reduce.py \
  6. -file /home/dwapp/fusen.wangfs/MR/wfs/mapper.py \
  7. -file /home/dwapp/fusen.wangfs/MR/wfs/reduce.py \
  8. -jobconf mapred.reduce.tasks=1 \
  9. -jobconf mapred.job.name="sum_test"

----可能会报错:java.io.IOException: Task process exit with nonzero status of 137. !!!

---原因:只有一个Reduce,计算节点资源不足(比如:磁盘配额不够)

 (三)优化
    Streaming保证每个map的输出都是有序的,然而,map与map之间的输出却是局部有序的。而为了计算单页面的PV与UV,就必须设置全局变量,因而强制指定一个reduce进行计算,但这是极其粗鲁的,这显然违背了MR框架的优越性。
    优化一:充分利用机器资源,让多个reduce完成计算。
    优化二:利用python生成器提升运行效率,节省内存消耗。
 1. Mapper.py  
  1. #!/usr/bin/env python
  2. """A more advanced Mapper, using Python iterators and generators."""
  3. import sys
  4.  
  5. def read_input(file):
  6. for line in file:
  7. # split the line into words
  8. fields = line.split('\005')
  9. yield (fields[9],fields[5])
  10.  
  11. def main():
  12. data = read_input(sys.stdin)
  13. for field in data:
  14. print '%s|||%s' % (field[0], field[1])
  15.  
  16. if __name__ == "__main__":
  17. main()

2. Reduce.py

  1. #!/usr/bin/env python
  2. """A more advanced Reducer, using Python iterators and generators."""
  3.  
  4. import sys
  5.  
  6. word2count = {}
  7. cookies = set()
  8.  
  9. def read_mapper_output(file):
  10. for line in file:
  11. yield line.rstrip().split('|||') # url + cookie_id
  12.  
  13. def main():
  14. # input comes from STDIN (standard input)
  15. data = read_mapper_output(sys.stdin)
  16. for url,cookie in data:
  17. coo = '|'.join((url,str(cookie)))
  18. try:
  19. act = word2count.get(url)
  20. flg = coo in cookies
  21. if not flg:
  22. cookies.add(coo)
  23. if act is None:
  24. word2count[url] = [1, 1]
  25. else:
  26. uv = not flg and 1 or 0
  27. word2count[url] = [act[0] + 1, act[1] + uv]
  28. except ValueError:
  29. pass
  30. recordsort = sorted(word2count.items(), key=lambda word2count:(int(word2count[1][1]),word2count[0]), reverse=True)
  31.  
  32. for real_url, val in recordsort:
  33. print '%s\t%s\t%s'% (real_url, val[0], val[1])
  34.  
  35. if __name__ == "__main__":
  36. main()
3. 执行Streaming (优化)               ---分组后指定多个Reduce计算
$HADOOP_HOME/bin/hadoop  jar $HADOOP_HOME/hadoop-0.19.1-dc-streaming.jar \
    -Dstream.map.output.field.separator='+++' \
    -D map.output.key.field.separator='|||' \
    -D num.key.fields.for.partition=1 \
    -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \
    -input /group/alidw/dhwdata1/alilog/CnLog/20130607/23 \
    -output /group/alibaba-dw-cbu/output/ipage/test/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=100 \
    -jobconf mapred.job.name="sum_test"

python + Streaming框架的MR实践与优化的更多相关文章

  1. Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Django 与 Tornado 各自的优缺点Django优点: 大和全(重量级框架)自带orm,template,view 需要的功能也可以去找第三方的app注重高效开发全自动化的管理后台(只需要使 ...

  2. python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...

  3. Python玩转人工智能最火框架 TensorFlow应用实践 ☝☝☝

    Python玩转人工智能最火框架 TensorFlow应用实践 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 全民人工智能时代,不甘心只做一个旁观者,那就现在 ...

  4. 基于Python玩转人工智能最火框架 TensorFlow应用实践✍✍✍

    基于Python玩转人工智能最火框架  TensorFlow应用实践 随着 TensorFlow 在研究及产品中的应用日益广泛,很多开发者及研究者都希望能深入学习这一深度学习框架.而在昨天机器之心发起 ...

  5. 基于Python玩转人工智能最火框架 TensorFlow应用实践

    慕K网-299元-基于Python玩转人工智能最火框架 TensorFlow应用实践 需要联系我,QQ:1844912514

  6. Python玩转人工智能最火框架 TensorFlow应用实践

    Python玩转人工智能最火框架 TensorFlow应用实践 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课 ...

  7. Python开源框架

    info:更多Django信息url:https://www.oschina.net/p/djangodetail: Django 是 Python 编程语言驱动的一个开源模型-视图-控制器(MVC) ...

  8. Hadoop Streaming框架学习(一)

    Hadoop Streaming框架学习(一) Hadoop Streaming框架学习(一) 2013-08-19 12:32 by ATP_, 473 阅读, 3 评论, 收藏, 编辑 1.Had ...

  9. Awesome Python,Python的框架集合

    Awesome Python A curated list of awesome Python frameworks, libraries and software. Inspired by awes ...

随机推荐

  1. abp的开发20180425

    指定默认语言. mvc5 在Global中的 protected override void Application_BeginRequest(object sender, EventArgs e) ...

  2. 第一百九十九节,jQuery EasyUI,Panel(面板)组件

    jQuery EasyUI,Panel(面板)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解EasyUI中Panel(面板)组件的使用方法,这个组件不依赖于其 ...

  3. 第一百九十三节,jQuery EasyUI,Draggable(拖动)组件

    Draggable(拖动)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 本节课重点了解 EasyUI 中 Draggable(拖动)组件的使用方法,这个组件不依赖于其 他组 ...

  4. Eclipse 重构菜单

    Eclipse 重构菜单 使用Eclipse重构 在项目开发中我们经常需要修改类名,但如果其他类依赖该类时,我们就需要花很多时间去修改类名. 但 Eclipse 重构功能可以自动检测类的依赖关系并修改 ...

  5. jquery中end()方法的解释

    来源:http://www.jquery001.com/jquery-end-method.html 对于end()方法,jQuery文档是这样解释的:jQuery回到最近的一个"破坏性&q ...

  6. git 初始化项目操作

    命令行指令 Git 全局设置 git config --global user.name "你的名称" git config --global user.email "a ...

  7. NetWorkUtil

    import java.io.IOException; import java.io.UnsupportedEncodingException; import org.apache.http.Http ...

  8. 回溯法——n后问题

    问题描述: 在n*n的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于在n*n格的棋盘上放置n个皇后,任何2个皇后不放在同一行 ...

  9. 【BZOJ5055】膜法师 树状数组

    [BZOJ5055]膜法师 Description 题目描述 在给定的维度序列a中, 求出所有满足i<j<k且ai<aj<ak的ai*aj*ak的和 即 ∑ (a_i*a_j* ...

  10. 【BZOJ1923】[Sdoi2010]外星千足虫 高斯消元

    [BZOJ1923][Sdoi2010]外星千足虫 Description Input 第一行是两个正整数 N, M. 接下来 M行,按顺序给出 Charles 这M次使用“点足机”的统计结果.每行 ...