目录

零、学习目标

一、导入新课 

二、新课讲解 

(一)HDFS的Shell介绍 

(二)了解HDFS常用Shell命令

1、三种Shell命令方式

2、FileSystem Shell文档

3、常用HDFS的shell命令 

(三)HDFS常用命令操作实战

1、创建目录

2、查看目录

3、上传本地文件到HDFS

4、查看文件内容

5、下载HDFS文件到本地

6、删除HDFS文件

7、删除HDFS目录

8、移动目录或文件

9、文件合并下载

10、检查文件信息

11、创建时间戳文件

12、复制文件或目录

13、查看文件大小

14、上传文件

15、下载文件

16、查看某目录下文件个数

17、检查hadoop本地库

18、进入和退出安全模式 

(四)案例- Shell定时采集数据到HDFS 

1、编程思路与步骤 

2、编写脚本,实现功能

3、运行脚本,查看结果


零、学习目标

  1. 熟悉HDFS Shell常用命令操作
  2. 掌握Shell定时采集数据到HDFS

一、导入新课 

二、新课讲解 

(一)HDFS的Shell介绍 

Shell在计算机科学中俗称“壳”,是提供给使用者使用界面的进行与系统交互的软件,通过接收用户输入的命令执行相应的操作,Shell分为图形界面Shell和命令行式Shell。
文件系统(FS)Shell包含了各种的类Shell的命令,可以直接与Hadoop分布式文件系统以及其他文件系统进行交互。

(二)了解HDFS常用Shell命令

1、三种Shell命令方式

hadoop定时执行脚本 hdfs执行shell脚本_hadoop

 

2、FileSystem Shell文档

hadoop定时执行脚本 hdfs执行shell脚本_hadoop_02

 查看cat命令用法

hadoop定时执行脚本 hdfs执行shell脚本_大数据_03

3、常用HDFS的shell命令 

 

(三)HDFS常用命令操作实战

  • 启动Hadoop集群

hadoop定时执行脚本 hdfs执行shell脚本_hadoop_04

 

1、创建目录

(1)创建单层目录

  • 执行命令:hdfs dfs -mkdir /ied

hadoop定时执行脚本 hdfs执行shell脚本_hadoop定时执行脚本_05

 

利用Hadoop WebUI查看创建的目录

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_06

 

(2)创建多层目录

  • 执行命令:hdfs dfs -mkdir /luzhou/lzy,会报错,因为/luzhou目录不存在

 

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_07

  • 当然,可以先创建/luzhou目录,然后在里面再创建lzy子目录,但是也可以一步到位,需要一个-p参数
  • 执行命令:hdfs dfs -mkdir -p /luzhou/lzy

hadoop定时执行脚本 hdfs执行shell脚本_hadoop定时执行脚本_08

 

利用Hadoop WebUI查看创建的多层目录

hadoop定时执行脚本 hdfs执行shell脚本_hadoop_09

 

2、查看目录

  • 执行命令:hdfs dfs -ls /,查看根目录(可以在任何节点上查看,结果都是一样的)

hadoop定时执行脚本 hdfs执行shell脚本_HDFS_10

 

hadoop定时执行脚本 hdfs执行shell脚本_HDFS_11

执行命令:hdfs dfs -ls /luzhou

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_12

  • 如果我们要查看根目录里全部的资源,那么要用到地柜参数-R(必须大写)
  • 执行命令:hdfs dfs -ls -R /,递归查看/目录(采用递归算法遍历树结构)

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_13

 

3、上传本地文件到HDFS

  • 创建test.txt文件,执行命令:echo "hello hadoop world" > test.txt (>:重定向命令)

hadoop定时执行脚本 hdfs执行shell脚本_hadoop_14

 

查看test.txt文件内容

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_15

 

上传test.txt文件到HDFS的/ied目录,执行命令:hdfs dfs -put test.txt /ied

hadoop定时执行脚本 hdfs执行shell脚本_大数据_16

 查看是否上传成功

