HDFS操作常用Shell命令

Hadoop支持很多Shell命令,比如hadoop fs、hadoop dfs和hdfs dfs都是HDFS最常用的Shell命令,用来查看HDFS文件系统的目录结构、上传和下载数据、创建文件等。这三个命令既有联系有又区别:
 hadoop fs:适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统;
 hadoop dfs:只能适用于HDFS文件系统;
 hdfs dfs:跟hadoop dfs命令的作用一样,也只能适用于HDFS文件系统。
在本教程中,统一使用hdfs dfs命令对HDFS进行操作。

查看命令使用方法

请登录Linux系统,打开一个终端,首先启动Hadoop,命令如下:

cd /usr/local/hadoop
./sbin/start-dfs.sh

可以在终端输入如下命令,查看hdfs dfs总共支持哪些操作:

cd /usr/local/hadoop
./bin/hdfs dfs

上述命令执行后,会显示类似如下的结果(这里只列出部分命令):

[-appendToFile ... ]
[-cat [-ignoreCrc] ...]
[-checksum ...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-copyFromLocal [-f] [-p] [-l] ... ]
[-copyToLocal [-p] [-ignoreCrc] [-crc] ... ]
[-count [-q] [-h] ...]
[-cp [-f] [-p | -p[topax]] ... ]
[-createSnapshot []]
[-deleteSnapshot ]
[-df [-h] [ ...]]
[-du [-s] [-h] ...]
[-expunge]
[-find ... ...]
[-get [-p] [-ignoreCrc] [-crc] ... ]
[-getfacl [-R] ]
[-getfattr [-R] {-n name | -d} [-e en] ]
[-getmerge [-nl] ]
[-help [cmd ...]]
[-ls [-d] [-h] [-R] [ ...]]
[-mkdir [-p] ...]
[-moveFromLocal ... ]
[-moveToLocal ]
[-mv ... ]
[-put [-f] [-p] [-l] ... ]

可以看出,hdfs dfs命令的统一格式是类似“hdfs dfs -ls”这种形式,即在“-”后面跟上具体的操作。
可以查看某个命令的作用,比如,当需要查询put命令的具体用法时,可以采用如下命令:

./bin/hdfs dfs –help put

输出的结果如下:

-put [-f] [-p] [-l] ... :
Copy files from the local file system into fs. Copying fails if the file already exists, unless the -f flag is given.
Flags:
-p Preserves access and modification times, ownership and the mode.
-f Overwrites the destination if it already exists.
-l Allow DataNode to lazily persist the file to disk. Forces replication factor of 1. This flag will result in reduced durability. Use with care.

HDFS目录操作

1. 目录操作

需要注意的是,Hadoop系统安装好以后,第一次使用HDFS时,需要首先在HDFS中创建用户目录。本教程全部采用hadoop用户登录Linux系统,因此,需要在HDFS中为hadoop用户创建一个用户目录,命令如下:

cd /usr/local/hadoop
./bin/hdfs dfs –mkdir –p /user/hadoop

该命令中表示在HDFS中创建一个“/user/hadoop”目录,“–mkdir”是创建目录的操作,“-p”表示如果是多级目录,则父目录和子目录一起创建,这里“/user/hadoop”就是一个多级目录,因此必须使用参数“-p”,否则会出错。
“/user/hadoop”目录就成为hadoop用户对应的用户目录,可以使用如下命令显示HDFS中与当前用户hadoop对应的用户目录下的内容:

 ./bin/hdfs dfs –ls .

该命令中,“-ls”表示列出HDFS某个目录下的所有内容,“.”表示HDFS中的当前用户目录,也就是“/user/hadoop”目录,因此,上面的命令和下面的命令是等价的:

./bin/hdfs dfs –ls /user/hadoop

如果要列出HDFS上的所有目录,可以使用如下命令:

./bin/hdfs dfs –ls

下面,可以使用如下命令创建一个input目录:

./bin/hdfs dfs –mkdir input

在创建个input目录时,采用了相对路径形式,实际上,这个input目录创建成功以后,它在HDFS中的完整路径是“/user/hadoop/input”。如果要在HDFS的根目录下创建一个名称为input的目录,则需要使用如下命令:

 ./bin/hdfs dfs –mkdir /input

可以使用rm命令删除一个目录,比如,可以使用如下命令删除刚才在HDFS中创建的“/input”目录(不是“/user/hadoop/input”目录):

./bin/hdfs dfs –rm –r /input

上面命令中,“-r”参数表示如果删除“/input”目录及其子目录下的所有内容,如果要删除的一个目录包含了子目录,则必须使用“-r”参数,否则会执行失败。

2. 文件操作

