1.基本信息
尽管Hadoop的基本框架是用java实现的,但hadoop程序不限于java,可以用python、C++及ruby等等。
Hadoop Streaming提供一个在MapReduce下进行编程的工具包,用户可以基于一些可执行命令、脚本语言或者其他编程语言来创建Map和Reduce任务。
本例中利用Hadoop Streaming + Python 实现统计输入文本的单词的频数。
操作系统:CentOS7.6
Hadoop版本: Hadoop 3.2.0伪分布式环境
Python版本: Python2.7.5
2.实例代码
基于Python的sys模块,实现mapper和reducer之间的数据传输。
我们只需要利用sys.stdin输入数据,sys.stdout输出数据,其他的工作Hadoop streaming会帮助我们完成。
2.1 Map阶段
- 通过stdin读取文本字符串;
- 对字符串进行分割等处理;
- 统计每个单词的频数并输出。
将mapper.py保存到 /usr/local/code 文件夹内,内容如下:
#coding=utf-8
import sys
# stdin标准化输入
for line in sys.stdin:
# 移除字符串头尾的空格
line = line.strip()
# 空格作为分隔符对字符串进行分割
words = line.split()
for word in words:
print "%s\t%s" % (word, 1)
2.2 Reduce阶段
- 通过stdin读取Map阶段的输出;
- 利用split等解析Map阶段的输出;
- 当单词相同时将频数累积。
同样将reducer.py保存到 /usr/local/code 文件夹内,内容如下:
#coding=utf-8
import sys
curr_word = None
curr_count = 0