学习笔记 4.3HDFS的shell操作

目录

(一)HDFS的Shell介绍

(二)了解HDFS常用Shell命令

1、三种shell命令方式

3、常用HDFS的shell命令

(三)HDFS命令操作

 1、创建目录

 (2)创建多层目录

2、查看目录

 3、上传本地文件到HDFS

 4、查看文件内容

5、下载HDFS文件到本地

 6、删除HDFS文件

7、删除HDFS目录

​编辑

 8、移动目录或文件

9、文件合并下载 

10、检查文件信息

11、创建时间戳文件

12、复制文件或目录

(1)同名复制文件 

​编辑 (2)改名复制文件

 (3)复制目录

 13、查看文件大小

14、上传文件

15、下载文件

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

​编辑

17、检查hadoop本地库

18、进入和退出安全模式

(1)进入安全模式

(2)退出安全模式

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

1、编程思路与步骤

(1)配置环境变量

(2)准备日志存放目录和待上传文件

(3)设置日志文件上传的路径

(4)实现文件上传

2、编写脚本,实现功能

3.运行脚本,查看结果


(一)HDFS的Shell介绍

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

(二)了解HDFS常用Shell命令

1、三种shell命令方式

命令适用场合
hadoop fs适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统
hadoop dfs只能适用于HDFS文件系统
hdfs dfshdfs dfs跟hadoop dfs的命令作用一样,也只能适用于HDFS文件系统

3、常用HDFS的shell命令

序号命令功能
1hdfs dfs -ls <path>显示<path>指定的文件或目录的详细信息。
2hdfs dfs -ls -R <path>

ls命令的递归扳本

3hdfs dfs -cat <path> 将<path>指定文件的内容输出到标准输出。
4hdfs dfs chgrp [-R] group <path>

将<path>指定文件所属的组改为group,使用-R对<path>指定目录内的文件进行递归操作。这个命令只适合于超级用户。

5hdfs dfs -chown [-R] [owner][:[group]] <path>改变<path>指定文件或目录的拥有者,-R用于递归改变目录内的文件或目录的拥有者。 这个命令只适合于超级用户。
6hdfs dfs -chmod [-R] <mode> <path>将<path>指定文件或目录的权限更改为<mode>。这个命令只适合于超级用户和文件或目录的拥有者。
7hdfs dfs -tail [-f] <path> 将<path>指定文件最后1KB的内容输出到标准输出上,-f选项用于持续检测新添加到文件中的内容。
8hdfs dfs -stat [format] <path>以指定格式返回<path>指定文件的相关信息。当不指定format的时候,返回文件<path>的创建日期。
9hdfs dfs -touchz <path>创建一个<path>指定的空文件。
10hdfs dfs -mkdir [-p] <paths>创建<paths>指定的一个或多个目录,-p选项用于递归创建子目录。
11hdfs dfs -copyFromLocal <localsrc> <dst>将本地源文件<localsrc>复制到路径指定的文件或目录中。
12hadoo fs -copyToLocal [-ignorcrc] [-crc] <target> <localdst>将目标文件<target>复制到本地文件或目录<localdst>中,可用-ignorecrc选项复制CRC校验失败的文件,使用-crc选项复制文件以及CRC信息。
13hdfs dfs -cp <src> <dst>将文件从源路径<src>复制到目标路径<dst>。
14hdfs dfs -du <path>显示<path>指定文件或目录内所有文件的大小。
15hdfs dfs -expunge清空回收站。
16hdfs dfs -get [-ignorcrc] [-crc] <src> <localdst>复制<src>指定的文件到本地文件系统<localdst>指定的文件或目录内,可用-ignorecrc选项复制CRC校验失败的文件,使用-crc选项复制文件以及CRC信息。
17hdfs dfs -getmerge [-nl] <src> <localdst> 对<src>指定目录内所有文件进行合并,写入<localdst>指定的本地文件。-nl是可选的,用于指定在每个文件结尾添加一个换行符。
18hdfs dfs -put <localsrc> <dst>从本地文件系统中复制<localsrc>指定的单个或多个源文件到<dst>指定的目标文件系统中。
19hdfs dfs moveFromLocal <localsrc> <dst>与put命令功能相同,但是文件上传结束后会从本地文件系统中删除<localsrc>指定的文件。
20hdfs dfs -mv <src> <dst>将文件或目录从源路径<src>移到目标路径<dst>。
21hdfs dfs -rm <path>删除<path>指定的文件或目录(非空目录)。
22hdfs dfs -rm -r <path>删除<path>指定的目录及其下的所有文件,-r选项表示递归删除子目录。
23hdfs dfs -setrep [-R] <path>改变<path>指定文件的副本数,-R选项用于递归改变目录下所有文件的副本数。
24hdfs dfs -test [-ezd] <path>检查<path>指定文件或目录的相关信息。
-e (exist)检查文件是否存在,如果存在则返回0,否则返回1
-z (zero)检查文件是否是零字节,如果是则返回0,否则返回1
-d(directory)检查路径是否是目录,如果是则返回0,否则返回1
25hdfs dfs -text <path>指定的文件输出为文本格式,文件格式允许是zip和TextRecordInputStream。

