1. 心跳机制
Hadoop集群启动的顺序是:NameNode、DataNode、SecondaryNameNode
因为HDFS是分布式文件存储系统,所以集群的节点必须保证时间同步。而NameNode是集群的老大,负责集群上任务的分工,如果要进行分工,则必须知道各个节点的存活状态。那么NameNode是如何知道的?是通过DataNode定期向NameNode发送心跳报告。
NameNode何时会判定DataNode宕机了?首先DataNode会每隔3s向NameNode发送一次心跳报告,当NameNode连续10次没有接受到DataNode的心跳报告,则认为这个DataNode可能宕机,并没有断定。这个时候NameNode会主动向DataNode发送一次检查,检查时间是5min,如果这一次检查没有返回结果,这个时候会再进行一次检查,如果再次获取不到DataNode的返回信息,这个时候才会判定该DataNode宕机。
hdfs-site.xml:
<property>
<name>dfs.heartbeat.interval</name>
<value>3</value>
<description>Determines datanode heartbeat interval in seconds.</description>
</property>
<property>
<name>dfs.namenode.heartbeat.recheck-interval</name>
<value>300000</value>
<description>
This time decides the interval to check for expired datanodes.With this value and dfs.heartbeat.interval, the interval of deciding the datanode is stale or not is also calculated.The unit of this configuration is millisecond.
</description>
</property>
也就是说:NameNode在最终判断DataNode死亡需要10×3s+2×5min=630s
2. 机架策略
HDFS默认情况下每个数据会存储3个副本,那么这3个副本该怎么存放呢?
副本存放策略:
- 第一个副本一般会存放在客户端的节点
- 第二个副本存储在和第一个副本不同机架上的任意一节点上。原因:防止同一个机架断电,数据访问不到
- 第三个副本存储在和第一个副本相同机架的不同节点上。原因:在风险度相同的情况下,优先选择网络传输较少的
3. 安全模式
集群启动的时候NameNode需要获取元数据,元数据包括:1)抽象目录树、2)数据和块的映射关系、3)数据块存储的位置信息
集群启动:
- 1、NameNode启动的时候,将元数据从磁盘加载到内存中
- 2、DataNode启动,NameNode接收DataNode的心跳报告,等到99%的心态报告接收到
- 3、启动SecondaryNameNode,合并NameNode的editLogs,并更新Fisimage上,一旦它有了新的Fisimag文件,它将其拷回NameNode中。NameNode在下次重启的时候会使用这个新的Fisimag,从而减少重启的时间。
集群在执行这个过程的时候不允许外界对集群进行操作,这个时候集群处于安全模式
也就是说集群处于安区模式的时候:会加载元数据和获取DataNod的心跳报告
如果集群处于维护或者升级的时候,可以手动将集群设置安全模式状态:
- HDFS dfsadmin -safenmode enter进入安全模式
- HDFS dfsadmin -safenmode leave退出安全模式
- HDFS dfsadmin -safenmode get 获取安全模式的状态,安全模式是否开启,如果开启ON,如果关闭OFF
安全模式下用户可以执行的操作:
- 不修改元数据的操作:ls查询、cat查看文件内容、
安全模式下用户不可以执行的操作:
- 修改元数据的操作:mkdir创建目录、put文件上传、修改文件名、文件追加
4. 负载均衡
首先什么是负载均衡?就是每个节点上存储的数据百分比相差不大,能力越大,责任越大
在进行文件上传的时候会优先选择客户端所在的节点,如果习惯性的使用同一个节点会造成客户端所在节点的存储数据比较多。这时,集群会有个自动的负载均衡的操作,只不过这个负载均衡的操作会比较慢。集群自动的负载均衡对于小规模(集群节点比较少的时候)是可以的,但是如果集群特别大的时候,会花费的时间过长,等不及,所以这个时候就需要手动负载均衡 start-balancer.sh 但是这个命令也不会立即去执行,需要等待Hadoop集群空闲的时候
真的存在绝对的均衡吗???不存在的
所以我们在手动负载均衡的时候可以指定一个参数:start-balancer.sh -t 10 %:指的是任意两个节点的存储百分比不超过10%则认为已经达到了负载均衡