一、什么是安全模式

安全模式时HDFS所处的一种特殊状态,在这种状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求。在NameNode主节点启动时,HDFS首先进入安全模式,DataNode在启动的时候会向namenode汇报可用的block等状态,当整个系统达到安全标准时,HDFS自动离开安全模式。如果HDFS处于安全模式下,则文件block不能进行任何的副本复制操作,因此达到最小的副本数量要求是基于datanode启动时的状态来判定的,启动时不会再做任何复制。

二、安全模式的相关配置

系统离开安全模式的条件:

1)可用的block占总数的比例

2)可用的数据节点数量符合要求

三、配置  hdfs-site.xml

dfs.namenode.replication.min:最小的文件block副本数量,默认为1

dfs.namenode.safemode.threshold-pct:副本数达到最小要求的block占系统总block数的百分比,当实际比例超出该配置后,才能离开安全模式

dfs.namenode.safemode.min.datanodes:离开安全模式的最小可用(alive)datanode数量要求,默认是0,也就是即使所有datanode都不可用,仍然可以离开安全模式

dfs.namenode.safemode.extension:当集群可用block比例,可用datanode都达到要求之后,如果在extension配置额时间段之后依然能满足要求,此时集群才离开安全模式,单位为毫秒。默认为1,也就是当满足条件并且能够维持1毫秒之后,离开安全模式。这个配置主要是针对集群的稳定程度做进一步的确认

四、相关操作命令

hadoop dfsadmin -safemode <command>

  • get     查看当前状态
  • enter   进入安全模式
  • leave   强制离开安全模式
  • wait   一直等待直到安全模式结束

五、源码分析

import org.apache.hadoop.classification.InterfaceAudience.Private;
import org.apache.hadoop.hdfs.protocol.Block; @Private
public interface SafeMode {
//检查进入或者退出安全模式的条件是否满足,如果满足,进入或退出安全模式
void checkSafeMode();
//系统当前是否处于安全模式
boolean isInSafeMode();
//系统启动时是否自动进入安全模式
boolean isInStartupSafeMode(); boolean isPopulatingReplQueues();
//增加达到最小副本数要求的block数
void incrementSafeBlockCount(int var1);
//降低达到最小副本数要求的block数
void decrementSafeBlockCount(Block var1);
} //周期性的检测是否可以离开安全模式,逻辑封装在run方法中
class SafeModeMonitor implements Runnable {
//两次检测间隔的毫秒数,即1秒
private static final long recheckInterval = 1000L; SafeModeMonitor() {
} public void run() {
//系统运行时,循环检测
while(FSNamesystem.this.fsRunning) {
FSNamesystem.this.writeLock(); try {
//没有安全模式相关信息,也就是不在安全模式
if(FSNamesystem.this.safeMode == null) {
//线程退出
break;
} if(FSNamesystem.this.safeMode.canLeave()) {
//离开安全模式
FSNamesystem.this.safeMode.leave();
FSNamesystem.this.smmthread = null;
//离开安全模式之后,线程退出
break;
}
} finally {
FSNamesystem.this.writeUnlock();
} try {
//两次检测之间,线程休眠
Thread.sleep(1000L);
} catch (InterruptedException var4) {
;
}
}
//当系统不在运行的时候,线程结束退出
if(!FSNamesystem.this.fsRunning) {
FSNamesystem.LOG.info("NameNode is being shutdown, exit SafeModeMonitor thread");
} }
}

  

在FSNamesystem.class中有SafeModeInfo用于保存安全模式下的相关信息:private volatile FSNamesystem.SafeModeInfo safeMode;
这个变量的类型为volatile,也就是桌该线程对该变量的任何修改完成后,其他线程立刻可以看到变化

private SafeModeInfo(Configuration conf) {
this.reached = -1L;
this.reachedTimestamp = -1L;
this.lastStatusReport = 0L;
this.resourcesLow = false;
this.shouldIncrementallyTrackBlocks = false;
//这个就是之前提到过的百分比配置
this.threshold = (double)conf.getFloat("dfs.namenode.safemode.threshold-pct", 0.999F);
if(this.threshold > 1.0D) {
FSNamesystem.LOG.warn("The threshold value should\'t be greater than 1, threshold: " + this.threshold);
}
//最小可用的datanode数量配置
this.datanodeThreshold = conf.getInt("dfs.namenode.safemode.min.datanodes", 0);
this.extension = conf.getInt("dfs.namenode.safemode.extension", 0);
this.safeReplication = conf.getInt("dfs.namenode.replication.min", 1);
FSNamesystem.LOG.info("dfs.namenode.safemode.threshold-pct = " + this.threshold);
FSNamesystem.LOG.info("dfs.namenode.safemode.min.datanodes = " + this.datanodeThreshold);
FSNamesystem.LOG.info("dfs.namenode.safemode.extension = " + this.extension);
this.replQueueThreshold = (double)conf.getFloat("dfs.namenode.replqueue.threshold-pct", (float)this.threshold);
this.blockTotal = 0;
this.blockSafe = 0;
}

  即:SafeModeMonitor作为守护线程,在收到来自datanode的BlockReport状态报告之后,周期性检测是否达到离开安全模式的条件,如果符合,则离开安全模式。

