python操作hdfs

hdfs模块时python的一个第三方库,可以允许直接对hadoop的hdfs模块进行访问.

安装

安装hadoop

关于hadoop的安装配置会在另一篇文章中介绍,这里只介绍pythonhdfs库的安装.

安装hdfs库

所有python的三方模块均采用pip来安装.

pip install hdfs

hdfs库的使用

下面将介绍hdfs库的方法列表,并会与hadoop自带的命令行工具进行比较

注:hdfs dfs开头是hadoop自带的命令行工具命令

连接hadoop

通过http协议连接hadoopdatanode节点,默认端口50070

from hdfs.client import Client
client = Client("http://127.0.0.1:50070/")

注:为了节省篇幅,下面的所有代码片段默认包含上两行,此外,后续所有的hdfs指代hadoop的hdfs模块,而非python的hdfs库

list()

list()会列出hdfs指定路径的所有文件信息,接收两个参数

  • hdfs_path 要列出的hdfs路径
  • status 默认为False,是否显示详细信息
print("hdfs中的目录为:", client.list(hdfs_path="/",status=True))

查看hdfs根目录下的文件信息,等同于hdfs dfs -ls /

status()

查看文件或者目录状态,接收两个参数

  • hdfs_path 要列出的hdfs路径
  • strict 是否开启严格模式,严格模式下目录或文件不存在不会返回None,而是raise
print(client.status(hdfs_path="/b.txt",strict=True))

checksum()

checksum() 计算目录下的文件数量,只有一个参数.

print("根目录下的文件数量为:", client.checksum(hdfs_path="/input.txt"))

parts()

列出路径下的part file,接收三个参数

  • hdfs_path 要列出的hdfs路径
  • parts 要显示的parts数量 默认全部显示
  • status 默认为False,是否显示详细信息
print("", client.parts(hdfs_path="/log", parts=0, status=True))

content()

列出目录或文件详情,接收两个参数

  • hdfs_path 要列出的hdfs路径
  • strict 是否开启严格模式,严格模式下目录或文件不存在不会返回None,而是raise
print(client.content(hdfs_path="/",strict=True))

makedirs()

创建目录,同hdfs dfs -mkdirhdfs dfs -chmod的结合体,接收两个参数

  • hdfs_path hdfs路径
  • permission 文件权限
print("创建目录", client.makedirs(hdfs_path="/t", permission="755"))

rename()

文件或目录重命名,接收两个参数

  • hdfs_src_path 原始路径或名称
  • hdfs_dst_path 修改后的文件或路径
client.rename(hdfs_src_path="/d.txt",hdfs_dst_path="/d.bak.txt")

resolve()

返回绝对路径,接收一个参数hdfs_path

print(client.resolve("d.txt"))

set_replication()

设置文件在hdfs上的副本(datanode上)数量,接收两个参数,集群模式下的hadoop默认保存3份

  • hdfs_path hdfs路径
  • replication 副本数量
client.set_replication(hdfs_path="/b.txt",replication=2)

read()

读取文件信息 类似与 hdfs dfs -cat hfds_path,参数如下:

  • hdfs_path hdfs路径
  • offset 读取位置
  • length 读取长度
  • buffer_size 设置buffer_size 不设置使用hdfs默认100MB 对于大文件 buffer够大的化 sort与shuffle都更快
  • encoding 指定编码
  • chunk_size 字节的生成器,必须和encodeing一起使用 满足chunk_size设置即 yield
  • delimiter 设置分隔符 必须和encodeing一起设置
  • progress 读取进度回调函数 读取一个chunk_size回调一次
# 读取200长度
with client.read("/input.txt", length=200, encoding='utf-8') as obj:
    for i in obj:
        print(i)

# 从200位置读取200长度
with client.read("/input.txt", offset=200, length=200, encoding='utf-8') as obj:
    for i in obj:
        print(i)

# 设置buffer为1024,读取
with client.read("/input.txt", buffer_size=1024, encoding='utf-8') as obj:
    for i in obj:
        print(i)

# 设置分隔符为换行
p = client.read("/input.txt", encoding='utf-8', delimiter='\n')
with p as d:
    print(d, type(d), next(d))

# 设置读取每个块的大小为8
p = client.read("/input.txt", encoding='utf-8', chunk_size=8)
with p as d:
    print(d, type(d), next(d))

download()

hdfs下载文件到本地,参数列表如下.

  • hdfs_path hdfs路径
  • local_path 下载到的本地路径
  • overwrite 是否覆盖(如果有同名文件) 默认为Flase
  • n_threads 启动线程数量,默认为1,不启用多线程
  • temp_dir下载过程中文件的临时路径
  • **kwargs其他属性
print("下载文件结果input.txt:", client.download(hdfs_path="/input.txt", local_path="~/",overwrite=True))

等同 hdfs dfs copyToLocal /input ~/

upload()

上传文件到hdfs 同hdfs dfs -copyFromLocal local_file hdfs_path,参数列表如下:

  • hdfs_path, hdfs上位置
  • local_path, 本地文件位置
  • n_threads=1 并行线程数量 temp_dir=None, overwrite=True或者文件已存在的情况下的临时路径
  • chunk_size=2 ** 16 块大小
  • progress=None, 报告进度的回调函数 完成一个chunk_size回调一次 chunk_size可以设置大点 如果大文件的话
  • cleanup=True, 上传错误时 是否删除已经上传的文件
  • **kwargs 上传的一些关键字 一般设置为 overwrite 来覆盖上传
def callback(filename, size):
    print(filename, "完成了一个chunk上传", "当前大小:", size)
    if size == -1:
        print("文件上传完成")
        
# 上传成功返回 hdfs_path
client.upload(hdfs_path="/a_bak14.txt", local_path="a.txt", chunk_size=2 << 19, progress=callback,cleanup=True)

delete()

删除文件,接收三个参数

  • hdfs_path
  • recursive=False 是否递归删除
  • skip_trash=True 是否移到垃圾箱而不是直接删除 hadoop 2.9+版本支持
client.delete("/a.s")

等同hdfs dfs -rm (-r)

set_owner()

类似与 hdfs dfs -chown root root hdfs_path修改目录或文件的所属用户,用户组,接收三个参数

  • hdfs_path hdfs路径
  • owner 用户
  • group 用户组

注意:对于默认用户,只能修改自己的文件.

client.set_owner(hdfs_path="/a.txt", owner="root", group="root")

set_permission

修改权限,类似于hdfs dfs -chmod 777 hdfs_path,接收两个参数

  • hdfs_path hdfs路径
  • permission 权限
client.set_permission(hdfs_path="/b.txt",permission='755')

注意:对于默认用户,只能修改自己的文件.

set_acl()与acl_status()

查看和修改访问权限控制 需要开启acl支持

set_times()

设置文件时间,接收参数如下:

  • hdfs_path: hdfs路径.
  • access_time: 最后访问时间 时间戳 毫秒
  • modification_time: 最后修改时间 时间戳 毫秒
import time

client.set_times(hdfs_path="/b.txt", access_time=int(time.time())*1000,
                 modification_time=int(time.time())*1000)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容