一.NameNode
1.简介
namenode是整个文件系统的管理节点。他维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求。
文件包括:
fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。
edits:操作日志文件。
fstime:保存最近一次checkpoint的时间。
2.NameNode的工作特点
NameNode始终在内存中保存metedata,用于处理“读请求”,到有“写请求”到来时,NameNode首先会写editlog到磁盘,即向edits文件中写日志,成功返回后,才会修改内存,并且向客户端返回。
Hadoop会维护一个人fsimage文件,也就是NameNode中metedata的镜像,但是fsimage不会随时与NameNode内存中的metedata保持一致,而是每隔一段时间通过合并edits文件来更新内容。Secondary NameNode就是用来合并fsimage和edits文件来更新NameNode的metedata的。
3.Namenode作用
- 管理、维护文件系统的元数据/名字空间/目录树 管理数据与节点之间的映射关系(管理文件系统中每个文件/目录的block块信息)
- 管理DataNode汇报的心跳日志/报告
- 客户端和DataNode之间的桥梁(元数据信息共享)
二.DataNode
DataNode在创建时并不包含映射的主机名,而是在安全模式里,在namenode的fsimage文件加载到内存中并执行edits文件时生成DataNode与主机的映射关系
即是在DataNode注册之后再内存中生成DataNode与主机的映射
DataNode的目录结构
和namenode不同的是,datanode的存储目录是初始阶段自动创建的,不需要额外格式化。
DataNode作用
- 负责数据的读写操作
- 周期性的向NameNode汇报心跳日志/报告
- 执行数据流水线的复制
三、机架感知
通俗的来说就是nameNode通过读取我们的配置来配置各个节点所在的机架信息(节点ip和swap交换机
什么时候会用到机架感知?
NameNode分配节点的时候 (数据的流水线复制和HDFS复制副本时)
HDFS副本存放机制
第1个副本存放在客户端,如果客户端不在集群内,就在集群内随机挑选一个合适的节点进行存放;
第2个副本存放在与第1个副本同机架且不同节点,按照一定的规则挑选一个合适的节点进行存放;
第3个副本存放在与第1、2个副本不同机架且距第1个副本逻辑距离最短的机架,按照一定的规则挑选一个合适的节点进行存放;
hadoop 视硬件设备经常损坏为常态
为了防止硬件损坏导致系统不可用,所以构建多副本机制
四、HDFS数据完整性计算
数据写入之后进行数据首次校验,文件系统周期性进行校验,防止数据丢失。
读取数据之前进行数据校验,若两个校验相同,那么表示数据没有丢失,开始读取数据。
若两个校验不相同,那么表示数据有部分丢失,换到其他节点(相同副本的节点)读取数据。
HDFS 适用场景 一次写入,多次读出的场景,支持文件追加,但不支持在文件中间修改。
五、掉线时限参数设置
datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长。HDFS默认的超时时长为10分钟+30秒。如果定义超时时间为timeout,则超时时长的计算公式为:
timeout = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval。
而默认的dfs.namenode.heartbeat.recheck-interval 大小为5分钟,dfs.heartbeat.interval默认为3秒。
需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒。
<property>
<name>dfs.namenode.heartbeat.recheck-interval</name>
<value>300000</value>
</property>
<property>
<name> dfs.heartbeat.interval </name>
<value>3</value>
</property>
六、HDFS的特性
1、海量数据存储:
HDFS可横向扩展,其存储的文件可以支持PB级别或更高级别的数据存储。
2、高容错性:
数据保存多个副本,副本丢失后自动恢复。
可构建在廉价价(与小型机大型机对比)的机器上,实现线性扩展。
当集群增加新节点之后,namenode也可以感知,进行负载均衡,将数据分发和备份数据均衡到新 的节点上。每个节点磁盘使用容量百分比的差异可以人工设置。
线性扩展:随着节点数量的增加,集群的性能-计算性能和存储性能都会有所增加
负载均衡:集群可将原本使用容量较高的节点上的数据自动写入新的节点上,达到所有节点容量均匀
3、大文件存储:
数据分块存储,将一个大块的数据切分成多个小块的数据。
七、HDFS缺点
1、不能做到低延迟数据访问:
由于hadoop针对高数据吞吐量做了优化,牺牲了获取数据的延 迟,所以对于低延迟访问数据的 业务需求不适合HDFS。
2、不适合大量的小文件存储 :
由于namenode将文件系统的元数据存储在内存中,因此该文件系统所能存储的文件总数受限于namenode的内存容量。
元数据信息中每个文件、目录和数据块的存储信息大约占150字节。(1G 数据存储的元数据信息占用150字节 ,1M的数据元数据信息占用150字节)
受限于内存,元数据信息的存储机制导致无论数据多大,元数据信息中描述这个数据的信息都是150字节。
3、修改文件:
HDFS适合一次写入,多次读取的场景。对于上传到HDFS上的文件,不支持修改文件。Hadoop2.0虽然支持了文件的追加功能,但不建议对HDFS上的文件进行修改。因为效率低下.
4、不支持用户的并行写:
同一时间内,只能有一个用户执行写操作。
5、多次写入,一次读取
八、HDFS文件限额配置
特定文件夹下的副本数可以设置、存储容量可以设置,存储的文件个数可以设置。
数量限额
hdfs dfs -mkdir -p /user/root/lisi #创建hdfs文件夹
hdfs dfsadmin -setQuota 2 lisi # 给该文件夹下面设置最多上传两个文件,上传文件,发现只能上传一个文件
hdfs dfsadmin -clrQuota /user/root/lisi # 清除文件数量限制
空间大小限额
hdfs dfsadmin -setSpaceQuota 4k /user/root/lisi # 限制空间大小4KB
hdfs dfs -put /export/softwares/zookeeper-3.4.5-cdh5.14.0.tar.gz /user/root/lisi
#上传超过4Kb的文件大小上去提示文件超过限额
hdfs dfsadmin -clrSpaceQuota /user/root/lisi #清除空间限额
hdfs dfs -put /export/softwares/zookeeper-3.4.5-cdh5.14.0.tar.gz /user/root/lisi
九、集群安全模式
安全模式是 HDFS 所处的一种特殊状态,在这种状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求,是一种保护机制,用于保证集群中的数据块的安全性。
Namenode启动时,首先将映像文件(fsimage)载入内存,并执行编辑日志(edits)中的各项操作。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的fsimage文件和一个空的编辑日志。此时,namenode开始监听datanode请求。当NameNode统计总模块和发送过来的块报告中的统计信息达到99.999%的之前时间里namenode运行在安全模式,即namenode的文件系统对于客户端来说是只读的
假设我们设置的副本数(即参数 dfs.replication)是 5,那么在 Datanode 上就应该有5 个副本存在,假设只存在 3 个副本,那么比例就是 3/5=0.6。在配置文件 hdfs-default.xml中定义了一个最小的副本的副本率(即参数 dfs.namenode.safemode.threshold-pct)0.999。
我们的副本率 0.6 明显小于 0.99,因此系统会自动的复制副本到其他的 DataNode,使得副本率不小于 0.999.如果系统中有 8 个副本,超过我们设定的 5 个副本,那么系统也会删除多余的 3 个副本。
如果 HDFS 处于安全模式下, 不允许HDFS 客户端进行任何修改文件的操作,包括上传文件,删除文件,重命名,创建文件夹,修改副本数等操作。
在安全模式下集群在做什么?
在安全模式下集群在进行恢复元数据,即在合并fsimage和edits log,并且接受datanode的心跳信息,恢复block的位置信息,将集群恢复到上次关机前的状态
手动控制安全模式命令
查看安全模式状态:hdfs dfsadmin -safemode get
进入安全模式状态:hdfs dfsadmin -safemode enter
离开安全模式状态:hdfs dfsadmin -safemode leave
等待安全模式状态:hdfs dfsadmin -safemode wait
十、hdfs的文件权限验证
hdfs的文件权限机制与linux系统的文件权限机制类似
r:read w:write x:execute 权限x对于文件表示忽略
如果linux系统用户zhangsan使用Hadoop命令创建一个文件,那么这个文件在HDFS当中的owner就是zhangsan
十一、HDFS 新增节点与删除节点
1、服役新数据节点
准备新节点
第一步:复制一台新的虚拟机出来
将我们纯净的虚拟机复制一台出来,作为我们新的节点
第二步:修改mac地址以及IP地址
修改mac地址命令
vim /etc/udev/rules.d/70-persistent-net.rules
修改ip地址命令
vim /etc/sysconfig/network-scripts/ifcfg-eth0
第三步:关闭防火墙,关闭selinux
<!-- 关闭防火墙 -->
service iptables stop
<!-- 开机不启动防火墙 -->
chkconfig iptables off
<!-- 关闭selinux -->
vim /etc/selinux/config
第四步:更改主机名
更改主机名命令
vim /etc/sysconfig/network
第五步:四台机器更改主机名与IP地址映射
四台机器都要添加hosts文件
vim /etc/hosts 192.168.52.100 node01 192.168.52.110 node02 192.168.52.120 node03 192.168.52.130 node04
第六步:node04服务器关机重启并生成公钥与私钥
node04执行以下命令关机重启
reboot
node04执行以下命令生成公钥与私钥
ssh-keygen -t rsa
node04执行以下命令将node04的私钥拷贝到node01服务器
ssh-copy-id node01
node01执行以下命令,将authorized_keys拷贝给node04
cd /root/.ssh/
scp authorized_keys node04:$PWD
第七步:node04安装jdk
node04统一两个路径
mkdir -p /export/softwares/
mkdir -p /export/servers/
然后解压jdk安装包,配置环境变量,或将集群中的java安装目录拷贝一份,并配置环境变量。
第八步:解压Hadoop安装包
在node04服务器上面解压Hadoop安装包到/export/servers
node01执行以下命令将Hadoop安装包拷贝到node04服务器
cd /export/softwares/
scp hadoop-2.6.0-cdh5.14.0-自己编译后的版本.tar.gz node04:$PWD
第九步:将node01关于Hadoop的配置文件全部拷贝到node04
node01执行以下命令,将Hadoop的配置文件全部拷贝到node04服务器上面
cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/
scp ./* node04:$PWD
服役新节点具体步骤
第一步:在主机点上创建dfs.hosts文件
[root@node01 sbin]# cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/
[root@node01 hadoop]# touch dfs.hosts
[root@node01 hadoop]# vim dfs.hosts
node01
node02
node03
node04
第二步:node01 编辑hdfs-site.xml 添加一下配置
<property>
<name>dfs.hosts</name>
<value>/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/dfs.hosts</value>
</property>
第三步:刷新namenode
[root@node01 hadoop]# hdfs dfsadmin -refreshNodes
Refresh nodes successful
第四步:更新resourceManager节点
[root@node01 hadoop]# yarn rmadmin -refreshNodes
19/11/07 00:18:27 INFO client.RMProxy: Connecting to ResourceManager at node01/192.168.100.131:8033
第五步:namenode的slaves文件增加新服务节点主机名称
[root@node01 hadoop]# cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/
[root@node01 hadoop]# vim slaves
node01
node02
node03
node04
第六步:单独启动新增节点
<!-- node04服务器执行以下命令,启动datanode和nodemanager -->
[root@node04 hadoop-2.6.0-cdh5.14.0]# cd /export/servers/hadoop-2.6.0-cdh5.14.0/
[root@node04 hadoop-2.6.0-cdh5.14.0]# sbin/hadoop-daemon.sh start datanode
[root@node04 hadoop-2.6.0-cdh5.14.0]# sbin/yarn-daemon.sh start nodemanager
第七步:浏览器查看
http://192.168.100.131:50070/dfshealth.html#tab-overview
http://192.168.100.131:8088/cluster
第八步:使用负载均衡命令,让数据均匀负载所有机器
cd /export/servers/hadoop-2.6.0-cdh5.14.0/
sbin/start-balancer.sh
2、退役旧数据节点
第一步:创建dfs.hosts.exclude配置文件
[root@node01 hadoop]# cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/
[root@node01 hadoop]# touch dfs.hosts.exclude
[root@node01 hadoop]# vim dfs.hosts.exclude
node04
第二步:编辑namenode所在机器的hdfs-site.xml
[root@node01 hadoop]# cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
[root@node01 hadoop]# vim hdfs-site.xml
<property>
<name>dfs.hosts.exclude</name>
<value>/export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop/dfs.hosts.exclude</value>
</property>
第三步:刷新namenode,刷新resourceManager
[root@node01 hadoop]# hdfs dfsadmin -refreshNodes
Refresh nodes successful
[root@node01 hadoop]# yarn rmadmin -refreshNodes
19/11/07 00:48:30 INFO client.RMProxy: Connecting to ResourceManager at node01/192.168.100.131:8033
第四步:查看web浏览界面
http://192.168.100.131:50070/dfshealth.html#tab-datanode
第五步:节点退役完成,停止该节点进程
cd /export/servers/hadoop-2.6.0-cdh5.14.0
sbin/hadoop-daemon.sh stop datanode
sbin/yarn-daemon.sh stop nodemanager
第六步:从include文件中删除退役节点
cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
vim dfs.hosts
node01
node02
node03
<!-- 刷新namenode和resourceManager -->
hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes
第七步:从namenode的slave文件中删除退役节点
cd /export/servers/hadoop-2.6.0-cdh5.14.0/etc/hadoop
vim slaves
node01
node02
node03
第八步:如果数据负载不均衡,执行以下命令进行均衡负载
cd /export/servers/hadoop-2.6.0-cdh5.14.0/ sbin/start-balancer.sh
cat blk_1073741863_1041.meta >> jdk-8u144-linux-x64.tar.gz
十二、block块手动拼接成为完整数据
第一步:上传一个大于128M的文件到hdfs上面去
cd /export/softwares/ hdfs dfs -put jdk-8u141-linux-x64.tar.gz /
第二步:web浏览器界面查看jdk的两个block块id
第三步:根据配置文件找到block块所在的路径
/export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/datanodeDatas/current/BP-732621991-192.168.100.131-1572601508657/current/finalized/subdir0/subdir0
第四步:执行block块的拼接
cat blk_1073741863_1041.meta >> jdk-8u144-linux-x64.tar.gz
cat blk_1073741864_1042.meta >> jdk-8u144-linux-x64.tar.gz
<!--移动jdk到/export/ 路径,进行解压-->
mv jdk-8u144-linux-x64.tar.gz /export/
十二、HDFS回收站
1、启用回收站
修改所有服务器的core-site.xml配置文件
<!-- 开启hdfs的垃圾桶机制,删除掉的数据可以从垃圾桶中回收,单位分钟 -->
<property>
<name>fs.trash.interval</name>
<value>10080</value>
</property>
2、查看回收站
/user/root/.Trash/
3、通过javaAPI删除的数据,不会进入回收站,需要调用moveToTrash()才会进入回收站
通过shell命令行删除的数据,会进入回收站。
Trash trash = New Trash(conf);
trash.moveToTrash(path);
4、恢复回收站数据
hdfs dfs -mv trashFileDir hdfsdir
trashFileDir :回收站的文件路径
hdfsdir :将文件移动到hdfs的哪个路径下
5、清空回收站
hdfs dfs -expunge