2.5 python操作hdfs

2.5.1 安装python3

由于系统默认安装的是python2.7,需要安装python3环境

  • 源码编译安装python3.6.0

    • 安装一些依赖库

      sudo yum install openssl
      sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel
      
    • 1,下载Python安装包

      cd /usr/local/src
      wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tgz
      
    • 2,解压

      tar -zxvf Python-3.6.0.tgz

    • 3,进入解压目录

      cd Python-3.6.0

    • 4,编译安装包

      ./configure --prefix=/usr/local/python3
      make && make install
      
    • 5,添加环境变量

      echo PATH='/usr/local/python3/bin/:$PATH' >> /etc/profile
      source /etc/profile
      
    • 6,检查是否安装成功

      python3.6
      
      Python 3.6.0 (default, Jun  1 2017, 14:01:43) 
      [GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux
      Type "help", "copyright", "credits" or "license" for more information.
      >>> print('hello')
      hello word
      

2.5.2 利用python代码实现hdfs的文件操作

  • 1,安装hdfs

    pip3 install hdfs

  • 2,连接hdfs

    from hdfs.client import Client
    # 50070: NameNode web管理端口
    client = Client("http://主机名:50070")  
    client.list("/")  #列出所有hdfs目录
    
  • 3,status —获取路径的具体信息 其他参数:status(hdfs_path, strict=True)

    hdfs_path:就是hdfs路径

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

  • 4,list —获取指定路径的子目录信息

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

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

  • 5,makedirs —创建目录

    client.makedirs("/test")

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

    permission:设置权限

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

  • 6,rename —重命名 格式说明:rename(hdfs_path, local_path)

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

  • 8,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:如果在上传任何文件时发生错误,则删除该文件

  • 9,download —下载

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

  • 10,read—读取文件

    with client.read("/test/a.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作为第二个参数。

  • 11,write –写入

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

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

    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>
    

    安全模式导致错误:

    hdfs.util.HdfsError: Cannot create directory xxx. Name node is in safe mode

    关闭安全模式:

    hadoop dfsadmin -safemode leave

results matching ""

    No results matching ""