在实际应用中,经常需要从本地文件系统向HDFS中上传文件,或者把HDFS中的文件下载到本地文件系统中。
首先,使用vim编辑器,在本地Linux文件系统的“/home/hadoop/”目录下创建一个文件myLocalFile.txt,里面可以随意输入一些单词,比如,输入如下三行:
Hadoop
Spark
XMU DBLAB

然后,可以使用如下命令把本地文件系统的“/home/hadoop/myLocalFile.txt”上传到HDFS中的当前用户目录的input目录下,也就是上传到HDFS的“/user/hadoop/input/”目录下:

./bin/hdfs dfs -put /home/hadoop/myLocalFile.txt  input

可以使用ls命令查看一下文件是否成功上传到HDFS中,具体如下:

./bin/hdfs dfs –ls input

该命令执行后会显示类似如下的信息:

Found 1 items   
-rw-r--r--   1 hadoop supergroup         36 2017-01-02 23:55 input/ myLocalFile.txt

下面使用如下命令查看HDFS中的myLocalFile.txt这个文件的内容:

./bin/hdfs dfs –cat input/myLocalFile.txt

下面把HDFS中的myLocalFile.txt文件下载到本地文件系统中的“/home/hadoop/下载/”这个目录下,命令如下:

./bin/hdfs dfs -get input/myLocalFile.txt  /home/hadoop/下载

可以使用如下命令,到本地文件系统查看下载下来的文件myLocalFile.txt:

cd ~
cd 下载
ls
cat myLocalFile.txt

最后,了解一下如何把文件从HDFS中的一个目录拷贝到HDFS中的另外一个目录。比如,如果要把HDFS的“/user/hadoop/input/myLocalFile.txt”文件,拷贝到HDFS的另外一个目录“/input”中(注意,这个input目录位于HDFS根目录下),可以使用如下命令:

./bin/hdfs dfs -cp input/myLocalFile.txt  /input

Linux系统常用命令

本教程以“最小化学习”为基本原则,只介绍本教程后续学习过程需要用到的Linux命令,并以实例的形式进行介绍,更多其他Linux命令请参考其他网络资料和书籍。
命令 含义
cd /home/hadoop #把/home/hadoop设置为当前目录
cd .. #返回上一级目录
cd ~ #进入到当前Linux系统登录用户的主目录(或主文件夹)。在 Linux 系统中,~代表的是用户的主文件夹,即“/home/用户名”这个目录,如果当前登录用户名为 hadoop,则~就代表“/home/hadoop/”这个目录
ls #查看当前目录中的文件
ls -l #查看文件和目录的权限信息
mkdir input #在当前目录下创建input子目录
mkdir -p src/main/scala #在当前目录下,创建多级子目录src/main/scala
cat /proc/version #查看Linux系统内核版本信息
cat /home/hadoop/word.txt #把/home/hadoop/word.txt这个文件全部内容显示到屏幕上
cat file1 file2 > file3 #把当前目录下的file1和file2两个文件进行合并生成文件file3
head -5 word.txt #把当前目录下的word.txt文件中的前5行内容显示到屏幕上
cp /home/hadoop/word.txt /usr/local/ #把/home/hadoop/word.txt文件复制到“/usr/local”目录下
rm ./word.txt #删除当前目录下的word.txt文件
rm –r ./test #删除当前目录下的test目录及其下面的所有文件
rm –r test* #删除当面目录下所有以test开头的目录和文件

tar -zxf ~/下载/spark-2.1.0.tgz -C /usr/local/ #把spark-2.1.0.tgz这个压缩文件解压到/usr/local目录下
mv spark-2.1.0 spark #把spark-2.1.0目录重新命名为spark
chown -R hadoop:hadoop ./spark # hadoop是当前登录Linux系统的用户名,把当前目录下的spark子目录的所有权限,赋予给用户hadoop
ifconfig #查看本机IP地址信息
exit #退出并关闭Linux终端

在Windows系统中利用FTP软件向Ubuntu系统上传文件

由于大多数大数据初学者对Windows系统比较熟悉,因此,本教程采用虚拟机方式安装Linux系统(这里采用Ubuntu系统)。如果读者还没有安装Linux虚拟机,请按照前面的Linux虚拟机安装方法完成Ubuntu系统安装。在后续的学习过程中,经常需要把一些资料从Windows系统中传输到Ubuntu系统中,因此,这里介绍具体的实现方法。
(1)设置网络连接方式
完成Ubuntu系统安装以后,Ubuntu系统可以顺利访问互联网,比如,这时进入Ubuntu系统,打开一个浏览器(比如默认安装好的火狐浏览器),就可以访问新浪、百度、腾讯等网站了。但是,这时Windows系统中的一些软件(比如FTP),是无法连接到Ubuntu系统。为什么呢?
在解答这个问题之前,请先关闭虚拟机,关闭VirtualBox软件。然后,重新打开VirtualBox软件,在VirtualBox界面的左上角,点击齿轮图标的“设置”按钮,打开设置界面,在左边栏目中选择“网络”,会出现如下图所示的设置界面。

