前言
需要先安装hdfs库,pip install hdfs
一些报错
如果使用client.list()能显示目录下所有文件,但是不能读取文件的话需要在系统的host文件中配置主机与ip的映射
注意连接时是需要填完整的网址,不能只填IP,http://ip:端口
连接
首先导入,有三种连接方式from hdfs import Client, InsecureClient, TokenClient
一般使用Client和InsecureClient就够用了,区别就是一个不需要指定用户名,一个需要指定
client = Client(url="hdfs的ip地址:端口(50070)")
client = InsecureClient(url="hdfs的ip地址:端口(50070)", user="root")
之后所有的代码都是基于创建了client的情况下来写的
有一个坑需要注意,windows当中来操作的话,查找文件可以,但是写入却显示不能连接
很大程度上可能是因为没有在windows上的host文件配置虚拟机的ip和主机名的映射导致的
基础操作
# 查找指定目录下的所有文件夹及文件
client.list(hdfs_path="/")
# 创建文件夹,会递归创建文件夹
client.makedirs(hdfs_path="/user/user1/user2")
# 写入文件,如果不存在则创建并写入
client.write(hdfs_path="/user/x.txt", overwrite=True, data="写入的文字", encoding="utf-8")
# 1、overwrite表示以w的方式写入,会覆盖原有的文件
# 2、append表示以a的方式写入,在原有的基础上追加文件内容
# 3、如果以上两个参数都不指定,文件存在的时候会抛出一个异常,不存在就不会
# 4、注意指定encoding="utf-8",不然编码错误
# 读取文件
with client.read(hdfs_path="/user/x.txt") as f:
print(f.data.decode("utf-8"))
# 删除文件
client.delete("/user", recursive=True)
# 1、recursive=True表示递归删除文件夹,如果文件夹下有文件的话不加这个会报错
# 重命名文件夹
client.rename("old_name", "new_name")
# 1、不能重命名文件
# 上传文件
client.upload("hdfs_path", "local_path",cleanup=True)
# 1、如果local_path本地文件夹没有文件的话会抛出异常不让上传
# 2、cleanup参数为如果传入文件的过程中出现了错误的话那么本次上传的文件全部会取消上传
# 3、可以选择overwrite=True覆盖文件
# 下载文件
client.download("hdfs_path", "local_path",overwrite=True)
# 1、下载的路径下没有文件会抛出异常
# 1、overwrite=True下载的时候会覆盖原有的目录
其他
最后是不需要关闭hdfs的