【转】Python 访问 HDFS
1.前言
hdfs , Hadoop Distributed File System。Hadoop的分布式文件系统,安全行和扩展性没得说。
访问HDFS的方式有以下几种:
- 命令行方式:FS Shell
- 编程方式:FileSystem Java API,libhdfs(c语言)
- REST API : WebHDFS, HttpFs
- 把HDFS mount成本地文件目录
使用python访问HDFS比较容易:
- python 封装FS Shell, 这种方式本地必须部署了Hadoop 的 FS Shell。
- 使用python调用libhdfs,如果善于python和C语言可以采用此种方式,libhdfs是标准API的子集,有一些功能不能实现,网上有人说libhdfs比较坑
- python 封装REST API,支持windows环境
- 已有模块phdfs (封装了WebHDFS),支持windows环境,类似的python模块还有HdfsCLI、webpyhdfs,pyhdfs
- snakebite,纯python hdfs client,使用了protobuf 和 hadoop rpc。
这里主要介绍使用hdfs 访问HDFS,支持python 2.7和 python 3
文档地址: hdfs 2.1.0
2.环境建立
- Hadoop 使用已有的CDH 5.6.1 环境
- 安装 hdfs,最新版本是0.2.1。
pip install hdfs
3. ipython, 可选但强烈建议。
3.示例代码
- 创建目录并写文件
#!c:\python27\python.exe
# -*- coding: UTF- -*-
import traceback
from hdfs import InsecureClient
import time
import sys
from numpy import true_divide
reload(sys)
sys.setdefaultencoding("utf-8") try:
root_path = "/"
#获取客户端,并且指定登陆用户,如果使用Client创建客户端就不能指定用户了
c = InsecureClient(url="http://172.16.21.22:50070",user='hdfs',root=root_path)
#创建目录
c.makedirs('/user/root/pyhdfs')
#写文件
#第一个参数:文件路径
#第二个参数:文件内容
#第三个参数:是否覆盖已有的文件,如果不覆盖,且文件已经存在会抛出异常
c.write('/user/root/pyhdfs/1.log',time.asctime(time.localtime(time.time())) + '\n',True) #下载文件
#第一个参数,hdfs路径
#第二个参数,本地路径
#第三个参数,是否覆盖本地文件
c.download('/user/root/pyhdfs/1.log', '.', True) #上传文件
#第一个参数,hdfs路径
#第二个参数,本地路径
#第三个参数,是否覆盖hdfs已有的文件
c.upload('/user/root/pyhdfs/', './pyhdfs_example.py', True) #获取目录下的的文件列表,第一个参数:hdfs路径,第二个参数是否获取文件的状态数据
#另外pyhdfs 有一个walk函数 c.walk(hdfs_path, depth, status)
#用法和os.walk类似,遍历目录非常好用
hdfs_files = c.list('/user/root/pyhdfs', True)
for f in hdfs_files:
print f
#输出结果如下
#(u'1.log', {u'group': u'supergroup', u'permission': u'', u'blockSize': , u'accessTime': 1519459768533L, u'pathSuffix': u'1.log', u'modificationTime': 1519459768569L, u'replication': , u'length': , u'childrenNum': , u'owner': u'hdfs', u'storagePolicy': , u'type': u'FILE', u'fileId': })
#(u'pyhdfs_example.py', {u'group': u'supergroup', u'permission': u'', u'blockSize': , u'accessTime': 1519459768683L, u'pathSuffix': u'pyhdfs_example.py', u'modificationTime': 1519459768711L, u'replication': , u'length': , u'childrenNum': , u'owner': u'hdfs', u'storagePolicy': , u'type': u'FILE', u'fileId': }) #返回文件的summary信息,算法是MD5-of-0MD5-of-512CRC32C
#可以使用
#返回结果:{u'spaceConsumed': , u'quota': -, u'spaceQuota': -, u'length': , u'directoryCount': , u'fileCount': }
print c.content('/user/root/pyhdfs/pyhdfs_example.py') #返回的是md5的checksum
#结果:{u'length': , u'bytes': u'0000020000000000000000005506d1dae3da4073662038f2392c08b700000000', u'algorithm': u'MD5-of-0MD5-of-512CRC32C'}
#本地文件的checksum生成:hadoop fs -checksum /abc.txt
print c.checksum('/user/root/pyhdfs/pyhdfs_example.py')
#删除文件,第一个参数hdfs路径,第二参数,是否递归删除
c.delete('/user/root/pyhdfs/', True) except Exception , ex:
print traceback.format_exc()
4.其他hdfs Client api
- resolve(hdfs_path) , 返回hdfs绝对路径
- status(hdfs_path,strict=True) 返回文件或者目录的状态
- acl_status(hdfs_path, strict=True), 返回acl的状态
- set_acl(hdfs_path, acl_spec, stict=True), 设置acl
- parts(hdfs_path, parts=None, status=False) ?
- read(hdfs_path, offset=0, length=None, buffer_size=None)
- rename(hdfs_src_path, hdfs_dest_path), 重命名
- set_owner(hdfs_paht, owner=None, group=None)
- set_permission(hdfs_path, permission)
- set_times(hdfs_path, access_time=None, modification_time=None)
- set_replication(hdfs_path, replication), 设置文件的副本数量, 只能设置文件,不能设置目录,否则会由异常
- walk(hdfs_path, depth=0, status=False), 类似 os.walk
上面都是基于 HDFS WEBAPI 进行的操作,记录一下。
Reference:
https://zhuanlan.zhihu.com/p/33983161 python访问HDFS
【转】Python 访问 HDFS的更多相关文章
- 使用Python访问HDFS
最近接触到大数据,对于Skpark和Hadoop的料及都停留在第一次听到这个名词时去搜一把看看大概介绍免得跟不上时代的层次. 在实际读了点别人的代码,又自己写了一些之后,虽然谈不上理解加深,至少对于大 ...
- python读取hdfs上的parquet文件方式
在使用python做大数据和机器学习处理过程中,首先需要读取hdfs数据,对于常用格式数据一般比较容易读取,parquet略微特殊.从hdfs上使用python获取parquet格式数据的方法(当然也 ...
- 2.如何使用python连接hdfs
总所周知,python是一门很强大的语言,主要在于它有着丰富的第三方模块,当然连接hdfs的模块也不例外. 在python中有一个模块也叫hdfs,可以使用它连接hadoop的hdfs.直接pip i ...
- windows通过thrift访问hdfs
thirift是一个支持跨种语言的远程调用框架,通过thrift远程调用框架,结合hadoop1.x中的thriftfs,编写了一个针对hadoop2.x的thriftfs,供外部程序调用. 1.准备 ...
- Python访问sqlite3数据库取得dictionary的正路!
[引子] 很多人都知道,Python里是内置了很好用的sqlite3的.但这个库有个缺陷,在执行fetchall()/fetchone()等方法后,得到的是一个tuple.以前吧,做自己的小项目,tu ...
- 通过Thrift访问HDFS分布式文件系统的性能瓶颈分析
通过Thrift访问HDFS分布式文件系统的性能瓶颈分析 引言 Hadoop提供的HDFS布式文件存储系统,提供了基于thrift的客户端访问支持,但是因为Thrift自身的访问特点,在高并发的访问情 ...
- 利用JavaAPI访问HDFS的文件
body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...
- Hadoop(五)搭建Hadoop与Java访问HDFS集群
前言 上一篇详细介绍了HDFS集群,还有操作HDFS集群的一些命令,常用的命令: hdfs dfs -ls xxx hdfs dfs -mkdir -p /xxx/xxx hdfs dfs -cat ...
- Hadoop(八)Java程序访问HDFS集群中数据块与查看文件系统
前言 我们知道HDFS集群中,所有的文件都是存放在DN的数据块中的.那我们该怎么去查看数据块的相关属性的呢?这就是我今天分享的内容了 一.HDFS中数据块概述 1.1.HDFS集群中数据块存放位置 我 ...
随机推荐
- euler证明
我们用g(x)表示x的欧拉函数值,即1~x与x互质的数的个数 欧拉函数公式为: g(x)= y*((x1-1)/x1)*((x2-1)/x2)*((x3-1)/x3)....(其中x1, x2, x3 ...
- [Xcode 实际操作]七、文件与数据-(15)单例模式的使用
目录:[Swift]Xcode实际操作 本文将演示单例对象的使用. 在项目名称上点击鼠标右键,弹出右键菜单,选择[New File]新建文件命令, 在弹出的模板选项窗口中,选择[Swift]文件选项, ...
- [Xcode 实际操作]八、网络与多线程-(24)社会化分享功能开发包的安装和配置:微信、QQ、微博
目录:[Swift]Xcode实际操作 本文将演示如何在开放平台注册应用,并获得相关的密钥信息,用于实现后面文章的微博分享功能. 一.新浪微博开放平台 [登录]->[微服务]->[粉丝服务 ...
- 实现easyui combobox中textField字段的拼接
开发过程中遇到这样的一个需求: 从后台得到的两个字段aa.bb拼接为一个字段aabb显示在easyui combobx的下拉选项中. 实现方法: 利用formatter属性定义如何呈现行: 页面代码: ...
- hadoop HA集群搭建(亲测)
1.hadoop-env.sh 2.core-site.xml <configuration> <!-- 指定hdfs的nameservice为ns1 --> <prop ...
- 开车旅行 【NOIP2012 D1T3】
开车旅行 [NOIP2012 D1T3] 倍增 首先令\(a[i]\)表示从i出发最近的城市下标,\(b[i]\)表示从i出发第二近的城市下标 可以维护一个\(\text{set<pair< ...
- POJ-3275:Ranking the Cows(Floyd、bitset)
Ranking the Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 3301 Accepted: 1511 ...
- 在b站做计网实验 - 抓包/get/post
前言 这篇博文是一个小实验,用python发送get/post请求,其中用到cookie登录bilibili网站并修改个人信息. 抓包 对HTTP应用而言,用浏览器自带的插件可以很方便做到抓包,比如c ...
- C51 笔记
一 关于宏常量的长度:C51中定义一个常数宏(默认是16位的),如果用宏表示一个32位的宏而不加'L'标志的话就会出错.如 #define BLOCK_A_BASEADDR 18*64*1024 / ...
- java transient关键字作用,使用场景
transient的作用及使用方法,官方解释为: Variables may be marked transient to indicate that they are not part of the ...