hadoop定时执行脚本 hdfs执行shell脚本_HDFS_17

 

利用Hadoop WebUI界面查看

hadoop定时执行脚本 hdfs执行shell脚本_HDFS_18

 

hadoop定时执行脚本 hdfs执行shell脚本_hadoop_19

 

4、查看文件内容

  • 执行命令:hdfs dfs -cat /ied/test.txt

hadoop定时执行脚本 hdfs执行shell脚本_HDFS_20

 

5、下载HDFS文件到本地

  • 先删除本地的test.txt文件

hadoop定时执行脚本 hdfs执行shell脚本_hadoop_21

 

下载HDFS文件系统的/ied/test.txt到本地当前目录不改名,执行命令:hdfs dfs -get /ied/test.txt

hadoop定时执行脚本 hdfs执行shell脚本_hadoop定时执行脚本_22

 

检查是否下载成功

hadoop定时执行脚本 hdfs执行shell脚本_HDFS_23

 

  • 可以将HDFS上的文件下载到本地指定位置,并且可以更改文件名
  • 执行命令:hdfs dfs -get /ied/test.txt /home/exam.txt

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_24

 检查是否下载成功

hadoop定时执行脚本 hdfs执行shell脚本_HDFS_25

 

6、删除HDFS文件

  • 执行命令:hdfs dfs -rm /ied/test.txt

hadoop定时执行脚本 hdfs执行shell脚本_hadoop_26

 

检查是否删除成功

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_27

 

使用通配符,可以删除满足一定特征的文件

hadoop定时执行脚本 hdfs执行shell脚本_hadoop_28

 

7、删除HDFS目录

  • 执行命令:hdfs dfs -rmdir /luzhou

hadoop定时执行脚本 hdfs执行shell脚本_hadoop定时执行脚本_29

 

  • 提示-rmdir命令删除不了非空目录。
  • 要递归删除才能删除非空目录:hdfs dfs -rm -r /luzhou(-r:recursive)

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_30

 

8、移动目录或文件

  • -mv命令兼有移动与改名的双重功能
  • /ied目录更名为/ied01,执行命令:hdfs dfs -mv /ied /ied01

hadoop定时执行脚本 hdfs执行shell脚本_HDFS_31

 

 利用Hadoop WebUI查看是否更名成功

hadoop定时执行脚本 hdfs执行shell脚本_hadoop_32

/ied01/exam.txt更名为/ied/test.txt,执行命令:hdfs dfs -mv /ied01/exam.txt /ied01/test.txt

hadoop定时执行脚本 hdfs执行shell脚本_大数据_33

 

查看改名后的test.txt文件内容

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_34

 

创建/ied02目录,将ied01/test.txt移动到/ied02目录,并且改名为exam.txt

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_35

 

在Hadoop WebUI界面查看

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_36

 

hadoop定时执行脚本 hdfs执行shell脚本_hadoop_37

 

9、文件合并下载

  • 创建sport.txtmusic.txtbook.txt并上传

 

hadoop定时执行脚本 hdfs执行shell脚本_HDFS_38

在Hadoop WebUI界面查看上传的三个文件,注意文件名是按字典排序了的

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_39

 