可以看出,这时的网络连接方式是“网络地址转换(NAT)”。如果把Windows系统称为“主机”,把VirtualBox上的Ubuntu系统称为“虚拟机”,采用这种连接方式时,虚拟机可以访问主机,但是,主机无法访问虚拟机。所以,在这种连接方式下,Windows系统上的FTP软件是无法连接访问Ubuntu系统中的FTP服务器的。
为了让虚拟机能够访问主机,同时让主机也能够访问虚拟机,就必须更改网络连接方式。如下图所示,需要在“连接方式”中选择“桥接网卡”,在“界面名称”后面的下拉列表框中选择电脑当前连接到互联网的网卡,然后,点击“确定”。经过上述设置后,再启动进入Ubuntu系统,就可以让主机访问到虚拟机了。

(2)设置FTP软件
本教程采用的FTP软件是FileZilla,可以登录Windows系统打开浏览器,访问教程官网进行下载,FileZilla安装文件位于“下载专区”的“软件”目录下,文件名是FileZilla_3.17.0.0_win64_setup.exe。下载到FileZilla安装文件以后,安装在Windows系统上。
为了能够让FTP软件连接到Linux虚拟机(Ubuntu系统),需要获得Linux虚拟机的IP地址。请登录Windows系统,再打开虚拟机软件VirtualBox,登录Ubuntu系统,然后,打开一个终端(可以使用快捷键Ctrl+Alt+T),进入Shell命令提示符状态,输入命令“ifconfig”,会得到如下图所示结果,其中,“inet地址:192.168.0.104”就表示Linux虚拟机的IP地址是192.168.0.104。每次重新启动虚拟机,或者在不同的地方(实验室或者宿舍)启动虚拟机,IP地址都可能会发生变化,所以,每次登录Ubuntu系统以后,都需要重新查询IP地址。

获得Linux虚拟机IP地址信息以后,就可以使用FTP软件FileZilla连接Linux虚拟机了。请打开FileZilla,启动后的界面如下图所示。

点击界面左上角菜单的“文件”选项,在弹出的菜单中选择“站点管理器”,会出现如下图所示界面,用于设置FTP连接参数。

点击界面左下角“新站点”按钮,然后,开始设置各种连接参数,具体如下:
 主机:设置为Linux虚拟机的IP地址192.168.0.104;
 端口:可以空着,使用默认端口;
 协议:选择“SFTP-SSH File Transfer Protocol”;
 登录类型:选择“正常”;
 用户:可以使用之前安装Ubuntu系统时创建的用户名;
 密码:可以使用之前安装Ubuntu系统时创建的用户密码;
设置完成以后,点击界面下边的“连接”按钮,开始连接Linux虚拟机。连接成功以后,会显示如下图所示界面,就可以使用FTP软件FileZilla向Ubuntu系统中传输文件了。

从图2-48中可以看出,FileZilla连接成功以后的界面包括2个主要区域。其中,左侧的“本地站点”区域,会显示Windows系统中的目录,点击某个目录以后,下面就会显示目录中的文件信息。右边的“远程站点”区域,是Linux虚拟机中的目录,可以选择一个目录,作为文件上传后要存放的位置。当需要把Windows中的某个文件上传到Linux虚拟机中时,首先在“远程站点”中选择好上传后的文件所要存放的目录,然后,在“本地站点”中选择需要上传的文件,并在该文件名上点击鼠标右键,在弹出的菜单中选择“上传”,就可以轻松完成文件的上传操作。如果要把Linux虚拟机中的某个文件下载到Windows系统中,可以首先在“本地站点”中选择好下载后的文件所要存放的目录,然后,在“远程站点”中找到要被下载的文件,在文件名上点击鼠标右键,在弹出的菜单中选择“下载”,就可以完成文件的下载。
这里需要注意的是,Linux系统对文件访问权限有着严格的规定,如果目录和文件的访问权限没有授权给某个用户,那么,该用户是无法访问这些目录和文件的。所以,当使用FileZilla连接Linux虚拟机时,如果采用用户名hadoop连接,那么,就只能把文件上传到Ubuntu系统中hadoop用户的主目录,也就是“/home/hadoop”目录,是无法对其他目录进行操作的,企图把文件传输到其他目录下就会失败。如果要顺利传输到其他目录,就必须登录Ubuntu系统,使用root权限把某个目录的权限赋予给hadoop用户(后面的Linux系统基本命令会涉及到为用户授权的方法)。

