玩蛇的正确姿势

python操作hdfs

2019-08-19  本文已影响0人  我傻笑你跑掉

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指定路径的所有文件信息,接收两个参数

print("hdfs中的目录为:", client.list(hdfs_path="/",status=True))

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

status()

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

print(client.status(hdfs_path="/b.txt",strict=True))

checksum()

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

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

parts()

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

print("", client.parts(hdfs_path="/log", parts=0, status=True))

content()

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

print(client.content(hdfs_path="/",strict=True))

makedirs()

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

print("创建目录", client.makedirs(hdfs_path="/t", permission="755"))

rename()

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

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份

client.set_replication(hdfs_path="/b.txt",replication=2)

read()

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

# 读取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下载文件到本地,参数列表如下.

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,参数列表如下:

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()

删除文件,接收三个参数

client.delete("/a.s")

等同hdfs dfs -rm (-r)

set_owner()

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

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

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

set_permission

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

client.set_permission(hdfs_path="/b.txt",permission='755')

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

set_acl()与acl_status()

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

set_times()

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

import time

client.set_times(hdfs_path="/b.txt", access_time=int(time.time())*1000,
                 modification_time=int(time.time())*1000)
上一篇 下一篇

猜你喜欢

热点阅读