详细介绍python操作hadoop的Hdfs和MapReduce
一、hdfs
1、环境准备
在操作hdfs的时候使用了pyhdfs库,需要pip或者anaconda安装一下,我使用了pip
ps:我已经把pip的源换成清华源的了,特别提醒要换国内的源,不然很慢很慢很慢…
pip install pyhdfs
2、python代码剖析
import pyhdfs
#通过ip连接hadoop的集群,我使用的是root用户此处的user_name用的root
fs = pyhdfs.HdfsClient(hosts="192.168.1.101",user_name="root")
# 创建目录
fs.mkdirs("/zzx/file")
# 输出/下的目录
f = fs.listdir("/")
print(f)
#删除目录
fs.delete("/zzx/file")
PS:时间不是很充足hdfs的就研究了怎么多,但是python的代码很简单,其他的操作也都是一行代码就可以解决,个人感觉python的速度运行起来比java的速度快不少(可能是用python用习惯的错觉吧。。。)。
二、MapReduce
这个不需要去安装别的库,但是mapreduce能百度到的大部分都是python2版本的,python3的我没找到,就自己改了一个出来。
1、剖析map的代码
import sys
for line in sys.stdin:
# 按行读取
line = line.strip()#去首尾的空格
# 按空格拆分字符串
words = line.split()
#遍历每一个单词
for word in words:
print(word,1)
本地运行一下map的代码看一下效果
本地运行的命令如下
echo "foo foo quux labs foo bar quux" | python3 mapper.py
2、reduce代码剖析
import sys
# 初始化一堆参数
current_word = None
current_count = 0
word = None
for line in sys.stdin:
# 拆成行
line = line.strip()
#此处我了解为接受的map的输出,跟sort -k1,1有关系,但是sort我不懂
word, count = line.split(' ', 1)
try:
count = int(count)
except ValueError: # count如果不是数字的,忽略
continue
#计数
if current_word == word:
current_count += count
else:
if current_word != None:
print(current_word,current_count)
current_count = count
current_word = word
if current_word == word:
print(current_word, current_count)
看一下本地运行效果
mapreduce本地运行命令如下
echo "foo foo quux labs foo bar quux" | python3 mapper.py | sort -k1,1 | python3 reduce.py
三、在集群上跑python3的mapreduce
这个命令一言难尽啊。。。
先开启hadoop集群
命令如下
hadoop jar /opt/module/hadoop-2.7.2/share/hadoop/tools/lib/hadoop-streaming-2.7.2.jar
-input /user/zzx/conf/core-site.xml
-output /output
-mapper "python3 mapper.py"
-reducer "python3 reduce.py"
-file ./mapper.py
-file ./reduce.py
分析:
1、用的是hadoop-streaming-xxx.jar这个包,
2、input output 大家都太熟了不写了
3、-mapper 运行mapper.py -reducer 运行reduce.py,这两处一定用双引号引起来(亲测)。
4、-file 此处是mapper.py文件和reduce.py的文件的路径,现在使用的这两文件的当前路径,两个file的顺序不要弄错了。
PS:这一大串是连在一块写的不要直接复制,我是为了看着方便写成这样了。
看一下运行效果
看一下运行结果
总结
谈一下总体感受,python版本的不管是hdfs还是mapreduce从代码量比用java写的要小很多,还有关键一点我觉得在我的电脑的相同环境下python版本的运行速度要比java的快(个人观点)。如有不妥的地方地方请多留言指正,sort -k1,1这个地方,回头这个时间来填这个坑。