hdfs基本命令与python编程

本文介绍了HDFS的基本命令及Python编程方法,包括文件的上传、下载、删除等操作,并提供了一个使用Python批量导入本地文件到HDFS的实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hdfs基本命令与python编程

为了使用Hadoop进行大量数据的分析,需要使用hdfs将文件导入进行分布式的存储,加速分析的速度。因此,需要首先了解hdfs的基本用法,了解如何导入本地数据,为后续的数据分析打下基础。
这篇博客介绍hdfs的基本命令、基于python批量导入数据的方法等。
【注意】所有的命令都需要首先切换到hdfs用户,使用下面的命令

sudo su #切换到root用户
su hdfs 

hdfs基本命令介绍

在使用前面的博客安装好Cloudera Manager以及CDH以后,默认已经装好了hadoophdfs等工具。

  • hdfs版本查看
    在终端下输入下面的命令

    hdfs version

    在本系列的博客中使用的版本是Hadoop 2.6.0-cdh5.14.0

  • 列出hdfs目录下的文件
    列出hdfs文件系统根目录下的目录和文件

    hadoop fs -ls  /

    列出hdfs文件系统所有的目录和文件

    hadoop fs -ls -R /
  • 导入本地文件或文件夹到hdfs
    导入文件的命令为

    hadoop fs -put <local_file> /<hdfs_file>

    注意hdfs_file前面需要加/,否则会提示No Such File or Directory。此外,hdfs_file的父目录一定要存在,否则无法执行。
    此时在使用hadoop fs -ls /可以看到会增加了一个文件。
    导入文件夹的命令为

    hadoop fs -put  < local file or dir >...< hdfs dir >

    从键盘读取输入到hdfs_file

    hadoop fs -put - < hdsf  file>

    除了使用put命令以外,还可以使用moveFromLocal命令将本地文件上传到hdfs

    hadoop fs -moveFromLocal <local src> <hdfs dst>

    此外,还可以使用copyFromLocal将键盘读取到的内容输入到hdfs file

    hadoop fs -copyFromLocal <local src> <hdfs dst>
  • hdfs文件下载到本地
    使用get命令将hdfs文件复制到本地

    hadoop fs -get <hdfs file > <local file or dir>

    如果需要拷贝多个文件或者目录到本地,则使用下面的命令

    hadoop fs -get <hdfs file or dir> <local dir>

    除了使用get命令以后,还可以使用copyToLocal命令

    hadoop fs -copyToLocal <local src> <hdfs dst>
  • 删除hdfs文件或者文件夹
    使用下面的命令删除文件或者文件夹

    hadoop fs -rm <hdfs file>
    hadoop fs -rm -r <hdfs dir>
  • 创建文件夹
    使用下面的命令可以创建hdfs文件夹

    hadoop fs -mkdir <hdfs dir>

    上面的命令只能够一级一级的建立目录,如果父目录不存在的话使用这个命令会报错。如果想一次性创建目录,可以使用下面的命令

    hadoop fs -mkdir -p <hdfs dir>
  • 拷贝多个文件到本地并合并
    使用getmerge命令

    hadoop fs -getmerge <hdfs dir> <local file>

    hdfs指定目录下所有文件排序后合并到local指定的文件,文件不存在时会自动创建,文件存在时会覆盖里面的内容。

    hadoop fs -getmerge -nl <hdfs dir> <local dile>

    加上nl命令后,合并到local file中的hdfs文件会空出一行。

  • 复制hdfs文件
    使用下面的命令复制hdfs的文件

    hadoop fs -cp <hdfs file> <hdfs file>
  • 移动hdfs的文档
    可以使用下面的命令移动hdfs的文档

    hadoop fs -mv <hdfs file> <hdfs file>
  • 统计hdfs相应目录下文件个数、大小等
    使用下面的命令可以统计hdfs对应路径下的目录个数、文件个数和文件总计大小

    hadoop fs -count <hdfs path>
  • 显示hdfs文件的详细信息
    使用下面的命令可以查看hdfs路径下文件夹和大小

    hadoop fs -du <hdfs path>

    查看hdfs路径下所有的文件及其大小

    hadoop fs -du -s <hdfs path>

Python编程

