Python操作HDFS利器之hdfs

本文基于实验室已经搭建好的Hadoop平台而写,使用Python调用hdfs来操作HDFS

HdfsCLI官方文档:https://hdfscli.readthedocs.io/en/latest/

 

1.安装

pip install hdfs

 

2.配置

(1)使用hdfs这个用户登录到hdfs服务器,创建用户,并修改权限

142442_SkkC_2704218.png

(2)集群中所有节点的hdfs-site.xml文件增加如下内容

210934_vvtP_2704218.png

(3)配置hosts文件:这个配置非常重要。

    如果想在集群外的其他节点(此处可以理解为你自己的工作节点)通过WebHDFS REST API访问集群,需要配置hosts文件

    本人使用的是Windows7 64位系统,hosts文件在C:\Windows\System32\drivers\etc目录下。在hosts文件中配置集群中节点的ip和名称,如下:

211654_GPFC_2704218.png

此处如果不配置,读写操作都无法完成,会出现如下错误:

File "C:\Python27\lib\site-packages\hdfs\util.py", line 99, in __exit__
    raise self._err # pylint: disable=raising-bad-type
requests.packages.urllib3.exceptions.NewConnectionError: <requests.packages.urllib3.connection.HTTPConnection object at 0x0000000003B3C400>: Failed to establish a new connection: [Errno 10060] 

 

3.连接

from hdfs import InsecureClient

hdfs_client = InsecureClient('http://10.1.13.111:50070', user='liulin')

print hdfs_client.list('.')        # 列出当前目录下的所有文件

通过hue可以看到目前user/liulin下的文件情况如下:

163213_23Ho_2704218.png

程序运行之后的结果如下:

163319_ghNi_2704218.png

4.读文件:read()方法提供了一个类似于文件的接口,用于从HDFS读取文件。

                它必须在with上下文管理器中使用。

(1)将文件加载到内存

# 将文件加载到内存
with client.read('test.txt') as reader:
    data = reader.read()
    print data

通过hue可以看到test.txt的内容如下:

202025_CTiy_2704218.png

程序运行之后的结果如下:

202059_l5Sq_2704218.png

(2)对于json文件,可以直接反序列化

# 直接将json对象反序列化
with client.read('model.json', encoding='utf-8') as reader:
    from json import load
    model = load(reader)
    print model

(3)如果设置了chunk_size这个参数,with上下文管理器将返回一个chunk_size 字节的生成器,

        而不是返回一个类文件对象,除非同时也设置了delimiter参数。

# 流文件
with client.read('test.txt', chunk_size=8) as reader:
    for chunk in reader:
        print chunk

(4)类似的,如果设置了delimiter这个参数,with上下文管理器将返回一个生成器,该生成器遇到delimiter 就会生成数据。设置该参数的时候,必须同时设置encoding参数。

# 通过设置定界符来读取数据,必须与encoding参数同时使用
with client.read('test.txt', encoding='utf-8', delimiter='\n') as reader:
    for line in reader:
        print line

 

5.写文件:通过write()方法向HDFS写入文件,该方法返回一个可写的类文件对象

(1)创建一个新文件,并向文件中写入数据

# 向文件写入数据,会创建一个新的文件
data = '''
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
'''

with client.write('test_liulin.txt') as writer:
    writer.write(data)

(2)通过设置append参数向一个已经存在的文件追加写入数据

# 通过设置append参数,向一个已经存在的文件追加写入数据
with client.write('test_liulin.txt', append=True) as writer:
    writer.write('You succeed!')

(3)通过设置overwrite参数向一个已经存在的文件覆盖写入数据

# 写入文件的一部分, 可以用作文件
with client.read('test_liulin.txt', delimiter='\n', encoding='utf-8') as reader, \
        client.write('test_liulin.txt', overwrite=True) as writer:
    for line in reader:
        print line
        if line.find('is') != -1:
            writer.write(line + '\n')

(4)向json文件写入数据

# 编写序列化的json对象
sample = {'university': 'HDU', "school": "computer"}
with client.write('sample.json', encoding='utf-8') as writer:
    from json import dump
    dump(sample, writer)

 

6.探索文件系统

所有的Client子类都公开了多种与HDFS交互的方法,大多数方法都是直接将WebHDFS的操作直接模块化。

(1)用content()方法检索文件或文件夹的内容摘要

# 检索文件或文件夹的内容摘要
content = client.content('test.txt')
print content

221021_rxYK_2704218.png

(2)列出一个目录中的所有文件

# 列出当前目录中所有的文件
file_names = client.list('.')
print file_names

(3)检索一个文件或文件夹的状态

# 检索一个文件或文件夹的状态
from pprint import pprint
status = client.status('test_liulin.txt')
pprint(status)

221655_FWPH_2704218.png

(4)重命名:该方法也可以用于移动文件

# 给文件重命名
client.rename('test1.txt', 'test22.txt')

(5)删除文件

# 删除文件
client.delete('test_wyx')

(6)从HDFS下载文件到本地

# 从HDFS下载文件到本地:即当前这个文件所在的位置
client.download('test_liulin.txt', '.', n_threads=3)

(7)文件路径扩展:使用特殊的标记来标识路径,使用#LATEST 来标识给定文件夹中最后被修改的文件

# 给定文件夹中最后一个被修改的文件
with client.read('./#LATEST') as reader:
    data = reader.read()
    print data

注意:如果路径缺失,上面提到的大多数方法都会报HdfsError,推荐的方式是使用content()和status()方法来检查路径是否存在,并将strict参数设置False,若路径真的不存在,则返回None

 

还有一些高级应用及更详细的API参考资料请阅读官方文档……

 

 

转载于:https://my.oschina.net/wolfoxliu/blog/862015

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HDFS(Hadoop Distributed File System)是Apache Hadoop生态系统中的一部分,是一个分布式文件系统,用于存储和管理大规模数据集。HDFS旨在运行在低成本硬件上,并具有高容错性、高可扩展性和高吞吐量等优点。Python是一种流行的编程语言,可以用于操作HDFS系统文件。 Python操作HDFS系统文件的背景: 随着大数据技术的发展,越来越多的企业和组织开始使用Hadoop和HDFS来存储和管理大规模数据集。而Python作为一种广泛使用的编程语言,对于许多数据科学家和工程师来说是必不可少的工具。因此,Python操作HDFS系统文件的需求也越来越大。 Python操作HDFS系统文件的研究意义: 1. 提高工作效率:使用Python操作HDFS系统文件可以帮助数据科学家和工程师更快地处理和管理大规模数据集,提高工作效率。 2. 扩展应用场景:Python的广泛应用和HDFS的高可扩展性使得Python操作HDFS系统文件的应用场景更加广泛,可以应用于各种类型的数据处理和分析。 3. 降低技术门槛:使用Python操作HDFS系统文件可以降低技术门槛,使得更多的人可以轻松地处理和管理大规模数据集。 4. 促进技术创新:Python操作HDFS系统文件的应用可以促进技术创新,鼓励开发人员开发更多的工具和库来简化数据处理和管理。 总之,Python操作HDFS系统文件是一个有意义的研究方向,可以帮助我们更好地处理和管理大规模数据集,促进数据科学和工程的发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值