合并/ied01目录的文件下载到本地当前目录的merger.txt,执行命令:hdfs dfs -getmerge /ied01/* merger.txt

hadoop定时执行脚本 hdfs执行shell脚本_hadoop_40

 

下面,查看本地的merger.txt,看是不是三个文件合并后的内容

hadoop定时执行脚本 hdfs执行shell脚本_大数据_41

 

10、检查文件信息

  • fsckfile system check —— 文件系统检查
  • 检查/ied01/book.txt文件,执行命令:hdfs fsck /ied01/book.txt -files -blocks -locations -racks

hadoop定时执行脚本 hdfs执行shell脚本_hadoop定时执行脚本_42

 

我们知道HDFS里一个文件块是128MB,上传一个大于128MB的文件,hadoop-3.3.4.tar.gz大约663.24MB

128 M B × 5 = 640 M B < 663.24 M B < 768 M B = 128 M B × 6 128 MB\times 5 = 640MB \lt 663.24MB \lt 768MB = 128 MB\times 6128MB×5=640MB<663.24MB<768MB=128MB×6 ,HDFS会将hadoop-3.3.4.tar.gz分割成6块。

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_43

执行命令:hdfs dfs -put /opt/hadoop-3.3.4.tar.gz /ied01,将hadoop压缩包上传到HDFS的/ied01目录

hadoop定时执行脚本 hdfs执行shell脚本_HDFS_44

 

查看HDFS上hadoop-3.3.4.tar.gz文件信息,执行命令:hdfs fsck /ied01/hadoop-3.3.4.tar.gz -files -locations -racks

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_45

 

利用Hadoop WebUI来查看文件块信息更加方便,总共有6个文件块:Block0、Block1、Block2、Block3、Block4、Block5

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_46

 第1个文件块信息

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_47

 

第6个文件块信息

hadoop定时执行脚本 hdfs执行shell脚本_hadoop定时执行脚本_48

 

11、创建时间戳文件

  • /ied01目录里创建一个文件sunshine.txt,执行命令:hdfs dfs -touchz /ied01/sunshine.txt

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_49

 创建的是一个空文件,大小为0字节

hadoop定时执行脚本 hdfs执行shell脚本_大数据_50

 

这种空文件,一般用作标识文件,也可叫做时间戳文件,再次在/ied01目录下创建sunshine.txt同名文件

hadoop定时执行脚本 hdfs执行shell脚本_大数据_51

 

12、复制文件或目录

  • cpcopy - 拷贝或复制

(1)同名复制文件

  • /ied01/music.txt复制到/ied02里,执行命令:hdfs dfs -cp /ied01/music.txt /ied02

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_52

 

查看拷贝生成的文件

hadoop定时执行脚本 hdfs执行shell脚本_HDFS_53

 

(2)改名复制文件

  • /ied01/book.txt复制到/ied02目录,改名为read.txt,执行命令:hdfs dfs -cp /ied01/book.txt /ied02/read.txt

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_54

 

查看拷贝后的文件内容

hadoop定时执行脚本 hdfs执行shell脚本_hadoop定时执行脚本_55

 源文件依然存在

hadoop定时执行脚本 hdfs执行shell脚本_大数据_56

 

(3)复制目录

  • /ied01目录复制到/ied03目录,执行命令:hdfs dfs -cp /ied01 /ied03

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_57

 

查看拷贝后的/ied03目录,其内容跟/ied01完全相同

hadoop定时执行脚本 hdfs执行shell脚本_HDFS_58

 

13、查看文件大小

  • dudisk usage
  • 执行命令:hdfs dfs -du /ied01/book.txt

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_59

 

14、上传文件

  • -copyFromLocal类似于-put,执行命令:hdfs dfs -copyFromLocal merger.txt /ied02

hadoop定时执行脚本 hdfs执行shell脚本_hadoop定时执行脚本_60

 

 查看是否上传成功

hadoop定时执行脚本 hdfs执行shell脚本_大数据_61

 

15、下载文件

  • -copyToLocal类似于-get,执行命令:hdfs dfs -copyToLocal /ied01/sunshine.txt sunlight.txt

hadoop定时执行脚本 hdfs执行shell脚本_hadoop_62

 查看是否下载成功

hadoop定时执行脚本 hdfs执行shell脚本_大数据_63

 

16、查看某目录下文件个数

  • 执行命令:hdfs dfs -count /ied01

hadoop定时执行脚本 hdfs执行shell脚本_大数据_64

 

17、检查hadoop本地库

-执行命令:hdfs checknative -a

hadoop定时执行脚本 hdfs执行shell脚本_大数据_65

 

查看hadoop本地库文件

hadoop定时执行脚本 hdfs执行shell脚本_大数据_66

 

18、进入和退出安全模式 

 

(1)进入安全模式

  • 执行命令:hdfs dfsadmin -safemode enter, 注意:进入安全模式之后,只能读不能写

hadoop定时执行脚本 hdfs执行shell脚本_HDFS_67

 

此时,如果要创建目录,就会报错

hadoop定时执行脚本 hdfs执行shell脚本_大数据_68

 

(2)退出安全模式

  • 执行命令:hdfs dfsadmin -safemode leave

hadoop定时执行脚本 hdfs执行shell脚本_hadoop_69

 

此时,创建目录/ied04就没有任何问题

hadoop定时执行脚本 hdfs执行shell脚本_hadoop定时执行脚本_70

 

(四)案例- Shell定时采集数据到HDFS 

创建日志文件存放的目录/export/data/logs/log,执行命令:mkdir -p /export/data/logs/log

hadoop定时执行脚本 hdfs执行shell脚本_hadoop_71

 

创建待上传文件存放的目录/export/data/logs/toupload,执行命令:mkdir -p /export/data/logs/toupload

hadoop定时执行脚本 hdfs执行shell脚本_大数据_72

 

查看创建的目录树结构

 

hadoop定时执行脚本 hdfs执行shell脚本_大数据_73

1、编程思路与步骤 

1)配置环境变量
首先在/export/data/logs目录下(如果目录不存在,则需要提前创建)使用vim命令创建upload2HDFS.sh脚本文件,在编写Shell脚本时,需要设置Java环境变量和Hadoop环境变量,这样做是用来提高系统的可靠性,保障运行程序的机器在没有配置环境变量的情况下依然能够运行脚本。
(2)准备日志存放目录和待上传文件
为了让开发者便于控制上传文件的流程,可以在脚本中设置一个日志存放目录和待上传文件目录,若上传过程中发生错误只需要查看该目录就能知道文件的上传进度。
(3)设置日志文件上传的路径
设置上传的HDFS目标路径,命名格式以时间结尾,并且输出打印信息。
(4)实现文件上传
上传文件的过程就是遍历文件目录的过程,将文件首先移动到待上传目录,再从待上传目录中上传到HDFS中。若是在每天12点凌晨执行一次,我们可以使用Linux Crontab表达式执行定时任务。

2、编写脚本,实现功能

  • 进入/export/data/logs目录

hadoop定时执行脚本 hdfs执行shell脚本_hadoop定时执行脚本_74

 执行命令:vim upload2HDFS.sh

hadoop定时执行脚本 hdfs执行shell脚本_HDFS_75

 

编辑权限,让该脚本可执行,执行命令:chmod u+x upload2HDFS.sh

hadoop定时执行脚本 hdfs执行shell脚本_HDFS_76

 

查看/export目录树结构

hadoop定时执行脚本 hdfs执行shell脚本_hadoop定时执行脚本_77

 

3、运行脚本,查看结果

 

为了模拟生产环境,在日志存放目录/export/data/logs/log/中,手动创建日志文件,access.log表示正在源源不断的产生日志的文件,access.log.1、access.log.2等表示已经滚动完毕的日志文件,即为待上传日志文件。

在upload2HDFS.sh文件路径下运行脚本,先将日志存放目录log中的日志文件移到待上传toupload目录下,并根据业务需求重命名;然后脚本执行“hdfs dfs -put”上传命令,将待上传目录下的所有日志文件上传至HDFS;最后通过HDFS WebUI界面可看到需要采集的日志文件已按照日期分类,上传至HDFS中。

创建四个日志文件(必须以access.log.打头)

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_78

 

查看/export目录树结构

hadoop定时执行脚本 hdfs执行shell脚本_HDFS_79

 

执行命令:./upload2HDFS.sh

hadoop定时执行脚本 hdfs执行shell脚本_hdfs_80

 

hadoop定时执行脚本 hdfs执行shell脚本_hadoop_81

 

查看/export目录树结构

 

hadoop定时执行脚本 hdfs执行shell脚本_大数据_82

打开Hadoop WebUI查看上传的日志文件

hadoop定时执行脚本 hdfs执行shell脚本_hadoop_83