继上一篇文章,我们继续实战学习HDFS微博案例。
十一、需求:追加数据到HDFS数据文件
在数据集中有一个caixukun_new.csv数据集,是20190811这一天重新生成的数据。我们需要将这个文件上传到HDFS中。有两种做法:
- 直接将新文件上传到HDFS中20190811文件夹中。
- 将新文件追加到之前的数据文件caixukun.csv中。
这里,我们更倾向于使用第二种方案。HDFS设计的初衷就是存储超大型的文件,文件数量越少,也可以减小HDFS中的NameNode压力。
(1)appendToFile命令
追加一个或者多个文件到hdfs指定文件中.也可以从命令行读取输入
语法格式:
|
(2)追加文件到HDFS已有文件中
|
十二、需求:查看当前HDFS磁盘空间
每一天微博都会产生很多的数据,我们非常有必要定期检查HDFS的整体磁盘空间,如果发现磁盘空间已经到达某个阈值,就需要新增新的DataNode节点了。
(1)df命令
df命令用来查看HDFS空闲的空间。
|
(2)查看HDFS磁盘使用情况
|
十三、需求:查看微博数据占用的空间
我们想知道当前微博数据占用了多少空间。可以使用du命令。
(1)du命令
显示目录中所有文件大小,当只指定一个文件时,显示此文件的大小。
语法格式:
|
命令选项:
- -s:表示显示文件长度的汇总摘要,而不是单个文件的摘要。
- -h:选项将以“人类可读”的方式格式化文件大小
- -v:选项将列名显示为标题行。
- -x:选项将从结果计算中排除快照。
(2)查看微博数据占用空间大小
|
十四、需求:将20190810的数据移动到tmp目录
经分析程序检测,20190810这一天的数据里面存在大量垃圾数据,项目组决定,先将这些垃圾数据处理了,再放回到20190810目录中。首先需要将数据移动到tmp目录中,进行处理。
(1)mv 命令
将hdfs上的文件从原路径移动到目标路径(移动之后文件删除),该命令不能跨文件系统。
|
(2)移动到tmp目录
|
十五、需求:减少副本数提升存储资源利用率
HDFS中默认每个block会保存三个副本,同样一份数据需要存3份。假设,此处我们需要将 /source/weibo/start/comment_log/20190811_node1.itcast.cn 因为已经过去了很久,我们对该目录下的文件容错要求较低、而且数据使用频率也较低,所以,我们可以将它的副本数调整为2,此时我们需要使用setrep命令。
setrep 命令
hdfs dfs -setrep [-R] [-w] <numReplicas> <path>
更改文件的副本因子。 如果path是目录,则该命令以递归方式更改以path为根的目录树下所有文件的复制因子。
参数:
|
2.设置/source/weibo/star/comment_log/副本数
|
十六、更多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