使用python的hdfs包操作HDFS

项目需要利用python访问hdfs,查到可以利用hdfs包实现这一点,总结了下使用方法。

1.安装
我在Linux环境下安装

pip install hdfs

2.连接hdfs

from hdfs.client import Client
# 50070: NameNode web管理端口
client = Client("http://localhost:50070")  
client.list("/")  #列出所有hdfs目录
 其他参数说明:

   classhdfs.client.Client(url, root=None, proxy=None, timeout=None, session=None)

                url:ip:端口

                root:制定的hdfs根目录

                proxy:制定登陆的用户身份

                timeout:设置的超时时间

                seesion:requests.Session instance, used to emit all requests.(不是太懂,应该四用户发出请求)

3.dir —查看支持的方法

dir(client)

4. status —获取路径的具体信息
其他参数:status(hdfs_path, strict=True)

hdfs_path:就是hdfs路径

strict:设置为True时,如果hdfs_path路径不存在就会抛出异常,如果设置为False,如果路径为不存在,则返回None

5. list —获取指定路径的子目录信息

其他参数:list(hdfs_path, status=False)

          status:为True时,也返回子目录的状态信息,默认为Flase

6. makedirs —创建目录

client.makedirs("/test")  

其他参数:makedirs(hdfs_path, permission=None)

permission:设置权限

client.makedirs("/test",permission=777)  

7. rename —重命名
格式说明:rename(hdfs_path, local_path)

8. delete —删除
其他参数:delete(hdfs_path, recursive=False)
recursive:删除文件和其子目录,设置为False如果不存在,则会抛出异常,默认为False

9. upload —上传数据

client.upload("/test","/opt/bigdata/hadoop/NOTICE.txt")  

其他参数:upload(hdfs_path, local_path, overwrite=False, n_threads=1, temp_dir=None,
chunk_size=65536,progress=None, cleanup=True, **kwargs)

           overwrite:是否是覆盖性上传文件

           n_threads:启动的线程数目

           temp_dir:当overwrite=true时,远程文件一旦存在,则会在上传完之后进行交换

           chunk_size:文件上传的大小区间

           progress:回调函数来跟踪进度,为每一chunk_size字节。它将传递两个参数,文件上传的路径和传输的字节数。一旦完成,-1将作为第二个参数

           cleanup:如果在上传任何文件时发生错误,则删除该文件

10. download —下载

其他参数:download(hdfs_path, local_path, overwrite=False, n_threads=1, temp_dir=None, **kwargs)
参考上传 upload

11. read—读取文件

with client.read("/test/NOTICE.txt") as reader:  
    print reader.read()  

其他参数:read(*args, **kwds)

          hdfs_path:hdfs路径

          offset:设置开始的字节位置

          length:读取的长度(字节为单位)

          buffer_size:用于传输数据的字节的缓冲区的大小。默认值设置在HDFS配置。

          encoding:制定编码

          chunk_size:如果设置为正数,上下文管理器将返回一个发生器产生的每一chunk_size字节而不是一个类似文件的对象

          delimiter:如果设置,上下文管理器将返回一个发生器产生每次遇到分隔符。此参数要求指定的编码。

          progress:回调函数来跟踪进度,为每一chunk_size字节(不可用,如果块大小不是指定)。它将传递两个参数,文件上传的路径和传输的字节数。称为一次与- 1作为第二个参数。

附:在对文件操作时,可能会提示错误

hdfs.util.HdfsError: Permission denied: user=dr.who, access=WRITE, inode="/test":root:supergroup:drwxr-xr-x  

解决办法是:在配置文件hdfs-site.xml中加入

<property>  
  <name>dfs.permissions</name>  
  <value>false</value>  
</property>  

重启集群即可
基本常用的功能也就这些了,如果需要一些特殊的功能,可以自己执行help(client.method)进行查看

12. write –写入

client.write(filepath, data=data_str, encoding='utf-8')

参数:

data_str 我测试的时候,英文没问题,但中文的话,需要首先将str转换为Unicode。利用unicode(data_str)

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值