python hdfs模块

BUG之神 120

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

 

python hdfs模块 python 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相关信息,代表连接成功:

python hdfs模块

下面的代码使用hdfs模块执行hdfs常用操作:

一.创建目录(需确保集群中没有output目录)

错误提示:IndentationError: unindent does not match any outer indentation level

python hdfs模块

原因,代码含有其他字符,如制表符等,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")

运行报错:

python hdfs模块

原因:

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 /

再次执行,成功:

python hdfs模块

此时可以看到指定的路径已被创建:

[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盘创建一个文件:

python hdfs模块

修改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

python hdfs模块

代码:

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目录文件信息

 

python hdfs模块

查看集群中文件是否上传成功:

[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'))

运行:

python hdfs模块

四.下载文件

在E盘新进一个download文件夹:

python hdfs模块

代码:

from hdfs import Client
client = Client("http://192.168.31.100:50070")#连接
#下载文件
client.download("/test/data.txt","E:/download/data.txt")

运行:

python hdfs模块

此时文件已下载:

python hdfs模块


五.删除文件

代码:

from hdfs import Client
client = Client("http://192.168.31.100:50070")#连接
#删除文件,参数True代表递归删除,用于删除子目录下所有文件
client.delete("/test",True)

执行:

 

python hdfs模块

此时集群中已无/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

 


 

分享