此次使用python的hdfs库操作HDFS,首相安装该库:pip install hdfs
其次,要保证HDFS可用,如下图就代表可用,当然你列出的文件和我的不同
老规矩,先来看看它这个库的大概结构,方便以后调用。先 import hdfs
,然后跟进hdfs库,查看定义它的地方。如下,既然是连接的库,那么这个client就是连接的客户端了,这里出现了三个client,它们有什么不同
首先是Client类,转到定义处之后,可以发现它里面有很多操作,基本的增删查改都有了,看它的 __init__
方法,里面有url远程连接地址,但没有用户名的参数,HDFS像也是一种文件系统,也支持权限管理,如果对文件指定了权限,那么使用该类就会失败
然后是InsecureClient(不安全的客户端),如下图,InsecureClient类只有一个__init__
方法,但是它继承了Client类,所以它可以拥有Client类的所有方法,并且它的__init__
方法中有user参数,可以指定用户名
最后是TokenClient(令牌客户端),如下图。其结构和InsecureClient基本差不多,只是将user参数改为token,至于token是什么。
额……额……额……我猜测,应该,和Web的token差不多,使用一段字符串短暂代表本次会话,当然这段字符串是由服务端产生的,拥有这段字符串就代表本次的客户端是可信任的,额,这是我猜的,别当真。
为了正常运行,本次远程连接调用InsecureClient类。
连接操作
from hdfs import InsecureClient
lian = InsecureClient(url='http://192.168.31.224:9870', user='zhong') # 指定远程地址,和用户名
print(lian.list('/')) # 列出根目录下的所有文件
增
# 增加文件夹
from hdfs import InsecureClient
lian = InsecureClient(url='http://192.168.31.224:9870', user='zhong')
lian.makedirs('/niubi') # 在根目录下创建一个文件夹,名字叫做niubi
print(lian.list('/'))
# 增加文件/写文件
from hdfs import InsecureClient
lian = InsecureClient(url='http://192.168.31.224:9870', user='zhong')
lian.write(hdfs_path='/niubi/shang', overwrite=True, data='世界你好,我来了'.encode('utf-8')) # 在/niubi/目录下面创建名字为shang的文件,里面写入数据“世界你好,我来了”。注意,数据要使用utf-8编码才行,该方法还有一个要注意的参数,append参数用于说明要不要覆盖已有的内容,默认为False,即在尾部添加。overwrite参数指明如果文件已经存在时的操作,True表示覆盖,False时如果文件已存在就抛异常
print(lian.list('/niubi'))
# 上传文件
from hdfs import InsecureClient
lian = InsecureClient(url='http://192.168.31.224:9870', user='zhong')
lian.upload(hdfs_path='/', local_path='C:/Users/gzsqy/Desktop/Git.md') # 注意目录使用的是正斜杠/,而不是反斜杠\
print(lian.list('/'))
查
# 查文件夹
from hdfs import InsecureClient
lian = InsecureClient(url='http://192.168.31.224:9870', user='zhong')
print(lian.list('/')) # 查看根目录下的所有文件夹
# 查看文件是否存在
from hdfs import InsecureClient
lian = InsecureClient(url='http://192.168.31.224:9870', user='zhong')
print(lian.status(hdfs_path='/Git.mds', strict=False)) # strict如果设置为True时,文件不存在就会抛出异常,如果为False文件不存在就会返回None。如果文件存在,不管设置了什么都会返回改文件的block信息
# 查看文件的内容
from hdfs import InsecureClient
lian = InsecureClient(url='http://192.168.31.224:9870', user='zhong')
with lian.read('/niubi/shang') as f: # read方法返回的是上下文管理器对象,所以要使用with调用
print(f.data.decode('utf-8')) # 返回的数据放在read函数的data变量里面,并且存储的是utf-8的编码,所以要转码才能看到中文,当然,英文不用转码
read函数有几个参数要注意
- offset:指定开始读取的偏移量
- length:指定读取的长度,默认读取文件所有内容。如果文件内容太大,比如几个G的大小,后果你懂得。
- buffer_size:缓冲区大小
- chunk_size:该值有三种情况(也可以说是两种)
- 该值默认为0,执行函数后返回的结果是一个上下文管理器对象。
- 如果设置为正值如1,那么就会在结果的上下文管理器对象中使用生成器的方式返回文件内容
from hdfs import InsecureClient
lian = InsecureClient(url='http://192.168.31.224:9870', user='zhong')
with lian.read('/xiaomi.txt', chunk_size=1) as f:
for i in f:
print(i)
- 第三情况要参考另一个参数delimiter,在上下文管理器中将返回结果切割
- delimiter:用于指定分隔符。比如csv格式的文件使用半角的逗号作为分隔符
删
# 删除文件
from hdfs import InsecureClient
lian = InsecureClient(url='http://192.168.31.224:9870', user='zhong')
print('删除前:', lian.list('/niubi'))
lian.delete('/niubi/shang') # 指定要删除的文件位置
print('删除后:', lian.list('/niubi'))
# 删除文件夹
from hdfs import InsecureClient
lian = InsecureClient(url='http://192.168.31.224:9870', user='zhong')
print('删除前:', lian.list('/'))
lian.delete('/niubi') # 指定要删除的文件夹位置
print('删除后:', lian.list('/'))
改
# 重命名文件夹
from hdfs import InsecureClient
lian = InsecureClient(url='http://192.168.31.224:9870', user='zhong')
lian.makedirs('/niubi') # 上一步删除了文件夹,这里再新建回来
print('重命名前:', lian.list('/'))
lian.rename('/niubi', '/niniubi') # 旧文件夹名称位置,新文件夹名称位置
print('重命名后:', lian.list('/'))
下载文件
from hdfs import InsecureClient
lian = InsecureClient(url='http://192.168.31.224:9870', user='zhong')
# lian.write(hdfs_path='/niniubi/shang', overwrite=True, data='世界你好,我来了'.encode('utf-8'))
lian.download(hdfs_path='/niniubi/shang', overwrite=True, local_path='C:/Users/gzsqy/Desktop/')