暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

python操作hdfs文件系统的常规方法

大家都爱涨姿势 2019-07-29
1598

一、前言

HDFS是hadoop分布式文件系统的缩写和简称,被设计为可在通用廉价的硬件设备上运行的分布式文件系统,HDFS提供了高吞吐量的数据操作,因而被广泛使用在大数据集的存储与处理上。python通过hdfs库即可实现对hdfs文件系统的简单操作,减少大数据开发或者分析者对hadoop开发环境的过多依赖,可快速的推动业务分析的工作。


二、环境准备

·操作系统

操作系统采用的是centOS7,安装方法不再赘述

[root@master code]# cat etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

·python

python版本选择3.6.5,安装方法不再赘述

[root@master code]# python
Python 2.7.5 (default, Aug  4 2017, 00:39:18)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

·hadoop

hadoop版本号是2.8.4,hive版本号是2.3.4,安装方法不再这里赘述

三、整体思路

 

四、具体操作

·安装hdfs库

在命令行,使用pip命令安装,我这里pip名称设置为了pip3,输入命令即可:pip3 install hdfs

·在python代码中载入hdfs库

只要在代码行增加from hdfs import *,即可载入hdfs下的所有库类

[root@master local]# python3
Python 3.6.5 (default, Jul 25 2019, 11:31:27)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from hdfs import *

>>>

·连接hdfs

所谓的连接,其本质是基于hdfs的库类,创建一个名为client的hdfs对象,该对象在初始化的时候,给定了要连接的hdfs路径;

[root@master local]# python3
Python 3.6.5 (default, Jul 25 2019, 11:31:27)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from hdfs import *
>>> client=Client('http://master:50070')

>>>

代码说明:

-client:定义的hdfs对象

-Client:是hdfs库类中创建对象的方法名,方法是Client(hdfspath)

-http://master:50070是所要连接的hdfs的路径

·基本操作

在代码中创建了对象,并连接了hdfs文件系统,则可进行正常操作。

1、查看文件状态

通过client.status(hdfs_path,strict=False)函数获得文件路径的详细信息。

>>> print(client.status('/usr/local/hive/warehouse/'))
{'accessTime': 0, 'blockSize': 0, 'childrenNum': 1, 'fileId': 16395, 'group': 'supergroup', 'length': 0, 'modificationTime': 1564293626279, 'owner': 'root', 'pathSuffix': '', 'permission': '777', 'replication': 0, 'storagePolicy': 0, 'type': 'DIRECTORY'}

2、创建目录

通过client.makedirs(hdfs_path,permission=755)来创建目录,这里我们在hdfs目录下创建一个zzs目录

>>> client.makedirs('/usr/local/hive/warehouse/zzs/',permission=755)

再用hadoop命令查zzs目录是否已经存在了

[root@master ~]# hadoop fs -ls usr/local/hive/warehouse/

Found 2 items
drwxrwxrwx   - root   supergroup          0 2019-07-28 05:57 usr/local/hive/warehouse/test
drwxr-xr-x   - dr.who supergroup          0 2019-07-28 11:05 usr/local/hive/warehouse/zzs

需要注意的是,创建目录需要权限,首先要保证hdfs目录有创建目录的权限,如果提示权限不足,则用hadoop命令先给hdfs目录赋权

hadoop fs -chmod -R 755 /user/local/hive/warehouse/

3、上传数据

通过client.upload(hdfs_file_path,upload_source_path,cleanup=True)函数上传文件到hdfs

首先在本地新建一个文件new_file.txt,内容为"1,apple",然后使用命令将其上传

>>>client.upload('/usr/local/hive/warehouse/zzs/','/root/code/new_file.txt',cleanup=True)
'/usr/local/hive/warehouse/zzs/new_file.txt'

>>>

再用hadoop命令检查是否上传成功

[root@master code]# hadoop fs -ls usr/local/hive/warehouse/zzs
Found 1 items
-rwxr-xr-x   3 dr.who supergroup          8 2019-07-28 11:28 usr/local/hive/warehouse/zzs/new_file.txt

[root@master code]#

再查看下文件里面的内容

[root@master code]# hadoop fs -cat usr/local/hive/warehouse/zzs/new_file.txt
1,apple

4、删除文件

通过client.delete(hdfs_file_path)函数删除hdfs上的文件

>>>client.delete('/usr/local/hive/warehouse/zzs/new_file.txt')
True
>>>
删除成功后返回True

5、下载数据

通过client.download(hdfs_file_path,dst_path,overwrite=True)函数下载hdfs文件

>>>client.download('/usr/local/hive/warehouse/zzs/new_file.txt','/root',overwrite=True)
'/root/new_file.txt'

查看'root'目录下是否已经下载成功

[root@master ~]# pwd
/root
[root@master ~]# ll
total 12
-rw-r--r-- 1 root root   8 Jul 28 11:39 new_file.txt

6、读取文件

通过client.read(hdfs_file_path,encoding='utf8')来获得文件内容

>>> with client.read('/usr/local/hive/warehouse/zzs/new_file.txt',encoding='utf8') as reader:
...     for rd in reader:
...         print(rd)
...
1,apple
>>>

7、追加数据

通过client.write(hdfs_file_path,data,overwrite=False,append=True)函数来追加数据>>>client.write('/usr/local/hive/warehouse/zzs/new_file.txt','2,orange\n',overwrite=False,append=True)

再通过hadoop命令查看文件内容

[root@master code]# hadoop fs -cat usr/local/hive-2.3.4/warehouse/zzs/new_file.txt
1,apple
2,orange

8、覆盖数据

通过client.write(hdfs_file_path,data,overwrite=True,append=False)函数来覆盖数据

>>>client.write('/usr/local/hiv2.3.4/warehouse/zzs/new_file.txt','3,banana\n',overwrite=True,append=False)

再通过hadoop命令查看文件内容

[root@master code]# hadoop fs -cat usr/local/hive-2.3.4/warehouse/zzs/new_file.txt
3,banana
原先的内容已经被覆盖,只剩下最后一次提交的新数据

9、修改和移动文件

通过client.rename(hdfs_source_path,hdfs_dst_path)函数修改和移动文件

>>>client.rename('/usr/local/hive/warehouse/zzs/new_file.txt','/usr/local/hive/warehouse/zzs/new_file1.txt')

再通过hadoop命令查看文件名称是否改变

[root@master code]# hadoop fs -ls /usr/local/hive-2.3.4/warehouse/zzs/
Found 1 items
-rwxr-xr-x   3 dr.who supergroup          9 2019-07-28 11:57
/usr/local/hive/warehouse/zzs/new_file1.txt

在hdfs上,文件名已经变成了new_file1.txt

10、查看hdfs的所有目录

通过client.list('hdfs_path')函数查看hdfs上制定路径下的所有文件目录

>>> client.list('/usr/local/hive/warehouse/zzs/')
['new_file1.txt']

结果为new_file1.txt,是否我们新建且更换过名称的文件

五、其它

在python对hdfs的操作中,常见的就是hdfs的权限问题,解决hdfs的权限问题通常有两种

·利用hadoop的授权命令:hadoop fs -chmod -R 755(以及以上权限) hdfs路径

·在hadoop的hdfs-site.xml文件中增加如下配置

<property>

    <name>dfs.client.block.write.replace-datanode-on-failure.enable</name>

    <value>true</value>

</property>

<property>


    <name>dfs.client.block.write.replace-datanode-on-failure.policy</name>


    <value>NEVER</value>

</property>


文章转载自大家都爱涨姿势,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论