环境使用:hadoop3.1,Python3.6,ubuntu18.04python
Hadoop是使用Java开发的,推荐使用Java操做HDFS。编程
有时候也须要咱们使用Python操做HDFS。ubuntu
本次咱们来讨论如何使用Python操做HDFS,进行文件上传,下载,查看文件夹,以及如何使用Python进行MapReduce编程。bash
首先须要安装和导入hdfs
库,使用pip install hdfs
。app
from hdfs import * client = Client('http://ip:port') #2.X版本port 使用50070 3.x版本port 使用9870 client.list('/') #查看hdfs /下的目录
client.makedirs('/test') client.makedirs('/test',permision = 777 ) # permision能够设置参数
client.rename('/test','123') #将/test 目录更名为123 client.delete('/test',True) #第二个参数表示递归删除
将/test/log.txt
文件下载至/home
目录下。函数
client.download('/test/log.txt','/home')
with client.read("/test/[PPT]Google Protocol Buffers.pdf") as reader: print reader.read()
其余参数:oop
将文件上传至hdfs的 /test
下。测试
client.upload(‘/test’,’/home/test/a.log’)
编写mapper
代码,map.py
:编码
import sys for line in sys.stdin: fields = line.strip().split() for item in fields: print(item + ' ' + '1')
编写reducer
代码,reduce.py
:spa
import sys result = {} for line in sys.stdin: kvs = line.strip().split(' ') k = kvs[0] v = kvs[1] if k in result: result[k]+=1 else: result[k] = 1 for k,v in result.items(): print("%s\t%s" %(k,v))
添加测试文本,test1.txt
:
tale as old as time true as it can be beauty and the beast
map
代码:`
cat test1.txt | python map.py
`
结果:
tale 1 as 1 old 1 as 1 time 1 true 1 as 1 it 1 can 1 be 1 beauty 1 and 1 the 1 beast 1
reduce
代码:cat test1.txt | python map.py | sort -k1,1 | python reduce.py
执行结果:
and 1 be 1 old 1 beauty 1 true 1 it 1 beast 1 as 3 can 1 time 1 the 1 tale 1
map-reduce
程序本地测试完毕,编写脚本在HDFS中执行程序
脚本:run.sh
(请根据本机环境修改)
HADOOP_CMD="/app/hadoop-3.1.2/bin/hadoop" STREAM_JAR_PATH="/app/hadoop-3.1.2/share/hadoop/tools/lib/hadoop-streaming-3.1.2.jar" INPUT_FILE_PATH_1="/py/input/" OUTPUT_PATH="/output" $HADOOP_CMD fs -rmr-skipTrash $OUTPUT_PATH # Step 1. $HADOOP_CMD jar $STREAM_JAR_PATH \ -input $INPUT_FILE_PATH_1 \ -output $OUTPUT_PATH \ -mapper "python map.py" \ -reducer "python reduce.py" \ -file ./map.py \ -file ./reduce.py \
添加执行权限chmod a+x run.sh
;
执行测试:bash run.sh
,查看结果:
输入文件file1
的样例以下:20150101 x
20150102 y
20150103 x
20150104 y
20150105 z
20150106 x
输入文件file2
的样例以下:20150101 y
20150102 y
20150103 x
20150104 z
20150105 y
根据输入文件file1
和file2
合并获得的输出文件file3
的样例以下:
20150101 x
20150101 y
20150102 y
20150103 x
20150104 y
20150104 z
20150105 y
20150105 z
20150106 x
对于两个输入文件,即文件file1
和文件file2
,请编写MapReduce
程序,对两个文件进行合并,并剔除其中重复的内容,获得一个新的输出文件file3
。
为了完成文件合并去重的任务,你编写的程序要能将含有重复内容的不一样文件合并到一个没有重复的整合文件,规则以下:
x,y,z
排列。输入文件内容以下:child parent
Steven Lucy
Steven Jack
Jone Lucy
Jone Jack
Lucy Mary
Lucy Frank
Jack Alice
Jack Jesse
David Alice
David Jesse
Philip David
Philip Alma
Mark David
Mark Alma
输出文件内容以下:
grandchild grandparent
Steven Alice
Steven Jesse
Jone Alice
Jone Jesse
Steven Mary
Steven Frank
Jone Mary
Jone Frank
Philip Alice
Philip Jesse
Mark Alice
Mark Jesse
你编写的程序要能挖掘父子辈关系,给出祖孙辈关系的表格。规则以下:
A-Z
排列