【转】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集群中数据块存放位置 我 ...
随机推荐
- liteos任务(二)
任务 1 基本概念 从系统的角度看,任务是竞争系统资源的最小运行单元.任务可以使用或等待CPU.使用内存空间等系统资源,并独立于其它任务运行. Huawei LiteOS的任务模块可以给用户提供多个任 ...
- RXSwift01
//创建 Observable 序列 func createObservable(){ /* let observable = Observable<Int>.just(5) let ob ...
- HDU2222【AC自动机(基础·模板)】
Frist AC zi dong ji(Aho-Corasick Automation) of life #include <bits/stdc++.h> using namespace ...
- Lightoj1003【判环操作】
题意: 对于n个给出字符串a,b,理解成a在b之前办好这个事情,要求n个给出两个串,a都要在b之前完成: 题意: 所以一旦出现环就不行了: 以前在写最短路的时候,spfa就有一个判环,后来写着写着写到 ...
- IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie常用方法
以下是在Servlet中操作Cookie时可使用的有用的方法列表 ● public void setDomain(String pattern) 该方法设置cookie适用的域,例如 itxdl.c ...
- 大数据技术之_27_电商平台数据分析项目_02_预备知识 + Scala + Spark Core + Spark SQL + Spark Streaming + Java 对象池
第0章 预备知识0.1 Scala0.1.1 Scala 操作符0.1.2 拉链操作0.2 Spark Core0.2.1 Spark RDD 持久化0.2.2 Spark 共享变量0.3 Spark ...
- Nginx 405 not allowed最简单快速解决办法
Apache.IIS.Nginx等绝大多数web服务器,都不允许静态文件响应POST请求,否则会返回“HTTP/1.1 405 Method not allowed”错误. server { list ...
- 分布式通信-tcp/ip 广播
服务端 /** * 广播 */ public class MulticastServer { public static void main(String[] args) { try { //地址是2 ...
- self.tabBarController.selectedIndex
KindViewController *vc =((UINavigationController *) [self.tabBarController viewControllers][]).viewC ...
- JQuery基础知识梳理篇
这周没事,优化线上项目,因为前端都在赶项目,我又若菜.于是前端数据展示也要自己来.看javascript看到吐,决定梳理一下Jquery基础知识.敲黑板) 闲扯结束,进入正题. 选择器 介绍 jque ...