一、创建回收站
(1)编辑配置文件
core-site.xml
添加内容如下
fs.trash.interval 10080
10080 代表 10080分钟 即7天 也就是回收站保存7天,7天后删除
(2)重新启动集群进行测试
在hdfs上新建test1、test2文件夹
对test 进行删除操作,操作与显示如下:
[peizk@hadoop sbin]$ hdfs dfs -rm -r /test 2022-03-20 12:15:49,546 INFO fs.TrashPolicyDefault: Moved: 'hdfs://hadoop:9000/test' to trash at: hdfs://hadoop:9000/user/peizk/.Trash/Current/test
查看 回收站
[peizk@hadoop sbin]$ hdfs dfs -ls /user/peizk/.Trash/Current/ Found 1 items drwxr-xr-x - peizk supergroup 0 2022-03-20 12:13 /user/peizk/.Trash/Current/test
配置成功
(3)此外还有一种不经过回收站直接删除
语句如下:
[peizk@hadoop sbin]$ hdfs dfs -rm -r -skipTrash /test3 Deleted /test3
此语句在生产中一般不允许使用
二、HDFS一些其他命令
(1)hdfs --help
查看hdfs 下命令
(2) hdfs dfsadmin
查看安全模式是否开启
[peizk@hadoop sbin]$ hdfs dfsadmin -safemode get Safe mode is OFF [peizk@hadoop sbin]$
当安全模式关闭时,读和写都是可以的
当安全模式开启时,读可以,写不可以
一般进入安全模式有两种情况
第一是:被动进入,说明HDFS集群有问题,一般是 集群磁盘空间不够了,此时进入相当于保护模式
第二是:主动进入,一般是用于维护,保证这段时间HDFS不会有新数据/新文件写入。
(3)hdfs fsck
用来查看数据块是否健康,获取文件的block信息和位置信息等
如下查看HDFS根目录
[peizk@hadoop sbin]$ hdfs fsck / Connecting to namenode via http://hadoop:9870/fsck?ugi=peizk&path=%2F FSCK started by peizk (auth:SIMPLE) from /10.0.12.8 for path / at Sun Mar 20 12:44:23 CST 2022 Status: HEALTHY Number of data-nodes: 1 Number of racks: 1 Total dirs: 9 Total symlinks: 0 Replicated Blocks: Total size: 140 B Total files: 3 Total blocks (validated): 2 (avg. block size 70 B) Minimally replicated blocks: 2 (100.0 %) Over-replicated blocks: 0 (0.0 %) Under-replicated blocks: 0 (0.0 %) Mis-replicated blocks: 0 (0.0 %) Default replication factor: 1 Average block replication: 1.0 Missing blocks: 0 Corrupt blocks: 0 Missing replicas: 0 (0.0 %) Erasure Coded Block Groups: Total size: 0 B Total files: 0 Total block groups (validated): 0 Minimally erasure-coded block groups: 0 Over-erasure-coded block groups: 0 Under-erasure-coded block groups: 0 Unsatisfactory placement block groups: 0 Average block group size: 0.0 Missing block groups: 0 Corrupt block groups: 0 Missing internal blocks: 0 FSCK ended at Sun Mar 20 12:44:23 CST 2022 in 7 milliseconds The filesystem under path '/' is HEALTHY
(4)hdfs namenode
格式化namenode命令如下
hdfs namenode -format
三、HDFS主从架构
(1)一个名词:元数据 -- metaData
是由NameNode来维护的包含文件的路径、副本数量、block块所在的服务器位置等信息
例如下
元数据存储的三种方式
内存元数据:元数据放在内存中,方便快速读取
fsimage :元数据镜像文件,内存中的元数据,序列化到磁盘中。存储某一时间段NameNode内存元数据信息。
edits :记录用户的一些操作日志、删除请求、上传请求等,可通过日志运算出元数据。
(2)NameNode(NN)名称节点
存储的内容包括:
1、文件的名称
2、文件的目录结构
3、文件的属性(权限、副本数、创建时间等)
***4、一个文件被对应切割的哪些数据块(包括副本的数据块)》》对应分布在哪些DataNode,管理文件系统的命名空间,本质就是维护文件系统树的文件和文件夹。
NameNode 文件存放路径
[peizk@hadoop current]$ pwd /home/peizk/tmp/dfs/name/current
存放的文件主要为:
镜像文件:fsimage
编辑日志文件:edits
(3)NameSecondary(2NN) 第二节点
NameSecondary 文件存放位置
[peizk@hadoop current]$ pwd /home/peizk/tmp/dfs/namesecondary/current
(4)DataNode (DN)数据节点
DataNode 文件存放位置
/home/peizk/tmp/dfs/data/current/BP-2057196106-10.0.12.8-1647183603680/current/finalized/subdir0/subdir0
1、存储数据块和数据块的元数据
主要文件:块 一个块的 默认最大为128M
块的元数据
2、每隔一段时间会发送blockreport(块报告)给NN
dfs.blockreport.intervalMsec 21600000 =6H
在给NN发送 blockreport(块报告)要检查自己
dfs.datanode.directoryscan.interval 21600000 = 6H
注意:这两个参数值一定要一样
(5) NameNode与NameSecondary 工作机制 1.x
为什么要引进2NN如下图
NN工作机制
1、client 向NN提出上传请求,NN的Edits对上传请求进行记录并返回相对应的元数据信息给Client
2、client 根据返回的相应元数据,去对应的DN上传数据,当数据上传完成后,DN向client返回相应的结果
3、 client再将DN返回的结果,再返回给NN,然后NN在MD进行相应记录,并让2NN对fsimage进行相应的更新(合并edits和fsimage)
2NN工作机制(合并更新的流程)
关于 CheckPoint
什么是checkpoint,就是2NN合并更新文件的触发时间
主要有两个
1、是时间指定两次checkpoint的最大时间间隔
fs.checkpoint.period 默认是3600S
2、是针对edits文件的操作次数,比如每1000次上传请求触发一次
(6)NameNode高可靠 2.x~
为了解决 脑裂
引入Zookeeper
四、HDFS优缺点
优点:1、处理海量数据 GB TB PB
2、适合批处理
移动计算而不是移动数据,会把数据位置暴露给计算框架
3、高容错
数据自动保存N个副本,增加副本数,提高容错
某一个副本丢失,HDFS内部机制是可以自动恢复的
4、可以构建在廉价机器上
缺点:1、小文件问题,需要工程师去合并小文件
2、不适合毫秒级(实时)
补充:关于小文件问题
a:数据传输到HDFS之前,提前合并
b:数据已经到HDFS,在业务低谷期,去合并,至于如何合并,HAR,CombineFileInputFormat
五、作业
1、了解机架
机架感知 以副本=3为例
首先在客户端所在机架挑出一台主机(有时也会根据容量等)进行副本存储,接着在同一机架,挑选另一台主机进行存储,最后再挑选不同机架的一个主机进行存储
2、sal数字向百位取整,例如6变100,648变700,1100变1200
(1)SELECt floor( ( sal + 100 ) / 100 ) * 100 FROM emp (2)SELECt trunc( sal,- 2 ) + 100 FROM emp
3、求取sal,sal+100,和2中变化后的sal,取其中的最大值和最小值
(1) SELECt GREATEST( sal, sal1, sal2 ) AS max_sal, LEAST( sal, sal1, sal2 ) AS min_sal FROM ( SELECt sal, sal + 100 AS sal1, trunc( sal,- 2 ) + 100 AS sal2 FROM emp ) (2) select case when sal>=sal1 then case when sal>= sal2 then sal else sal2 end when sal1>sal then case when sal1>=sal2 then sal1 else sal2 end end as max_sal ,case when sal>=sal1 then case when sal1>= sal2 then sal2 else sal1 end when sal1>sal then case when sal>=sal2 then sal2 else sal end end as min_sal from ( SELECt sal ,sal +100 as sal1 ,trunc( sal,- 2 ) + 100 as sal2 FROM emp )
4、emp表,入职日期(hiredate)是当年的第几天,当月的第几天,当周的第几天
SELECt HIREDATE - trunc( HIREDATE, 'yyyy' ) + 1 as year_day ,HIREDATE -trunc( HIREDATE, 'mm' ) +1 as month_day ,to_char(HIREDATE,'d') as week_day --星期天为第一天 FROM emp



