hdfs基本命令与python编程
为了使用Hadoop
进行大量数据的分析,需要使用hdfs
将文件导入进行分布式的存储,加速分析的速度。因此,需要首先了解hdfs
的基本用法,了解如何导入本地数据,为后续的数据分析打下基础。
这篇博客介绍hdfs
的基本命令、基于python
批量导入数据的方法等。
【注意】所有的命令都需要首先切换到hdfs
用户,使用下面的命令
sudo su #切换到root用户
su hdfs
hdfs基本命令介绍
在使用前面的博客安装好Cloudera Manager
以及CDH
以后,默认已经装好了hadoop
和hdfs
等工具。
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
,并且会对其基本操作进行介绍。
安装
Python
的hdfs
模块exit #退出hdfs用户,进入普通用户 sudo pip install hdfs
Python
的hdfs
模块导入
在命令行下,输入python
就进入Python
交互环境python
首先导入
Python
的hdfs
模块import hdfs as hdfs
如果上面的命令执行没有问题,说明该模块已经安装好了。
创建
InsecureClient
和hdfs
系统进行通信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))