内容简介:环境使用:hadoop3.1,Python3.6,ubuntu18.04Hadoop是使用Java开发的,推荐使用Java操作HDFS。有时候也需要我们使用Python操作HDFS。
环境
环境使用:hadoop3.1,Python3.6,ubuntu18.04
Hadoop是使用 Java 开发的,推荐使用Java操作HDFS。
有时候也需要我们使用 Python 操作HDFS。
本次我们来讨论如何使用Python操作HDFS,进行文件上传,下载,查看文件夹,以及如何使用Python进行MapReduce编程。
使用Python操作HDFS
首先需要安装和导入 hdfs
库,使用 pip install hdfs
。
1. 连接并查看指定路径下的数据
from hdfs import * client = Client('http://ip:port') #2.X版本port 使用50070 3.x版本port 使用9870 client.list('/') #查看hdfs /下的目录
2. 创建目录
client.makedirs('/test') client.makedirs('/test',permision = 777 ) # permision可以设置参数
3. 重命名、删除
client.rename('/test','123') #将/test 目录改名为123 client.delete('/test',True) #第二个参数表示递归删除
4.下载
将 /test/log.txt
文件下载至 /home
目录下。
client.download('/test/log.txt','/home')
5. 读取
with client.read("/test/[PPT]Google Protocol Buffers.pdf") as reader: print reader.read()
其他参数:
- 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
下。
client.upload(‘/test’,’/home/test/a.log’)
Python-MapReduce
编写 mapper
代码, map.py
:
import sys for line in sys.stdin: fields = line.strip().split() for item in fields: print(item + ' ' + '1')
编写 reducer
代码, reduce.py
:
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
在Hadoop平台执行 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
,查看结果:
练习
1. 文件合并去重
输入文件 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
2. 挖掘父子关系
输入文件内容如下:
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
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 使用 ClosedXML 結合 LINQ 操作
- 使用git操作svn仓库
- golang 使用xorm操作mysql
- 使用Python操作消息队列RabbitMQ
- SpringBoot 使用JestClient操作Elasticsearch
- 使用Python实现批量ping操作
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
算法设计与分析导论
R.C.T.Lee (李家同)、S.S.Tseng、R.C.Chang、Y.T.Tsai / 王卫东 / 机械工业 / 2008-1 / 49.00元
本书在介绍算法时,重点介绍用干设计算法的策略.非常与众不同。书中介绍了剪枝搜索、分摊分析、随机算法、在线算法以及多项式近似方案等相对较新的思想和众多基于分摊分析新开发的算法,每个算法都与实例一起加以介绍,而且每个例子都利用图进行详细解释。此外,本书还提供了超过400幅图来帮助初学者理解。本书适合作为高等院校算法设计与分析课程的高年级本科生和低年级研究生的教材,也可供相美科技人员和专业人七参考使用。一起来看看 《算法设计与分析导论》 这本书的介绍吧!