详细介绍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

hadoop的python接口 hadoop python_hadoop的python接口

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

hadoop的python接口 hadoop python_hdfs_02

三、在集群上跑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:这一大串是连在一块写的不要直接复制,我是为了看着方便写成这样了。

看一下运行效果

hadoop的python接口 hadoop python_python_03


hadoop的python接口 hadoop python_python_04


看一下运行结果

hadoop的python接口 hadoop python_hdfs_05

总结

谈一下总体感受,python版本的不管是hdfs还是mapreduce从代码量比用java写的要小很多,还有关键一点我觉得在我的电脑的相同环境下python版本的运行速度要比java的快(个人观点)。如有不妥的地方地方请多留言指正,sort -k1,1这个地方,回头这个时间来填这个坑。