建议初学者先看简介一。
集群的安全模式
NameNode启动时,首先将映像文件(fsimage载入内存,并执行编辑日志(edits中的各项操作。一旦在内存中成功建立文件系统元数据的映像,则创建一个新的fsimage文件和一个空的编辑日志。此时NameNode开始监听DataNode请求。但是此刻,NameNode运行在安全模式,即NameNode的文件系统对于客户端来说是只读的。
系统中的数据块的位置并不是由NameNode维护的,而是以块列表的形式存储在DataNode中。在系统的正常操作期间,NameNode会在内存中保留所有块位置的映射信息。在安全模式下,各个DataNode会向NameNode发送最新的块列表信息NameNode了解到足够多的块位置信息之后,即可高效运行文件系统。
如果满足最小副本条件NameNode会在30秒钟之后就退出安全模式。所谓的最小副本条件指的是在整个文件系统中99.9%的块满足最小副本级别(默认值:dfs.replication.min=1。在启动一个刚刚格式化的HDFS集群时,因为系统中还没有任何块,所以NameNode不会进入安全模式。
集群处于安全模式,不能执行重要操作(写操作)。集群启动完成后,自动退出安全模式。
bin/hdfsdfsadminsafemodeget 查看安全模式状态
bin/hdfsdfsadminsafemodeenter 进入安全模式状态
bin/hdfsdfsadminsafemodeleave 离开安全模式状态
bin/hdfsdfsadminsafemodewait 等待安全模式状态
DataNode的工作机制
掉线时限参数设置
DataNode进程死亡或者网络故障造成DataNode无法与NameNode通信,NameNode不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长。HDFS默认的超时时长为10分钟+30秒。如果定义超时时间为timeout,则超时时长的计算公式为:
timeout=2dfs.namenode.heartbeat.recheck-interval+10dfs.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>
Datanode多目录配置
datanode也可以配置成多个目录,每个目录存储的数据不一样。即:数据不是副本。
hdfs-site.xml
<property>
<name>dfs.datanode.data.dir</name>
<value>file:///${hadoop.tmp.dir}/dfs/data1,file:///${hadoop.tmp.dir}/dfs/data2</value>
</property>
服役新数据节点
随着公司业务的增长,数据量越来越大,原有的数据节点的容量已经不能满足存储数据的需求,需要在原有集群基础上动态添加新的数据节点。
服务新节点具体步骤:
- 在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目录下创建dfs.hosts文件。
vim /opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts
hadoop122 #主节点
hadoop123
hadoop124
hadoop125 - 在NameNode的hdfs-site.xml配置文件中增加hdfs.hosts路径
vim hdfs-site.xml
<property>
<name>dfs.hosts</name>
<value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts</value>
</property>
-
刷新NameNode
hdfs dfsadmin -refreshNodes
返回值:Refresh nodes successful -
更新ResourceManager节点
yarn rmadmin -refreshNodes
返回值:17/06/24 14:17:11 INFO client.RMProxy: Connecting to ResourceManager at hadoop103/192.168.1.103:8033 -
在NameNode的slaves文件中增加新主机名称
hadoop122 #主节点
hadoop123
hadoop124
hadoop125
- 复制分发两个配置文件,slaves文件和hdfs-site.xml配置文件(所有节点)
- 单独命令启动新的数据节点和节点管理器
sbin/hadoop-daemon.sh start datanode
sbin/yarn-daemon.sh start nodemanager - 检查
退役旧数据节点
服务新节点具体步骤:
- 在NameNode的/opt/module/hadoop-2.7.2/etc/hadoop目录下创建dfs.hosts.exclude文件.
vim /opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts.exclude
hadoop125
- 在NameNode的hdfs-site.xml配置文件中增加hdfs.hosts路径
vim hdfs-site.xml
<property>
<name>dfs.hosts</name>
<value>/opt/module/hadoop-2.7.2/etc/hadoop/dfs.hosts.exclude</value>
</property>
- 刷新NameNode
hdfs dfsadmin -refreshNodes - 更新ResourceManager节点
yarn rmadmin -refreshNodes - 检查web浏览器,退役节点的状态为decommission in progress(退役中)说明数据节点正在复制块到其他节点。
- 等待退役节点状态为decommissioned所有块已经复制完成),停止该节点及节点资源管理器。
注意:如果副本数是3服役的节点小于等于3,是不能退役成功的,需要修改副本数后才能退役。
在退役的旧节点上执行
sbin/yarn-daemon.sh stop nodemanager
sbin/hadoop-daemon.sh stop datanode - 如果该节点是新增过的节点,则需要删除dfs.hosts中的要退役节点
vim dfs.hosts
hadoop122
hadoop123
hadoop124
刷新namenode 刷新resourcemanager
hdfs dfsadmin -refreshNodes
yarn rmadmin -refreshNodes. - 从NameNode的slave文件中删除退役节点hadoop125
vim hdfs-site.sh
hadoop122
hadoop123
hadoop124- 同步slave和hdfs-site.sh文件
- 如果数据不均衡,可以用命令实现集群的再平衡
sbin/start-balancer.sh
Hadoop存档
概述:
每个文件均按块存储,每个块的元数据存储在NameNode的内存中,因此Hadoop存储小文件会非常低效。因为大量的小文件会耗尽NameNode中的大部分内存。
Hadoop存档文件或HAR文件,是一个更高效的文件存档工具,它将文件存入HDFS块,在减少NameNode内存使用的同时,允许对文件进行透明的访问。
操作步骤:
- 保持yarn进程的启动
- 归档成一个叫xxx.har的文件夹,因为使用的 har协议。
bin/hadoop archive -archivename myhar.har -p /user/lichao / - 接归档文件
hadoop fs -cp har:/// /user