为了方便批量处理文本文件,可以使用Python编写脚本来导入数据,主要有三种:pyhdfs,这是其官方文档hdfs,这是其官方文档libhdfs,这个使用的不是很多。这篇博客使用的是hdfs,并且会对其基本操作进行介绍。

  • 安装Pythonhdfs模块

    exit #退出hdfs用户,进入普通用户
    sudo pip install hdfs
  • Pythonhdfs模块导入
    在命令行下,输入python就进入Python交互环境

    python

    首先导入Pythonhdfs模块

    import hdfs as hdfs

    如果上面的命令执行没有问题,说明该模块已经安装好了。

  • 创建InsecureClienthdfs系统进行通信

    client = hdfs.InsecureClient("http://localhost:50070", user="hdfs")

    如果上面的命令没有任何报错信息,则说明连接成功了。在上面的命令中,用户user字段需要制定成自己的hdfs用户,一般默认为用户名为hdfs,如果不知道可以先不设置这个字段,登录以后用client.status("/")命令查看文件夹的owner

  • 查看client支持的方法

    dir(client)

    可以得到如下的输出

    ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__registry__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_append', '_append_1', '_create', '_create_1', '_delete', '_get_content_summary', '_get_file_checksum', '_get_file_status', '_get_home_directory', '_list_status', '_mkdirs', '_open', '_rename', '_request', '_session', '_set_owner', '_set_permission', '_set_replication', '_set_times', '_timeout', 'checksum', 'content', 'delete', 'download', 'from_options', 'list', 'makedirs', 'parts', 'read', 'rename', 'resolve', 'root', 'set_owner', 'set_permission', 'set_replication', 'set_times', 'status', 'upload', 'url', 'walk', 'write']
  • 获取路径的具体信息

    client.status("/", False)

    其中函数status的具体用法为

    status(hdfs_path, strict=False)
     hdfs_path:需要查询的hdfs路径
     strict:为True时,hdfs_path不存在就会抛出异常;
           为False时,hdfs_path不存在会返回None。
  • 获取指定目录的子目录信息

    client.list("/")

    函数list的具体使用方法为

    list(hdfs_path, status=False)
       hdfs_path:指定的需要查看的hdfs路径
       status:为True时,返回子目录的状态信息,默认为False
  • 创建目录

    client.makedirs("/test")

    该函数的具体使用方法为

    makedirs(hdfs_path,permission=None)
          hdfs_path:需要创建的目录路径名
          permission:设置文件的权限,例如permission=777

    然后可以使用下面的命令查看目录

    client.list("/")
  • 重命名

    client.rename("/test","/nasa")

    该函数的具体介绍为

    rename(old_hdfs_path, new_hdfs_path)
    old_hdfs_path:为需要重命名文件的路径名
    new_hdfs_path:重命名文件新的路径名
  • 删除文件及其子目录

    client.delete("/nasa")

    该函数的具体使用方法为

    delete(hdfs_path,recursive=False)
             hdfs_path:需要删除的文件名
             recursive:如果是空文件夹使用False,如果不是空文件夹则设置成True
  • 上传数据到hdfs

    client.upload("/NASA", "Flight001.csv")

    该函数的使用方法为

    client.upload(hdfs_path, local_path, overwrite=False,n_threads=1,temp_dir=None,
    chunk_size=65536,progress=None,cleanup=True,**kwargs)
      hdfs_path:上传到hdfs的路径名
      local_path:本地的文件名
      overwrite:True,如果有重名文件会被覆盖
      temp_dir:当覆盖时,如果重名了会把hdfs远程文件替换下来
      chunk_size:文件上传的大小区间
      progess:回调函数来跟踪上传的进度
      cleanup:一旦上传发生了错误,则删除这个文件
  • 下载数据到本地

    client.download("/NASA/Flight001.csv","home/hadoop/Flight001.csv")

    该方法的参数和upload一样。

  • 读取文件

    with client.read("/NASA/Flight001.csv") as reader:
      print reader.read()

    该函数的使用方法

    read(hdfs_path, offset, legnth, buffer_size,encoding, chunk_size, delimiter, progress)
         hdfs_path:需要读取的文件在hdfs上的路径
         offset:开始的字节位置
         length:读取的长度
         buffer_size:缓冲区大小,默认设置可以通过hdfs修改
         encoding:指定编码格式
         chunk_size:如果设置为正数,上下文管理器将返回一个发生器产生的每一chunk_size字节而不是一个类似文件的对象
         delimiter:如果设置了分隔符,每次遇到分隔符上下文管理器会返回一个发生器
         progress:跟踪传输的进度
  • Python编程实例
    批量导入本地文件到hdfs

    import hdfs
    import glob
    client = hdfs.InsecureClient("http://hadoop-master:50070", user="hdfs")
    
    local_path = "/home/hadoop/cmapss/"
    dst_path = "/NASA/" # all data will be stored at hdfs nasa directory
    
    working_prefixs = ['Fault', 'Nominal']
    working_postfixs = ['Fan', 'HPC', 'HPT', 'LPC', 'LPT']
    
    path_prefixs = []
    for working_prefix in working_prefixs:
       for working_postfix in working_postfixs:
           path_prefixs.append(working_prefix + "_" + working_postfix)
    
    engine_data_paths = []
    for path_prefix in path_prefixs:
        cur_data_paths = glob.glob(local_path+path_prefix+"/Engine*"+"/Flight*.csv")
        cur_data_paths.sort()
        engine_data_paths+=cur_data_paths
    
    cmapss_index = local_path.index("cmapss")+7
    
    for data_path in engine_data_paths:
        data_filename = data_path[cmapss_index:] 
        client.upload(dst_path+data_filename, data_path)
        print("File %s Uploaded!"%(data_filename))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值