(三)HDFS命令操作

·启动Hadoop集群

 1、创建目录

(1)创建单层目录

·执行命令:hadoop fs -mkdir /park

·利用WebUI查看创建的目录

 (2)创建多层目录

`执行命令:hdfs dfs -mkdir -p /luzhou/lzy

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

2、查看目录

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

 ·执行命令:hdfs dfs -ls /luzhou

 ·执行命令:hdfs dfs -ls -R /,递归查看/tmp目录

 3、上传本地文件到HDFS

·创建test.txt文件,执行命令echo "hello hadoop world" > test.txt

·查看test.txt内容

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

 ·查看是否上传成功

 ·利用Hadoop WebUI界面查看

 4、查看文件内容

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

5、下载HDFS文件到本地

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

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

 `检查是否下载成功

`可以将HDFS上的文件下载到本地指定位置,并且可以更改文件名

`执行命令:hdfs dfs -get /ied/test.txt /home/exam.txt

 `检查是否下载成功

 6、删除HDFS文件

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

`检查是否删除成功

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

7、删除HDFS目录

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

`提示-rmdir命令删除不了非空目录。

`要递归删除才能删除非空目录:hdfs dfs -rm -r /luzhou(-r:recursive)

 8、移动目录或文件

`将/ied目录更名为/ied01,执行命令:hdfs dfs -mv /ied /ied01

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

 `将test.txt文件上传到/ied01目录

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

9、文件合并下载 

·现在/ied里有一个test.txt,创建sport.txtmusic.txt并上传

 

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

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

 由此可见,merger.txttest.txtmusic.txtsport.txt合并后的结果

10、检查文件信息

·检查test.txt文件,执行命令:hdfs fsck /ied01/test.txt -files -blocks -locations -racks

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

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

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

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

11、创建时间戳文件

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

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

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

 `说明:如果touchz命令的路径指定的文件不存在,那就创建一个空文件;如果指定的文件存在,那就改变该文件的时间戳。

12、复制文件或目录

`创建/ied02目录

(1)同名复制文件 

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

 (2)改名复制文件

`将/ied01/test.txt复制到/ied02目录,改名为hello.txt,执行命令:hdfs dfs -cp /ied01/test.txt /ied02/hello.txt

 

 (3)复制目录

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

·查看拷贝后的目录

 13、查看文件大小

·执行命令:hdfs dfs -du /ied01/test.txt

 `可以看到文件/ied01/exam.txt大小是19个字节,包含一个看不见的结束符

14、上传文件

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

·查看是否上传成功

15、下载文件

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

 ·查看是否下载成功

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

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

17、检查hadoop本地库

·执行命令:hadoop checknative -a

