实验二: 熟悉常用的HDFS操作
一、实验题目
熟悉常用的HDFS操作。
二、实验目的
(1) 理解HDFS在Hadoop体系结构中的角色;
(2) 熟练使用HDFS操作常用的Shell命令;
(3) 熟悉HDFS操作常用的Java API。
三、平台
操作系统:Linux
Hadoop版本:1.2.1或以上版本
JDK版本:1.6或以上版本
四、内容和要求
利用Hadoop提供的Shell命令完成下列任务:
首先,启动hadoop:
cd /usr/local/hadoop
./sbin/start-dfs.sh
(1)向HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,由用户指定是追加到原有文件末尾还是覆盖原有的文件;
假如指定了local.txt文件。而你的本地文件里不存在,则可以使用创建本地文件命令:
touch local.txt
然后将本地文件
local.txt
的内容追加到 HDFS 中的文件text.txt:
./bin/hdfs dfs -appendToFile local.txt text.txt
./bin/hdfs
: 这是执行 HDFS 命令的路径。dfs
: 表示操作 HDFS。-appendToFile
: 这个选项表示要将一个文件的内容追加到另一个文件中。local.txt
: 是本地文件,包含你想要追加的内容。text.txt
: 是目标文件,即你希望将local.txt
的内容追加到这个文件中。如果
text.txt
不存在,该命令将会报错,因为-appendToFile
只能用于已经存在的文件。
本文使用myLocalFile.txt文件。
把本地文件系统的"/home/hadoop/myLocalFile.txt"上传到HDFS中的当前用户目录的input目录下,也就是上传到HDFS的"/user/local/hadoop/input/"目录下。
向HDFS中上传任意文本文件:
hdfs dfs -put /home/hadoop/myLocalFile.txt input/
命令使用示例:
hdfs dfs -appendToFile local.txt text.txt:追加到原文件末尾,追加本地文件 local.txt 的内容到HDFS上已存在的文件 text.txt。
覆盖原来文件,第一种命令形式: hdfs dfs -copyFromLocal -f local.txt text.txt。本地文件 local.txt的内容覆盖到HDFS上已存在的文件text.txt
覆盖原来文件,第二种命令形式: hdfs dfs -cp -f file:///home/hadoop/local.txt text.txt。
1.追加到原文件末尾:
hdfs dfs -appendToFile /home/hadoop/myLocalFile.txt input/myLocalFile.txt
2.覆盖原来文件:
hdfs dfs -copyFromLocal -f /home/hadoop/myLocalFile.txt input/myLocalFile.txt
1和2你可以根据实际情况选择追加还是覆盖。
【说明】:这里是将本地的 myLocalFile.txt 文件复制到 HDFS 的 input 目录下,并且如果 input 目录中已经存在同名的 myLocalFile.txt 文件,将会被覆盖。
(2)从HDFS中下载指定文件,如果本地文件与要下载的文件名称相同,则自动对下载的文件重命名;
if hdfs dfs -test -e file:///home/hadoop/myLocalFile.txt; then
hdfs dfs -copyToLocal input/myLocalFile.txt ./text2.txt
else
hdfs dfs -copyToLocal input/myLocalFile.txt ./myLocalFile.txt
fi
(3)将HDFS中指定文件的内容输出到终端中;
hdfs dfs -cat input/myLocalFile.txt
(4)显示HDFS中指定的文件的读写权限、大小、创建时间、路径等信息;
hdfs dfs -ls -h input/myLocalFile.txt
(5)给定HDFS中某一个目录,输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息;
hdfs dfs -ls -R -h /user/hadoop
(6)提供一个HDFS内的文件的路径,对该文件进行创建和删除操作。如果文件所在目录不存在,则自动创建目录;
if $(hdfs dfs -test -d dir1/dir2);
then $(hdfs dfs -touchz dir1/dir2/filename);
else $(hdfs dfs -mkdir -p dir1/dir2 && hdfs dfs -touchz dir1/dir2/filename);
fi
hdfs dfs -rm dir1/dir2/filename #删除文件
(7)提供一个HDFS的目录的路径,对该目录进行创建和删除操作。创建目录时,如果目录文件所在目录不存在则自动创建相应目录;删除目录时,由用户指定当该目录不为空时是否还删除该目录;
创建目录的命令如下:
hdfs dfs -mkdir -p dir1/dir2
删除目录的命令如下:
hdfs dfs -rmdir dir1/dir2
上述删除命令执行以后,如果目录非空,则会提示 not empty,删除操作不会执行。如果要
强制删除目录,可以使用如下命令:
hdfs dfs -rm -R dir1/dir2
(8)向HDFS中指定的文件追加内容,由用户指定内容追加到原有文件的开头或结尾;
追加到原文件末尾:
hdfs dfs -appendToFile /home/hadoop/myLocalFile.txt input/myLocalFile.txt
追加到原文件的开头:
hdfs dfs -get input/myLocalFile.txt
cat myLocalFile.txt >> /home/hadoop/myLocalFile.txt
hdfs dfs -copyFromLocal -f /home/hadoop/myLocalFile.txt inpu/myLocalFile.txt
【说明】:在 HDFS 中不存在与这种操作对应的命令,因此,无法使用一条
命令来完成。可以先移动到本地进行操作,再进行上传覆盖。
【说明】:其中cat myLocalFile.txt >> /home/hadoop/myLocalFile.txt 这个命令尝试将myLocalFile.txt文件的内容追加到/home/hadoop/myLocalFile.txt文件的末尾。hdfs dfs -copyFromLocal -f命令将本地文件系统中的/home/hadoop/myLocalFile.txt文件强制复制到HDFS的input/myLocalFile.txt路径
(9)删除HDFS中指定的文件;
hdfs dfs -rm input/myLocalFile.txt
(10)删除HDFS中指定的目录,由用户指定目录中如果存在文件时是否删除目录;
删除目录(如果目录非空则会提示not empty,不执行删除):
hdfs dfs -rmdir dir1/dir2
强制删除目录:
hdfs dfs -rm -R dir1/dir2
(11)在HDFS中,将文件从源路径移动到目的路径。
hdfs dfs -mv text.txt text2.txt