Hadoop 框架是使用Java编写的但是我们仍然需要使用像C++、Python等语言来实现 Hadoop程序。在Hadoop官网https://hadoop.apache.org/docs/r1.0.4/cn/mapred_tutorial.html上有java版本的示例,但是其他语言的没有。前几天我需要用hadoop做一些统计,但是很久没有写过java了,一时半会儿觉得太麻烦。所以决定用python写。这里以word count为例进行说明。
在进行数据处理的过程中我使用的工具是hadoop streaming。Hadoop streaming是Hadoop的一个工具, 它帮助用户创建和运行一类特殊的map/reduce作业, 这些特殊的map/reduce作业是由一些可执行文件或脚本文件充当mapper或者reducer。例如:
$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar \
-input myInputDirs \
-output myOutputDir \
-mapper /bin/cat \
-reducer /bin/wc
python的mapper代码:
#!/usr/bin/env python
import sys
for line in sys.stdin:
line = line.strip()
words = line.split()
for word in words:
print '%s\t%s' % (word, 1)
python的reducer代码:
#!/usr/bin/env python
from operator import itemgetter
import sys
current_word = None
current_count = 0
word = None
for line in sys.stdin:
line = line.strip()
word, count = line.split('\t', 1)
try:
count = int(count)
except ValueError:
continue
if current_word == word:
current_count += count
else:
if current_word:
print '%s\t%s' % (current_word, current_count)
current_count = count
current_word = word
if current_word == word:
print '%s\t%s' % (current_word, current_count)
这里我们需要给mapper和reducer添加可执行权限。一般755就可以了。
然后对代码进行测试,其实在hadoop运行的过程如果代码有错误会报错的,不过万一是代码逻辑有问题,计算的结果有问题这个就需要自己检查了。所以测试是非常重要的:
cat 1.txt| ./mappers.py |sort| ./reducers.py
测试没有问题之后,就可以进行运算了:
$hadoop jar contrib/streaming/hadoop-streaming-1.1.2.jar
-mapper /usr/local/hadoop/mapper.py
-reducer /usr/local/hadoop/reducer.py
-input test/*
-output output
hadoop streaming 的jar包可能会随着安装的位置不同,这个是需要注意的。
如果上面运行出错,请参考下面一段代码。注意,重新运行,需要删除dfs中的output文件
hadoop jar contrib/streaming/hadoop-streaming-1.1.2.jar
-mapper task1/mapper.py
-file task1/mapper.py
-reducer task1/reducer.py
-file task1/reducer.py
-input url
-output url-output
-jobconf mapred.reduce.tasks=3
如果运行过程中task报错,可以查看log,命令为:
yarn logs -applicationId ${applicationId}