18、进入和退出安全模式

    `问题:哪些情况下HDFS会进入安全模式(只能读不能写)?
    (1)名称起点启动时,进入安全模式,直到fsimage用edits更新完毕才退出安全模式
    (2)当文件块的副本数量少于设置的副本数量,会进入安全模式,直到生成符合要求的副本数,才会退出安全模式。其实,也可以通过命令方式进入或退出安全模式。
 

(1)进入安全模式

执行命令:hdfs dfsadmin -safemode enter

·此时,如果要创建,即报错

(2)退出安全模式

·执行命令:hdfs dfsadmin -safemode leave

 

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

·服务器每天会产生大量日志数据,并且日志文件可能存在于每个应用程序指定的data目录中,在不使用其它工具的情况下,将服务器中的日志文件规范的存放在HDFS中。通过编写简单的Shell脚本,用于每天自动采集服务器上的日志文件,并将海量的日志上传至HDFS中。


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

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

--装tree命令

·查看创建目录树结构

1、编程思路与步骤

(1)配置环境变量

    首先在/export/data/logs目录下(如果目录不存在,则需要提前创建)使用vim命令创建upload2HDFS.sh脚本文件,在编写Shell脚本时,需要设置Java环境变量和Hadoop环境变量,这样做是用来提高系统的可靠性,保障运行程序的机器在没有配置环境变量的情况下依然能够运行脚本。

(2)准备日志存放目录和待上传文件

    为了让开发者便于控制上传文件的流程,可以在脚本中设置一个日志存放目录和待上传文件目录,若上传过程中发生错误只需要查看该目录就能知道文件的上传进度。

(3)设置日志文件上传的路径

    设置上传的HDFS目标路径,命名格式以时间结尾,并且输出打印信息。

(4)实现文件上传

    上传文件的过程就是遍历文件目录的过程,将文件首先移动到待上传目录,再从待上传目录中上传到HDFS中。若是在每天12点凌晨执行一次,我们可以使用Linux Crontab表达式执行定时任务。
 

2、编写脚本,实现功能

  • 进入/export/data/logs目录

 ·执行命令:vim upload2HDFS.sh

#!/bin/bash

JAVA_HOME=/usr/local/jdk1.8.0_231
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
export HADOOP_HOME=/usr/local/hadoop-3.3.4/
export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH
#日志文件存放的目录,需手动创建
log_src_dir=/export/data/logs/log/
#待上传文件存放的目录,需手动创建
log_toupload_dir=/export/data/logs/toupload/
#设置日期
date1=`date +%Y_%m_%d`
#日志文件上传到hdfs的根路径
hdfs_root_dir=/data/clickLog/$date1/
#打印环境变量信息
echo "envs: hadoop_home: $HADOOP_HOME"
#读取日志文件的目录,判断是否有需要上传的文件
echo "log_src_dir: $log_src_dir"
ls $log_src_dir | while read fileName
do
        if [[ "$fileName" == access.log.* ]]; then
                date=`date +%Y_%m_%d_%H_%M_%S`
                #将文件移动到待上传目录并重命名
                echo "moving $log_src_dir$fileName to $log_toupload_dir"lzy_click_log_$fileName"$date"
                mv $log_src_dir$fileName $log_toupload_dir"lzy_click_log_$fileName"$date
                #将待上传的文件path写入一个列表文件willDoing,
                echo $log_toupload_dir"lzy_click_log_$fileName"$date >> $log_toupload_dir"willDoing."$date
        fi
done
#找到列表文件willDoing
ls $log_toupload_dir | grep will | grep -v "_COPY_" | grep -v "_DONE_" | while read line
do
        #打印信息
        echo "toupload is in file: $line"
        #将待上传文件列表willDoing改名为willDoing_COPY_
        mv $log_toupload_dir$line $log_toupload_dir$line"_COPY_"
        #读列表文件willDoing_COPY_的内容(一个一个的待上传文件名)
        #此处的line 就是列表中的一个待上传文件的path
        cat $log_toupload_dir$line"_COPY_" | while read line
        do
                 #打印信息
                echo "puting...$line to hdfs path...$hdfs_root_dir"
                hdfs dfs -mkdir -p $hdfs_root_dir
                hdfs dfs -put $line $hdfs_root_dir
        done
        mv $log_toupload_dir$line"_COPY_"  $log_toupload_dir$line"_DONE_"
done

·编辑权限,执行命令:chmod u+x upload2HDFS.sh

·tree查看 /export目录树结构

3.运行脚本,查看结果

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

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

    `创建四个日志文件

 `执行命令:./upload2HDFS.sh

·查看/export目录树

 ·打开HDFS集群WebUI查看上传的日志文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: HDFS ShellHadoop分布式文件系统中的命令行工具,用于管理HDFS中的文件和目录。以下是HDFS Shell常用的一些操作: 1. 列出目录中的文件和子目录:`hdfs dfs -ls <目录路径>` 2. 创建目录:`hdfs dfs -mkdir <目录路径>` 3. 删除目录:`hdfs dfs -rm -r <目录路径>` 4. 上传本地文件到HDFS:`hdfs dfs -put <本地文件路径> <HDFS目录路径>` 5. 下载HDFS文件到本地:`hdfs dfs -get <HDFS文件路径> <本地目录路径>` 6. 合并HDFS文件到本地:`hdfs dfs -getmerge <HDFS目录路径> <本地文件路径>` 7. 复制文件:`hdfs dfs -cp <源文件路径> <目标文件路径>` 8. 移动文件:`hdfs dfs -mv <源文件路径> <目标文件路径>` 9. 查看文件内容:`hdfs dfs -cat <文件路径>` 10. 修改文件权限:`hdfs dfs -chmod <权限> <文件路径>` 以上是HDFS Shell的一些常用操作,可以帮助用户管理Hadoop分布式文件系统中的文件和目录。 ### 回答2: Hadoop分布式文件系统(Hadoop Distributed File System,简称HDFS)是Apache Hadoop的核心组件之一,用于存储和处理大规模数据集。HDFS ShellHadoop提供的基于命令行的操作工具,用于执行文件系统的管理操作HDFS Shell主要提供以下操作: 1. 文件和目录操作: - ls:列出指定目录下的内容。 - mkdir:创建一个新目录。 - rm:删除指定文件或目录。 - mv:将文件或目录移动到新位置。 - chmod:修改文件或目录的权限设置。 2. 文件上传和下载: - put:上传本地文件到HDFS。 - get:将HDFS上的文件下载到本地。 3. HDFS中的文件操作: - cat:打印文件内容。 - tail:打印文件的结尾部分。 - head:打印文件的开头部分。 - du:计算文件或目录的大小。 - count:统计指定目录下文件以及目录的个数。 - checksum:计算文件内容的检验和。 4. 其他操作: - help:列出所有可用命令。 - usage:显示指定命令的使用方法信息。 - exit:退出HDFS Shell。 使用HDFS Shell进行操作时,可以根据需要选择合适的命令来执行对应的操作。例如,使用ls命令可以列出指定目录下的文件和子目录,使用put命令可以上传本地文件到HDFS,使用cat命令可以打印指定文件的内容等。 HDFS Shell操作也可以通过Shell脚本来批量执行,可以更加方便地进行文件系统管理。总的来说,HDFS Shell是一种方便、高效的文件系统操作工具,对于Hadoop用户来说是必不可少的。 ### 回答3: HDFSHadoop 分布式文件系统)是一个由 Apache Hadoop 提供的分布式文件存储系统。HDFS ShellHDFS 文件系统的命令行接口,可以通过命令行终端进行 HDFS 文件系统的操作,实现文件的上传、下载、创建等。 HDFS Shell 使用方式如下: 1. 进入 Hadoop 环境,输入命令`hdfs dfs`或`hadoop fs`后,就可以使用 HDFS Shell。 2. 命令格式: ``` hadoop fs [通用选项] [-D <属性>=<值>] <命令> [命令选项] ``` 表示 HDFS Shell 包含的通用选项、属性选项,以及命令和命令选项。 其中,通用选项包括 `-conf`、`-D`、`-fs`、`-jt` 等,这些选项在 Hadoop 的其他模块中也可以使用。 命令包括 `cat`、`cp`、`count`、`get`、`ls`、`mkdir`、`mv`、`put`、`rm`、`rmdir` 等。 命令选项包括 `-skipTrash`、`-skipChecksum`、`-overwrite`、`-recursive` 等。 3. HDFS Shell 常用命令: `ls`:显示 HDFS 目录下的文件和目录。 `mkdir`:在 HDFS 中创建一个新的目录。 `put`:将本地文件或目录上传到 HDFS 文件系统。 `get`:将 HDFS 文件系统中的文件或目录下载到本地。 `rm`:删除 HDFS 文件系统中的文件或目录。 `mv`:将 HDFS 文件系统中的文件或目录移动到另一个位置。 4. HDFS Shell 实例: `hdfs dfs -ls /`:列出 HDFS 根目录下的文件和目录。 `hdfs dfs -mkdir /test`:在 HDFS 中创建一个名为 test 的目录。 `hdfs dfs -put localfile /test`:将本地文件 localfile 上传到 HDFS 的目录 test 中。 `hdfs dfs -get /test/hadoopfile localfile`:将 HDFS 中 test 目录下的文件 hadoopfile 下载到本地的 localfile 中。 `hdfs dfs -rm /test/hadoopfile`:删除 HDFS 中 test 目录下的文件 hadoopfile。 `hdfs dfs -mv /test/hadoopfile /test/newfile`:将 HDFS 中 test 目录下的文件 hadoopfile 移动到 test 目录下的 newfile 中。 综上所述,HDFS Shell 对于 Hadoop 分布式文件系统的管理和维护具有很重要的意义,能够方便地进行文件的上传、下载、删除、创建等操作。此外,HDFS Shell 还支持批量处理和脚本编程,可以方便地实现批量操作,提高操作效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值