环境
环境使用:hadoop3.1,Python3.6,ubuntu18.04
Hadoop是使用Java开发的,推荐使用Java操作HDFS。
有时候也需要我们使用Python操作HDFS。
本次我们来讨论如何使用Python操作HDFS,进行文件上传,下载,查看文件夹,以及如何使用Python进行MapReduce编程。
使用Python操作HDFS
首先需要安装和导入hdfs库,使用pip install hdfs。
1. 连接并查看指定路径下的数据
<code>from hdfs import * client = Client('http://ip:port') #2.X版本port 使用50070 3.x版本port 使用9870client.list('/') #查看hdfs /下的目录/<code>
2. 创建目录
<code>client.makedirs('/test')client.makedirs('/test',permision = 777 ) # permision可以设置参数/<code>
3. 中命名、删除
<code>client.rename('/test','123') #将/test 目录改名为123client.delete('/test',True) #第二个参数表示递归删除 /<code>
4.下载
将/test/log.txt 文件下载至/home目录下。
<code>client.download('/test/log.txt','/home') /<code>
5. 读取
<code>with client.read("/test/[PPT]Google Protocol Buffers.pdf") as reader: print reader.read()/<code>
其他参数:
- read(args, *kwds)
- hdfs_path:hdfs路径
- offset:设置开始的字节位置
- l- ength:读取的长度(字节为单位)
- buffer_size:用于传输数据的字节的缓冲区的大小。默认值设置在HDFS配置。
- encoding:指定编码
- chunk_size:如果设置为正数,上下文管理器将返回一个发生器产生的每一chunk_size字节而不是一个类似文件的对象
- delimiter:如果设置,上下文管理器将返回一个发生器产生每次遇到分隔符。此参数要求指定的编码。
- progress:回调函数来跟踪进度,为每一chunk_size字节(不可用,如果块大小不是指定)。它将传递两个参数,文件上传的路径和传输的字节数。称为一次与- 1作为第二个参数。
6.上传数据
将文件上传至hdfs的 /test下。
<code>client.upload(‘/test’,’/home/test/a.log’)/<code>
Python-MapReduce
编写mapper代码,map.py:
<code>import sysfor line in sys.stdin: fields = line.strip().split() for item in fields: print(item + ' ' + '1')/<code>
编写reducer代码,reduce.py:
<code>import sysresult = {}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] = 1for k,v in result.items(): print("%s\\t%s" %(k,v))/<code>
添加测试文本,test1.txt:
<code>tale as old as timetrue as it can bebeauty and the beast/<code>
本地测试执行map代码:
`cat test1.txt | python map.py`结果:
<code>tale 1as 1old 1as 1time 1true 1as 1it 1can 1be 1beauty 1and 1the 1beast 1/<code>
本地测试执行reduce代码:
cat test1.txt | python map.py | sort -k1,1 | python reduce.py
执行结果:
<code>and 1be 1old 1beauty 1true 1it 1beast 1as 3can 1time 1the 1tale 1/<code>
在Hadoop平台执行map-reduce程序
本地测试完毕,编写脚本在HDFS中执行程序
脚本:run.sh (请根据本机环境修改)
<code>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 \\/<code>
添加执行权限chmod a+x run.sh;执行测试:bash run.sh,查看结果:
练习
1. 文件合并去重
输入文件file1的样例如下:
<strong>20150101 x
<strong>20150102 y
<strong>20150103 x
<strong>20150104 y
<strong>20150105 z
<strong>20150106 x
输入文件file2的样例如下:
<strong>20150101 y
<strong>20150102 y
<strong>20150103 x
<strong>20150104 z
<strong>20150105 y
根据输入文件file1和file2合并得到的输出文件file3的样例如下:
<strong>20150101 x
<strong>20150101 y
<strong>20150102 y
<strong>20150103 x
<strong>20150104 y
<strong>20150104 z
<strong>20150105 y
<strong>20150105 z
<strong>20150106 x
对于两个输入文件,即文件file1和文件file2,请编写MapReduce程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新的输出文件file3。为了完成文件合并去重的任务,你编写的程序要能将含有重复内容的不同文件合并到一个没有重复的整合文件,规则如下:
- 第一列按学号排列;
- 学号相同,按x,y,z排列。
2. 挖掘父子关系
输入文件内容如下:
<strong>child parent
<strong>Steven Lucy
Steven Jack
<strong>Jone Lucy
Jone Jack
<strong>Lucy Mary
Lucy Frank
<strong>
Jack Alice
Jack Jesse
<strong>David Alice
David Jesse
<strong>
Philip David
Philip Alma
<strong>Mark David
Mark Alma
输出文件内容如下:
<strong>grandchild grandparent
<strong>Steven Alice
Steven Jesse
Jone Alice
Jone Jesse
Steven Mary
Steven Frank
<strong>Jone Mary
Jone Frank
Philip Alice
Philip Jesse
Mark Alice
Mark Jesse
你编写的程序要能挖掘父子辈关系,给出祖孙辈关系的表格。规则如下:
- 孙子在前,祖父在后
- 孙子相同,祖父的名字按照A-Z排列
最后小编帮助大家整理了一套python教程,下面展示了部分,希望也能帮助对编程感兴趣,想做数据分析,人工智能、爬虫或者希望从事编程开发的小伙伴,毕竟python工资也还可以,如果能帮到你请点赞、点赞、点赞哦~~
閱讀更多 程序猿南鶴 的文章