1.前言

hdfs , Hadoop Distributed File System。Hadoop的分布式文件系统,安全行和扩展性没得说。

访问HDFS的方式有以下几种:

  1. 命令行方式:FS Shell
  2. 编程方式:FileSystem Java API,libhdfs(c语言)
  3. REST API : WebHDFS, HttpFs
  4. 把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.环境建立

  1. Hadoop 使用已有的CDH 5.6.1 环境
  2. 安装 hdfs,最新版本是0.2.1。

pip install hdfs

3. ipython, 可选但强烈建议。

3.示例代码

  1. 创建目录并写文件

#!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的更多相关文章

  1. 使用Python访问HDFS

    最近接触到大数据,对于Skpark和Hadoop的料及都停留在第一次听到这个名词时去搜一把看看大概介绍免得跟不上时代的层次. 在实际读了点别人的代码,又自己写了一些之后,虽然谈不上理解加深,至少对于大 ...

  2. python读取hdfs上的parquet文件方式

    在使用python做大数据和机器学习处理过程中,首先需要读取hdfs数据,对于常用格式数据一般比较容易读取,parquet略微特殊.从hdfs上使用python获取parquet格式数据的方法(当然也 ...

  3. 2.如何使用python连接hdfs

    总所周知,python是一门很强大的语言,主要在于它有着丰富的第三方模块,当然连接hdfs的模块也不例外. 在python中有一个模块也叫hdfs,可以使用它连接hadoop的hdfs.直接pip i ...

  4. windows通过thrift访问hdfs

    thirift是一个支持跨种语言的远程调用框架,通过thrift远程调用框架,结合hadoop1.x中的thriftfs,编写了一个针对hadoop2.x的thriftfs,供外部程序调用. 1.准备 ...

  5. Python访问sqlite3数据库取得dictionary的正路!

    [引子] 很多人都知道,Python里是内置了很好用的sqlite3的.但这个库有个缺陷,在执行fetchall()/fetchone()等方法后,得到的是一个tuple.以前吧,做自己的小项目,tu ...

  6. 通过Thrift访问HDFS分布式文件系统的性能瓶颈分析

    通过Thrift访问HDFS分布式文件系统的性能瓶颈分析 引言 Hadoop提供的HDFS布式文件存储系统,提供了基于thrift的客户端访问支持,但是因为Thrift自身的访问特点,在高并发的访问情 ...

  7. 利用JavaAPI访问HDFS的文件

    body{ font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI& ...

  8. Hadoop(五)搭建Hadoop与Java访问HDFS集群

    前言 上一篇详细介绍了HDFS集群,还有操作HDFS集群的一些命令,常用的命令: hdfs dfs -ls xxx hdfs dfs -mkdir -p /xxx/xxx hdfs dfs -cat ...

  9. Hadoop(八)Java程序访问HDFS集群中数据块与查看文件系统

    前言 我们知道HDFS集群中,所有的文件都是存放在DN的数据块中的.那我们该怎么去查看数据块的相关属性的呢?这就是我今天分享的内容了 一.HDFS中数据块概述 1.1.HDFS集群中数据块存放位置 我 ...

随机推荐

  1. MFC控件:listctrl使用方法总结

    以下未经说明,listctrl默认view 风格为report 相关类及处理函数 MFC:CListCtrl类 SDK:以 “ListView_”开头的一些宏.如 ListView_InsertCol ...

  2. Linux系统查看网站访问日志

    日志地址 /www/wwwlogs/网站名称-access_log 下载到本地,改成txt文件 打开WPS,创建表格,导入数据,选择文件,然后点击下一步,直到选择文件类型时,选择分隔符号,下一步,把勾 ...

  3. TCP协议怎么关闭?

    TCP协议是一个面向连接的传输层协议,那如果避免遭到破坏,该怎样正确关闭呢?一般正常关闭TCP连接是采用四次挥手机制,其实主体就两个,客户端和服务器交互传递,且连续四次,传递的东西是FIN数据包和AC ...

  4. 51Nod 1098 最小方差 (数论)

    #include <iostream> #include <cstdio> #include <algorithm> using namespace std; ty ...

  5. 51Nod 1134 最长递增子序列(动态规划O(nlogn))

    #include <iostream> #include <algorithm> #include <stdio.h> #define MAXN 50010 usi ...

  6. 前端开发 - Emmet使用手册

    Emmet (前身为 Zen Coding) 是一个能大幅度提高前端开发效率的一个工具: 基本上,大多数的文本编辑器都会允许你存储和重用一些代码块,我们称之为"片段".虽然片段能很 ...

  7. ios wkwebview同步cookie ajax请求偶尔异常问题

    let config = WKWebViewConfiguration.init() config.preferences = WKPreferences.init() config.preferen ...

  8. python操作rabbitmq实现消息过滤接收

    目标: 代码实现(direct_product.py) # __author__ = 'STEVEN' import pika,sys #开启socket connection = pika.Bloc ...

  9. Debug和Release版本区别

    Debug和Release版本区别 众所周知,我们尽心iOS开发,在Xocde调试程序时,分为两种方式Debug和Release,在Target的Setting中相信大家应该能看到很多选项分别为Deb ...

  10. win 7启动tensorboard的详尽步骤

    TensorBoard是TensorFlow下的一个可视化的工具,能够帮助我们在训练大规模神经网络过程中出现的复杂且不好理解的运算.TensorBoard能展示你训练过程中绘制的图像.网络结构等. 1 ...