文档章节

在 Hadoop 中使用 Python 进行统计开发

兔之
 兔之
发布于 2016/12/15 17:16
字数 408
阅读 44
收藏 3

Hadoop 的 Native 语言是 Java,它也提供其他语言(如 C、Python)的接口。在 Hadoop 下面其他语言是怎么工作的呢?原理是使用 HadoopStreaming 的标准输入 STDIN 和标准输出 STDOUT 来帮我们在 Map 和 Reduce 间传递数据。

Python map/reduce

编写 map.py

#!/usr/bin/env python
import sys

def read_inputs(file):  
  for line in file:
    line = line.strip()
    yield line.split()

def main():  
  file = sys.stdin
  lines = read_inputs(file)
  for words in lines:
    for word in words:
      print("{}\t{}".format(word, 1))

if __name__ == "__main__":  
  main()

测试

echo "Hello world Bye world" | ./map.py 
Hello   1
world   1
Bye 1
world   1

编写 reduce.py

#!/usr/bin/env python
import sys

def read_map_outputs(file):  
  for line in file:
    yield line.strip().split("\t", 1)

def main():  
  current_word = None
  word_count   = 0
  lines = read_map_outputs(sys.stdin)
  for word, count in lines:
    try:
      count = int(count)
    except ValueError:
      continue
    if current_word == word:
      word_count += count
    else:
      if current_word:
        print("{}\t{}".format(current_word, word_count))
      current_word = word
      word_count = count
  if current_word:
    print("{}\t{}".format(current_word, word_count))

if __name__ == "__main__":  
  main()

测试

echo "Hello World Bye World Hello" | ./map.py | sort | ./reduce.py
Bye 1
Hello   2
World   2

上面都是使用 Python 自己的特性去进行统计,下面展示使用 Hadoop 的流程来执行

使用 MapReduce 执行 Python 脚本

查找 hadoop-stream 库的位置

find ./ -name "hadoop-streaming*.jar"  
./local/hadoop/share/hadoop/tools/sources/hadoop-streaming-2.7.3-test-sources.jar
./local/hadoop/share/hadoop/tools/sources/hadoop-streaming-2.7.3-sources.jar
./local/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar

在 HDFS 上建立读入文件夹 input

hadoop -fs mkdir input

将待处理文件放入 HDFS

hadoop -fs put allfiles input

运行命令处理

hadoop jar ~/local/hadoop/share/hadoop/tools/lib/hadoop-streaming-2.7.3.jar -input input -output output -mapper ./map.py -reducer ./reduce.py

处理后的文件

Bye 1
Goodbye 1
Hadoop  2
Hello   2
World   2

Python 代码中 map.py 的 print 会将行输入到 Hadoop 中,而 reduce.py 中的 print 会将 hadoop 流中的数据输出到 HDFS 中。

© 著作权归作者所有

兔之
粉丝 69
博文 250
码字总数 96477
作品 7
深圳
程序员
私信 提问
Hadoop的Python框架指南

最近,我加入了Cloudera,在这之前,我在计算生物学/基因组学上已经工作了差不多10年。我的分析工作主要是利用Python语言和它很棒的科学计算栈来进行的。但Apache Hadoop的生态系统大部分都是...

renwofei423
2013/01/11
40.2K
7
科学数据和开放源码

学习使用开源工具将数据转换为有用信息 数据科学包括数学和计算机科学,是以从数据中提取价值为目的的。本文介绍了在这个快速发展领域中的数据科学和用于调查的突出开源工具。 PDF (291 KB)...

super0555
2013/09/14
4.1K
5
Pyleus 介绍:使用纯 Python 的构建 Storm 拓扑的开源框架

大声的宣誓,我们喜欢python,现在使用python的做web开发的人有相当大的比例,在大数据的行业中,python也是相当热门。 Pylenus 是一个新的开源框架,这个框架的目标是完成一些和其他框架一样...

oschina
2014/10/16
9.8K
9
使用Python实现Hadoop MapReduce程序

笔者的机器运行效果如下(输入数据是find的帮助手册,和笔者预期一样,the是最多的): --------------------------------------以下是原帖--------------------------------- 在这个实例中,...

彼得
2014/04/03
6.1K
4
数据专家必知必会的 7 款 Python 工具

如果你有志于做一个数据专家,你就应该保持一颗好奇心,总是不断探索,学习,问各种问题。在线入门教程和视频教程能帮你走出第一步,但是最好的方式就是通过熟悉各种已经在生产环境中使用的工...

oschina
2015/07/17
9.9K
13

没有更多内容

加载失败,请刷新页面

加载更多

启动参数

常用启动参数,通过 -Dxx.yy=zz注入应用参数 -Deureka.instance.metadata-map.starkGroup=test3 -Dserver.port=8989 本地调试过程中,可改变端口来启动多个相同服务。修改启动的VM参数即可...

ZH-JSON
7分钟前
3
0
ES配置修改

查看配置 GET /_cluster/settings 修改配置 PUT /_cluster/settings{ "persistent" : { "xpack" : { "monitoring" : { "collection" : { "enabled" : ......

messud4312
19分钟前
2
0
Spring事务传播属性有那么难吗?看这一篇就够了

Spring事务传播属性有那么难吗?看这一篇就够了 笔者文笔功力尚浅,如有不妥,请慷慨指出,必定感激不尽 学习东西要知行合一,如果只是知道理论而没实践过,那么掌握的也不会特别扎实,估计过...

不学无数的程序员
19分钟前
2
0
VMware vSphere ESXi主机的访问控制

在vShpere中,访问ESXi主机的途径很多,如下: ESXi DCUI ESXi Shell ESXi SSH ESXi Host Client vCenter --> vSphere web client / vSphere Client VMware vSphere ESXi主机的访问控制,除了......

大别阿郎
44分钟前
4
0
大神讲解CGI、FastCGI和PHP-FPM关系图解

参考资料 概念了解:CGI,FastCGI,PHP-CGI与PHP-FPM:http://www.nowamagic.net/librarys/veda/detail/1319 php中fastcgi和php-fpm是什么东西:https://www.zybuluo.com/phper/note/50231 ......

网络小虾米
53分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部