【转】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集群中数据块存放位置 我 ...
随机推荐
- 一个例子读懂 JS 异步编程: Callback / Promise / Generator / Async
JS异步编程实践理解 回顾JS异步编程方法的发展,主要有以下几种方式: Callback Promise Generator Async 需求 显示购物车商品列表的页面,用户可以勾选想要删除商品(单选 ...
- 简单重载运算符in priority_queue By cellur925
我们都知道priority_queue是大根堆. 一.变成小根堆 法一:把元素的相反数丢进堆中 法二 priority_queue<int,vector<int>,greater&l ...
- bzoj2825:[AHOI2012]收集资源
传送门 看到数据范围这么小,就没想过暴力的办法么 考虑肯定是从近走到远,所以走的点之间一定没有其他的点,所以我们就可以暴力的建图,然后暴力的去dfs就好了 代码: #include<cstdio ...
- Zju1610 Count the Colors(lazy标记详解)
Description 画一些颜色段在一行上,一些较早的颜色就会被后来的颜色覆盖了. 你的任务就是要数出你随后能看到的不同颜色的段的数目. Input 每组测试数据第一行只有一个整数n, 1 < ...
- day04 基本类型包装类
- iOS 同一个View识别单击和双击手势
1.给View添加手势 //view添加两个手势检测方法 self.currentPlayerView.userInteractionEnabled = YES; UITapGestureRecogn ...
- JSON对象 JSON字符串 JSON数组
JSON对象: var str2 = { "name" : "andy", "gender" : "man" , &q ...
- python之函数名,闭包、迭代器
一.函数名的运用(第一类对象) 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量. 1,函数名的内存地址: def func(): print("呵呵") pr ...
- 安卓Listview 不规则项即不同item的运行
在安卓中,listview 的item 是一个不断被轮询调换位置的过程,这样 即 图片参考地址 http://www.cnblogs.com/mybkn/archive/2012/05/23/2 ...
- Unity AssetBundle笔记
1.入门: Resources:表示U3D自动将资源打成一个AssetBundle包,所有放在Resources下的文件夹都会打成一个AssetBundle包,资源非常大,Resources文件夹在真 ...