继上一篇文章,我们继续实战学习HDFS微博案例。

十一、需求:追加数据到HDFS数据文件

在数据集中有一个caixukun_new.csv数据集,是20190811这一天重新生成的数据。我们需要将这个文件上传到HDFS中。有两种做法:

  1. 直接将新文件上传到HDFS中20190811文件夹中。
  2. 将新文件追加到之前的数据文件caixukun.csv中。

这里,我们更倾向于使用第二种方案。HDFS设计的初衷就是存储超大型的文件,文件数量越少,也可以减小HDFS中的NameNode压力。

(1)appendToFile命令

追加一个或者多个文件到hdfs指定文件中.也可以从命令行读取输入

语法格式:

hdfs dfs -appendToFile <localsrc> ... <dst>

 (2)追加文件到HDFS已有文件中

# 1. 上传新的数据文件到Linux中
[root@node1 ~]# rz
rz waiting to receive.
?a? zmodem ′??.  °′ Ctrl+C ??.
Transferring caixukun_new.csv...
  100%    2755 KB 2755 KB/s 00:00:01       0 ′?
 
# 2. 查看HDFS现有文件大小
[root@node1 ~]# hdfs dfs -ls -h /source/weibo/star/comment_log/20190811_node1.itcast.cn/
Found 1 items
-rw-r--r--   3 root supergroup     30.8 M 2020-10-15 23:28 /source/weibo/star/comment_log/20190811_node1.itcast.cn/caixukun.csv
 
# 3. 追加到HDFS现有文件
hdfs dfs -appendToFile caixukun_new.csv /source/weibo/star/comment_log/20190811_node1.itcast.cn/caixukun.csv
 
# 4. 再次查看HDFS文件大小
[root@node1 ~]# hdfs dfs -ls -h /source/weibo/star/comment_log/20190811_node1.itcast.cn/
Found 1 items
-rw-r--r--   3 root supergroup     33.4 M 2020-10-15 23:44 /source/weibo/star/comment_log/20190811_node1.itcast.cn/caixukun.csv

 十二、需求:查看当前HDFS磁盘空间

每一天微博都会产生很多的数据,我们非常有必要定期检查HDFS的整体磁盘空间,如果发现磁盘空间已经到达某个阈值,就需要新增新的DataNode节点了。

(1)df命令

df命令用来查看HDFS空闲的空间。

hdfs dfs -df [-h] URI [URI ...]

(2)查看HDFS磁盘使用情况

[root@node1 ~]# hdfs dfs -df -h /
Filesystem                      Size   Used  Available  Use%
hdfs://node1.itcast.cn:9820  346.6 G  2.1 G    236.7 G    1%

十三、需求:查看微博数据占用的空间

我们想知道当前微博数据占用了多少空间。可以使用du命令。

(1)du命令

显示目录中所有文件大小,当只指定一个文件时,显示此文件的大小。

语法格式:

hdfs dfs -du [-s] [-h] [-v] [-x] URI [URI ...]

命令选项:

  1. -s:表示显示文件长度的汇总摘要,而不是单个文件的摘要。
  2. -h:选项将以“人类可读”的方式格式化文件大小
  3. -v:选项将列名显示为标题行。
  4. -x:选项将从结果计算中排除快照。

(2)查看微博数据占用空间大小

[root@node1 ~]# hdfs dfs -du -s -h -v /source/weibo/
SIZE    DISK_SPACE_CONSUMED_WITH_ALL_REPLICAS  FULL_PATH_NAME
64.2 M  192.6 M                                /source/weibo

十四、需求:将20190810的数据移动到tmp目录

经分析程序检测,20190810这一天的数据里面存在大量垃圾数据,项目组决定,先将这些垃圾数据处理了,再放回到20190810目录中。首先需要将数据移动到tmp目录中,进行处理。

(1)mv 命令

将hdfs上的文件从原路径移动到目标路径(移动之后文件删除),该命令不能跨文件系统。

hdfs dfs -mv URL <dest>

(2)移动到tmp目录

[root@node1 ~]# hdfs dfs -mv /source/weibo/star/comment_log/20190810_node1.itcast.cn/caixukun.csv /tmp/caixukun_dirtydata.csv
[root@node1 ~]# hdfs dfs -ls /tmp/
Found 1 items
-rw-r--r--   3 root supergroup   32252088 2020-10-15 23:04 /tmp/caixukun_dirtydata.csv

十五、需求:减少副本数提升存储资源利用率

HDFS中默认每个block会保存三个副本,同样一份数据需要存3份。假设,此处我们需要将 /source/weibo/start/comment_log/20190811_node1.itcast.cn 因为已经过去了很久,我们对该目录下的文件容错要求较低、而且数据使用频率也较低,所以,我们可以将它的副本数调整为2,此时我们需要使用setrep命令。

