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. [Xcode 实际操作]八、网络与多线程-(4)使用UIApplication对象发送短信

    目录:[Swift]Xcode实际操作 本文将演示如何使用应用程序单例对象,发送短信的功能. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 注:需要使用真机进行测 ...

  2. Modulation of Lipid Metabolism by Celastrol (文献分享一组-赵倩倩)

    文献名:Modulation of Lipid Metabolism by Celastrol (雷公藤红素对脂质代谢调节作用的研究) 期刊名:Journal of Proteome Research ...

  3. assembly x86(nasm)修改后的日常

    data segment ENG db 'SUNdayS Coming I Wanna Drive My Car,SUN,SUN$' ;9,3 sun1 db 'SUN' swcount db 0ah ...

  4. linux安装odbc for mysql

    1 安装驱动包 yum install unixODBC-devel -y yum install -y mysql-connector-odbc 2 配置数据源 [root@omserver-11 ...

  5. C#项目中的bin目录和obj目录的区别

    C#项目中的bin目录和obj目录的区别 1.关于bin目录和obj目录 Bin目录用来保存项目生成后程序集,它有Debug和Release两个版本,分别对应的文件夹为bin/Debug和bin/Re ...

  6. Java之file操作

    File类既可以表示文件,也可以表示为文件夹 文件的创建.删除.重命名 1.文件的创建 File file=new File("new Hello.txt");//当前工程目录下 ...

  7. Java GUI 事件监听

    现在使用的仍是AWT的事件模型.涉及到3类对象: Event Source:事件源,即事件发生所在的组件 Event:事件,封装了此次事件的相关信息 Event Listener:事件监听器,监听事件 ...

  8. java定时读取文件

    在项目中经常会用到定时器,在笔试或者面试中也会经常问到定时器和IO流. public class TimerDemo { public static void main(String[] args) ...

  9. 20170308web作业1

    代码20170308001: <%@ page language="java" import="java.util.*" pageEncoding=&qu ...

  10. 声明已被否决 VS C++

    error C4996声明已被否决,不止一次碰到这个问题,在这里必须mark一下! 尝试这个1.Project Properties > Configuration Properties > ...