python hdfs模块使用

2023年2月1日09:57:22

title: python hdfs模块使用
date: 2017-02-21 20:43:11
categories: Python
tags: HDFS


HDFS是hadoop分布式文件系统,HDFS中有两类节点。一类是NameNode,一类是DataNode。
其中NameNode是管理者,存储各种文件的元数据,SecondaryNameNode作为NameNode的冷备份。DataNode则是真正存储数据块,进行文件读写的地方。
更多内容参考HDFS 原理、架构与特性介绍

python中对hdfs api封装的模块主要有hdfs,hdfs3,pytinyhdfs,PYHDFS等。这里选择hdfs比较简单清晰。

  1. 安装
    pip install hdfs

  2. 连接

         >>> from hdfs import *
         >>> client=Client('http://192.168.71.109:50070')
    
     
    
     这里是在windwos上连接IP为192.168.71.109的安装有hadoop机器
    
  3. 列出文件

         >>> client.list('/')
         ['2017']
    
  4. 新建文件夹

         >>> client.makedirs('/a/b/c')
    
     可以递归创建文件夹,完成后不返回结果
    
  5. 重命名/移动

         >>> client.rename('/2017/02','/2017/03')
         >>> client.list('/2017')
         ['03']
    
     可以对文件进行重命名,移动操作,类似mv命令。函数原型`rename (hdfs_src_path, hdfs_dst_path)`
    
  6. 删除

         >>> client.delete('/2017',recursive=True)
         True
    
     recursive为递归删除,类似`rm -r`,函数原型`delete(hdfs_path, recursive=False)`
    
  7. 写文件

        >>> with open('D:/tmp/test.txt','rb') as f:
        ...     data=f.read()
        ...
        >>> client.write('/2017/02/test.txt',data=data)
    

    这里会报错,信息如下:

      requests.exceptions.ConnectionError: HTTPConnectionPool(host='debian', port=50075): Max retries exceeded with url:
    /webhdfs/v1/2017/02/test.txt?op=CREATE&namenoderpcaddress=localhost:9000&overwrite=false (Caused by
    NewConnectionError('<requests.packages.urllib3.connection.HTTPConnection object at 0x03BB0D10>: Failed to establish a new connection: [Errno 11001] getaddrinfo
    failed',))
    

    这里host='debian'namenoderpcaddress=localhost:9000,debian是安装hadoop的linux主机名,localhost:9000并不是namenode所在IP。原因是hdfs在读写操作中,namenode向客户端返回datanode时是主机名,而不是IP。所以需要在hosts文件中加入datanode主机名与IP的记录。

    #	127.0.0.1       localhost
    #	::1             localhost
    192.168.71.109 debian
    

    再来操作即可成功。

       >>> client.write('/2017/02/test.txt',data=data)
       >>> client.list('/2017/02/')
       ['test.txt']
    

    函数原型:write(hdfs_path, data=None, overwrite=False, permission=None, blocksize=None, replication=None, buffersize=None, append=False, encoding=None)

    overwrite 当目标文件存在时,覆盖写入。

  8. 读文件

    >>> with client.read('/2017/02/test.txt') as f:
    ...     data=f.read()
    >>> print(data.decode())
    201722113:11:37
    test
    
  9. 上传

       >>> client.upload('/2017/02/test.txt','D:/tmp/test.txt',overwrite=True)
       '/2017/02/test.txt'
    
  10. 下载

```python
>>> client.download('/2017/02/test.txt','D:/tmp/test2.txt')
'D:\\tmp\\test2.txt'
```

参考:官方文档

  • 作者:seeicb
  • 原文链接:https://blog.csdn.net/u014578907/article/details/88258574
    更新时间:2023年2月1日09:57:22 ,共 2021 字。