setrep 命令

hdfs dfs -setrep [-R] [-w] <numReplicas> <path>

更改文件的副本因子。 如果path是目录,则该命令以递归方式更改以path为根的目录树下所有文件的复制因子。

参数:

-w:标志请求命令等待复制完成。 这可能会花费很长时间。
-R:标志是为了向后兼容。 没有作用。

2.设置/source/weibo/star/comment_log/副本数

[root@node1 ~]# hdfs dfs -setrep -w 2 /source/weibo/star/comment_log 
Replication 2 set: /source/weibo/star/comment_log/20190811_node1.itcast.cn/caixukun.csv
Waiting for /source/weibo/star/comment_log/20190811_node1.itcast.cn/caixukun.csv ...
WARNING: the waiting time may be long for DECREASING the number of replications.
. done

HDFS入门和应用开发:实战微博HDFS案例(下)_大数据

十六、更多shell操作

命令

说明

checksum

返回文件的校验和信息。

[root@node1 ~]# hdfs dfs -checksum /source/weibo/star/comment_log/20190811_node1.itcast.cn/caixukun.csv

/source/weibo/star/comment_log/20190811_node1.itcast.cn/caixukun.csv    MD5-of-0MD5-of-512CRC32C        000002000000000000000000d79e10d1da5484d351f7c9776849c3bb

copyFromLocal

与put命令类似,将本地文件拷贝到HDFS。但put命令可以传多个文件、或者是标准输入(-)

[root@node1 ~]# hdfs dfs -copyFromLocal caixukun_new.csv /tmp

[root@node1 ~]# hdfs dfs -ls /tmp

Found 3 items

-rw-r--r--   3 root supergroup   32252088 2020-10-15 23:04 /tmp/caixukun_dirtydata.csv

-rw-r--r--   3 root supergroup    2821683 2020-10-16 09:24 /tmp/caixukun_new.csv

-rw-r--r--   3 root supergroup         24 2020-10-16 09:21 /tmp/test

copyToLocal

与get命令类似,但只拷贝到一个本地文件

[root@node1 ~]# hdfs dfs -copyToLocal /tmp/test

[root@node1 ~]# ll

total 34260

-rw-r--r-- 1 root root 32252088 Oct 15 23:11 caixukun.csv

-rw-r--r-- 1 root root  2821683 Oct 15 23:29 caixukun_new.csv

-rw-r--r-- 1 root root       24 Oct 16 09:28 test

count

计算与指定文件模式匹配的路径下的目录,文件和字节数。 获取配额和使用情况。 具有-count的输出列是:DIR_COUNT,FILE_COUNT,CONTENT_SIZE,PATHNAME

[root@node1 ~]# hdfs dfs -count -q -v -h /source

       QUOTA       REM_QUOTA     SPACE_QUOTA REM_SPACE_QUOTA    DIR_COUNT   FILE_COUNT       CONTENT_SIZE PATHNAME

        none             inf            none             inf            6            1             33.4 M /source

find

查找与指定表达式匹配的所有文件,并对它们应用选定的操作。 如果未指定路径,则默认为当前工作目录。 如果未指定表达式,则默认为-print。

[root@node1 ~]# hdfs dfs -find / -name "caixukun*" -print

/source/weibo/star/comment_log/20190811_node1.itcast.cn/caixukun.csv

/tmp/caixukun_dirtydata.csv

/tmp/caixukun_new.csv

getfattr

显示文件或目录的扩展属性名称和值。

setfattr

设置文件或目录的扩展属性名称和值。

getmerge

下载多个HDFS上的文件并合并为1个文件

stat

以指定格式打印有关<path>上文件/目录的统计信息。

hdfs dfs -stat "type:%F perm:%a %u:%g size:%b mtime:%y atime:%x name:%n" /

test

测试,判断是否存在、是否是文件夹、是否是文件、是有有读权限、写权限等

text

获取源文件并以文本格式输出文件。 允许的格式是zip和TextRecordInputStream。

touch

在HDFS上创建一个新的文件,并可以指定访问时间、修改时间、

touchz

创建一个空文件。 如果文件存在,则返回错误。

truncate

将与指定文件截断为指定长度。

[root@node1 ~]# hdfs dfs -truncate -w 10485760 /tmp/caixukun_dirtydata.csv

Waiting for /tmp/caixukun_dirtydata.csv ...

Truncated /tmp/caixukun_dirtydata.csv to length: 10485760

usage

返回某个命令的帮助

[root@node1 ~]# hdfs dfs -usage rm

Usage: hadoop fs [generic options] -rm [-f] [-r|-R] [-skipTrash] [-safely] <src> ...

详细用法请参考官方文档:

https://hadoop.apache.org/docs/r3.1.4/hadoop-project-dist/hadoop-common/FileSystemShell.html