hdfs模块是Python提供的第三方模块,它提供了直接对Hadoop中HDFS操作的能力,hdfs模块是HDFS的API和命令行接口。
在使用hdfs模块需要安装hdfs,在Python中所有的第三方模块均采用pip安装,安装方式如下:pycharm终端执行,必须先将源切换为清华大学源,否则安装可能花费几十分钟
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/ pip install hdfs
安装好后就可以开始编程:
代码:
from hdfs import Client #从hdfs包中导入Client模块 #连接HDFS示例如下: class OperateHDFS(): def __init__(self): self.client = Client(url="http://192.168.31.100:50070") print("返回操作HDFS对象:", self.client) if __name__=='__main__': OperateHDFS()#实例化
出现对象Client相关信息,代表连接成功:
下面的代码使用hdfs模块执行hdfs常用操作:
一.创建目录(需确保集群中没有output目录)
错误提示:IndentationError: unindent does not match any outer indentation level
原因,代码含有其他字符,如制表符等,pycharm可以使用快捷键快捷键 CTRL+ALT+L格式化代码
代码:
from hdfs import Client # 从hdfs包中导入Client模块 # 连接HDFS示例如下: class OperateHDFS(): def __init__(self): self.client = Client(url="http://192.168.31.100:50070") print("返回操作HDFS对象:", self.client) def mkdir(self, hdfsPath): # 调用Client模块中的makedirs用于创建目录 # 需传递两个参数:路径,文件夹权限(可以省略,这里为了防止出现权限不足而导致各种问题,所以设置所有权限777) # makedirs支持创建递归目录,即多层目录 self.client.makedirs(hdfsPath, '777') if __name__ == '__main__': hdfs = OperateHDFS() # 实例化 hdfs.mkdir("/output/test/test2")
运行报错:
原因:
1.根目录下已存在output目录,如果已存在删除后再执行
2.当前的用户没有权限访问集群(Permission denied: user=dr.who)
到集群中对目录设置权限:
[root@slave1 ~]# hadoop fs -ls / Found 4 items drwxr-xr-x - root supergroup 0 2023-04-19 01:18 /hbase drwxr-xr-x - root supergroup 0 2023-04-19 06:58 /input
通过ls命令可以看到,集群根目录下文件,当前用户权限:rwx 组用户权限:r-x 其他用户权限:r-x
修改权限为777
[root@slave1 ~]# hadoop fs -chmod 777 /
再次执行,成功:
此时可以看到指定的路径已被创建:
[root@slave1 ~]# hadoop fs -ls -R /output drwxrwxrwx - dr.who supergroup 0 2023-05-01 00:27 /output/test drwxrwxrwx - dr.who supergroup 0 2023-05-01 00:27 /output/test/test2
二.上传文件
先在E盘创建一个文件:
修改windows的hosts文件,否则在上传文件到集群会报错:
ConnectionError: HTTPConnectionPool(host='slave2', port=50075):Max retries exceeded with url: /webhdfs/v1/home/temp/temp1/test.py?
打开C:\Windows\System32\drivers\etc
添加以下信息:
#hadoop
192.168.31.100 master
192.168.31.200 master2
192.168.31.101 slave1
192.168.31.102 slave2
192.168.31.103 slave3
代码:
from hdfs.client import Client client = Client("http://192.168.31.100:50070")#连接 print("hdfs根目录下有这些文件:",client.list("/"))#打印集群根目录有哪些文件 client.makedirs('/test', '777')#创建目录 print("hdfs /test目录下有这些文件:",client.list("/test"))#打印test目录中有哪些文件 client.upload('/test','E:/data.txt')#上传文件到hdfs的/test目录中 print("hdfs /test目录下有这些文件:",client.list("/test"))#上传文件后打印test目录文件信息
查看集群中文件是否上传成功:
[root@slave1 ~]# hadoop fs -ls /test Found 1 items -rwxr-xr-x 3 dr.who supergroup 49 2023-05-01 02:04 /test/data.txt [root@slave1 ~]# hadoop fs -cat /test/data.txt 我是Windows系统下,E盘下的test.txt文件
三.读取文件
代码:
from hdfs import Client client = Client("http://192.168.31.100:50070")#连接 # 官方文档的说法是client.read必须在with块里使用 #详细解释:read函数返回的是数据集,所以需要使用with语句来进行资源访问 with client.read('/test/data.txt') as obj: content = obj.read() #read返回的是字节码,decode用于将字节码转化为中文格式 print(content.decode('utf-8')) # for v in obj: # print(v.decode('utf-8'))
运行:
四.下载文件
在E盘新进一个download文件夹:
代码:
from hdfs import Client client = Client("http://192.168.31.100:50070")#连接 #下载文件 client.download("/test/data.txt","E:/download/data.txt")
运行:
此时文件已下载:
五.删除文件
代码:
from hdfs import Client client = Client("http://192.168.31.100:50070")#连接 #删除文件,参数True代表递归删除,用于删除子目录下所有文件 client.delete("/test",True)
执行:
此时集群中已无/test目录:
[root@slave1 ~]# hadoop fs -ls / Found 3 items drwxr-xr-x - root supergroup 0 2023-04-19 01:18 /hbase drwxrwxrwx - dr.who supergroup 0 2023-05-01 00:27 /output drwxrwxrwx - root supergroup 0 2023-04-18 08:04 /tmp
本文作者为BUG之神,转载请注明。