【大数据系列】HDFS安全模式的更多相关文章

  1. 大数据系列2:Hdfs的读写操作

    在前文大数据系列1:一文初识Hdfs中,我们对Hdfs有了简单的认识. 在本文中,我们将会简单的介绍一下Hdfs文件的读写流程,为后续追踪读写流程的源码做准备. Hdfs 架构 首先来个Hdfs的架构 ...

  2. 大数据系列之数据仓库Hive安装

    Hive系列博文,持续更新~~~ 大数据系列之数据仓库Hive原理 大数据系列之数据仓库Hive安装 大数据系列之数据仓库Hive中分区Partition如何使用 大数据系列之数据仓库Hive命令使用 ...

  3. 大数据系列(3)——Hadoop集群完全分布式坏境搭建

    前言 上一篇我们讲解了Hadoop单节点的安装,并且已经通过VMware安装了一台CentOS 6.8的Linux系统,咱们本篇的目标就是要配置一个真正的完全分布式的Hadoop集群,闲言少叙,进入本 ...

  4. 大数据系列(2)——Hadoop集群坏境CentOS安装

    前言 前面我们主要分析了搭建Hadoop集群所需要准备的内容和一些提前规划好的项,本篇我们主要来分析如何安装CentOS操作系统,以及一些基础的设置,闲言少叙,我们进入本篇的正题. 技术准备 VMwa ...

  5. 大数据系列之并行计算引擎Spark部署及应用

    相关博文: 大数据系列之并行计算引擎Spark介绍 之前介绍过关于Spark的程序运行模式有三种: 1.Local模式: 2.standalone(独立模式) 3.Yarn/mesos模式 本文将介绍 ...

  6. 大数据系列之并行计算引擎Spark介绍

    相关博文:大数据系列之并行计算引擎Spark部署及应用 Spark: Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎. Spark是UC Berkeley AMP lab ( ...

  7. 大数据系列之数据仓库Hive命令使用及JDBC连接

    Hive系列博文,持续更新~~~ 大数据系列之数据仓库Hive原理 大数据系列之数据仓库Hive安装 大数据系列之数据仓库Hive中分区Partition如何使用 大数据系列之数据仓库Hive命令使用 ...

  8. 大数据系列之数据仓库Hive原理

    Hive系列博文,持续更新~~~ 大数据系列之数据仓库Hive原理 大数据系列之数据仓库Hive安装 大数据系列之数据仓库Hive中分区Partition如何使用 大数据系列之数据仓库Hive命令使用 ...

  9. 大数据系列之分布式计算批处理引擎MapReduce实践

    关于MR的工作原理不做过多叙述,本文将对MapReduce的实例WordCount(单词计数程序)做实践,从而理解MapReduce的工作机制. WordCount: 1.应用场景,在大量文件中存储了 ...

  10. 大数据系列之分布式数据库HBase-1.2.4+Zookeeper 安装及增删改查实践

    之前介绍过关于HBase 0.9.8版本的部署及使用,本篇介绍下最新版本HBase1.2.4的部署及使用,有部分区别,详见如下: 1. 环境准备: 1.需要在Hadoop[hadoop-2.7.3]  ...

随机推荐

  1. C# 一个多层循环中,break一次能跳出几个循环?

    public class BreakTest { public static void main(String[] args) { ; x<; x++) { ; y<; y++) { ; ...

  2. SharePoint 2013 隐藏左边快速启动菜单栏(Hiding the Quick Launch Bar)

    在SharePoint 2013默认网站页面中,很多时候,我们需要隐藏左边快速启动菜单栏,这时我们可以通过下面的样式来实现隐藏它. 和SharePoint 2010不太一样,方法改了,不过性质是一样的 ...

  3. [转]Python多线程与多线程中join()的用法

    https://www.cnblogs.com/cnkai/p/7504980.html Python多线程与多进程中join()方法的效果是相同的. 下面仅以多线程为例: 首先需要明确几个概念: 知 ...

  4. 【ES】简单使用

    import sys reload(sys) sys.setdefaultencoding('utf-8') from datetime import datetime from elasticsea ...

  5. electron demo项目npm install安装失败解决办法

    electron官网提供的demo项目,在npm install 的时候总是报错显示安装失败, 解决办法:FQ即可成功安装.

  6. char与TCHAR相互转换(拒绝中文乱码,好用!)

    C++编程中屡屡要遇到宽窄字符转换的问题,尤其是字符串中有中文,稍有不慎就会中文乱码,程序运行出错. 下面为char*.char[]与TCHAR*.TCHAR[]互转的用法,不求花哨,只求好用!请参考 ...

  7. ava中有三种移位运算符

    转自:http://www.cnblogs.com/hongten/p/hongten_java_yiweiyunsuangfu.html <<      :     左移运算符,num ...

  8. less语法(二)混合属性

    摘要: 前面介绍了less的变量和extend语法,今天在研究下混合属性(Mixin).混合可以说是less的另一个特征,你可以将通用属性定义在一块,然后使用时直接调用此混合属性. 混合: 在 LES ...

  9. pycharm使用docker镜像的python解释器,pycahrm可视化操作和管理dcoker

    网上关于pycahrm怎么使用docker容器的python解释器的科普,这方面太少,一半都只介绍pycahrm怎么使用linux的解释器.首先pycahrm确保是pro版本. 下面详细的介绍步骤 首 ...

  10. Jackson Gson Json.simple 比较

    为公司做了小任务,需要用到Java Json库,Json库我几个月之前就用过,不过那时候是跟着项目来的,延续了项目的使用习惯直接用了jackson Json,而这次我觉得好好比较一下几个常见的Json ...