Linux系统中vim编辑器的安装和使用方法

vim编辑器是Linux系统上最著名的文本/代码编辑器,是vi编辑器的加强版,可以帮助我们完成文件的创建和代码的编写。请登录Linux系统(本教程全部统一使用hadoop用户登录),打开一个终端,然后,执行下面命令完成vim编辑器的安装:

 sudo apt-get install vim

执行上面命令以后,如果屏幕上出现信息要求进行确认,在提示处输入“y” 即可。
下面演示一个实例来了解vim编辑器的使用方法。假设要在“/home/hadoop/”目录下新建一个文件word.txt,里面包含一些单词。可以执行下面命令创建一个word.txt文件:

cd ~
vim word.txt

通过上面命令就打开了vim编辑器,然后,需要键盘敲击输入一个英文字母i,进入编辑状态以后才能修改内容,这时,就可以向word.txt文件中输入一些单词。修改后,需要按键盘上的Esc键退出vim的编辑状态,之后有以下几种选择:
 从键盘输入“:wq”三个英文字母,然后回车,表示保存文件并退出。
 从键盘输入“:q”两个英文字母,然后回车,表示不保存并退出。如果本次编辑过程只是查看了文件内容,没有对文件做任何修改,则可以顺利退出。但是,如果已经修改了文件内容,则vim编辑器不允许就这样退出,会给出提示信息,这时,要想不保存就退出vim编辑器,就要采用下面一种方式,即输入“:q!”。
 从键盘输入“:q!”三个英文字母,然后回车,表示不保存并强制退出。
这里我们从键盘输入“:wq”三个英文字母,然后回车,表示保存文件并退出vim编辑器。这样,就成功创建了word.txt文件,这时使用ls命令查看,就会发现“/home/hadoop/”目录下多了一个word.txt文件。如果要查看word.txt文件中的内容,可以采用两种方式。第一种方式是,仍然使用vim编辑器打开word.txt文件,查看其内容。第二种方式是使用cat命令,这种方式要比前一种简单得多。
这里需要指出的是,在Linux系统中使用vim编辑器创建一个文件时,并不是以扩展名来区分文件的,不管是否有扩展名,都是生成文本文件,.txt扩展名只是我们自己人为添加,方便自己查看用的。也就是说,创建word.txt和word这两个文件,对于Linux系统而言都是默认创建了文本类型的文件,和是否有.txt扩展名没有关系。

Linux系统中下载安装文件和解压缩方法

Linux系统中经常需要下载安装文件并解压缩到指定目录下。例如,现在要下载hadoop-2.7.1.tar.gz。下载的方法是,在Linux系统中(不是在Windows系统中),打开浏览器,一般自带了火狐(FireFox)浏览器。打开浏览器后,访问Hadoop官网,找到下载文件hadoop-2.7.1.tar.gz,点击下载。火狐浏览器会默认把下载文件都保存到当前用户的下载目录,由于本教程全部采用hadoop用户登录Linux系统,所以,hadoop-2.7.1.tar.gz文件会被保存到“/home/hadoop/下载/”目录下。
大数据软件安装包通常都是一个压缩文件,文件名以.tar.gz为后缀(或者简写为.tgz),这种压缩文件必须经过解压缩以后才能够安装。在Linux系统中,可以使用tar命令对后缀名为.tar.gz(或.tgz)的压缩文件进行解压。下载完安装文件hadoop-2.7.1.tar.gz以后,需要对文件进行解压。按照Linux系统使用的默认规范,用户安装的软件一般都是存放在“/usr/local/”目录下。假设这里使用hadoop用户登录Linux系统,请在Linux系统中打开一个终端,执行如下命令:

sudo tar -zxf ~/下载/hadoop-2.7.1.tar.gz -C /usr/local    # 解压到/usr/local中
cd /usr/local/
sudo mv ./hadoop-2.7.1/ ./hadoop      # 将文件夹名改为hadoop
sudo chown -R hadoop ./hadoop       # 修改文件权限

上面 tar命令表示把“/home/hadoop/下载/hadoop-2.7.1.tar.gz”这个文件解压缩后保存到“/usr/local”目录下。其中,各个参数的含义如下:
* x : 从 tar 包中把文件提取出来;
* z : 表示 tar 包是被 gzip 压缩过的,所以解压时需要用gunzip解压;
* f : 表示后面跟着的是文件;
* C:表示文件解压后转到指定的目录下。

文件解压缩以后,hadoop用户是没有这个解压后得到的目录的权限的,所以,这里通过chown命令为hadoop用户赋予针对/usr/local/hadoop这个目录的权限。