Hdfs 的安全模式,即 HDFS safe mode, 是 HDFS 文件系统的一种特殊状态,在该状态下,hdfs 文件系统只接受读数据请求,而不接受删除、修改等变更请求,当然也不能对底层的 block 进行副本复制等操作。
从本质上将,安全模式 是 HDFS 的一种特殊状态,而 HDFS 进入该特殊状态的目的,是为了确保整个文件系统的数据一致性/不丢失数据,从而限制用户只能读取数据而不能改动数据的。
HDFS 进入安全模式的情况分为两种,即主动进入与被动进入。
管理员出于运维管理等各种原因,可以主动执行命令让 hdfs 进入安全模式,相关的命令有:hdfs dfsadmin -safemode enter/get/leave;
HDFS 也可能会主动进入安全模式,这种情况更为常见,是 HDFS 在特殊状况下,为了保证整个文件系统的数据一致性/整个文件系统不丢失数据,而主动进入的一种自我保护状态,底层根本原因又分为两种:
从现实情况来看,常见的HDFS进入安全模式的直接原因有:
当 HDFS 主动进入安全模式后,首先需要分析其主动进入安全模式的原因,可以通过以下途径进行分析:
- org.apache.hadoop.hdfs.server.namenode.FSNamesystem:NameNode low on available disk space.Already in safemode.
- org.apache.hadoop.hdfs.StateChange: STATE* Safemode is ON. Resources are low on NN. Please add or free up more resources then turn off safemode manually. NOTE:If you turn off safemode before adding resources,the NN will immediately return to safemode. Use"hdfs dfsadmin -safemode leave" to turn safemode off.
- org.apache.hadoop.hdfs.server.namenode.NameNodeResourceChecker:Space available on volume '/dev/mapper/rhel-root' is 103092224, which is below the configured reserved amount 104857600
通过以上排查确认进入安全模式的原因后,就可以进行针对性的修复了:
不对 hdfs 主动进入安全模式的具体原因进行分析,而是直接通过如下方法强制退出安全模式,是无脑的错误示范:
HDFS 安全模式相关参数有:
- dfs.namenode.safemode.threshold-pct: 副本数达到最小要求的 block 占系统总block数的百分比, default 0.999f,Specifies the percentage of blocks that should satisfy the minimal replication requirement defined by dfs.namenode.replication.min. Values less than or equal to 0 mean not to wait for any particular percentage of blocks before exiting safemode. Values greater than 1 will make safe mode permanent;
- dfs.namenode.safemode.min.datanodes:离开安全模式的最小可用datanode数量要求,default 0,Specifies the number of datanodes that must be considered alive before the name node exits safemode. Values less than or equal to 0 mean not to take the number of live datanodes into account when deciding whether to remain in safe mode during startup. Values greater than the number of datanodes in the cluster will make safe mode permanent;
- dfs.namenode.safemode.extension:集群可用 block 比例、可用 datanode 都达到要求之后,自动退出安全模式的时延,default 30000,Determines extension of safe mode in milliseconds after the threshold level is reached. Support multiple time unit suffix (case insensitive), as described in dfs.heartbeat.interval;
- dfs.namenode.safemode.replication.min: 判断能否退出安全模式时对 block 的最小副本数的要求,默认为1,a separate minimum replication factor for calculating safe block count. This is an expert level setting. Setting this lower than the dfs.namenode.replication.min is not recommend and/or dangerous for production setups. When it's not set it takes value from dfs.namenode.replication.min;
- dfs.namenode.replication.min: block 的最小副本数,default 1, Minimal block replication;
其他磁盘预留空间大小类参数:dfs.datanode.du.reserved/dfs.datanode.du.reserved.pct/dfs.datanode.du.reserved.calculator/dfs.namenode.resource.du.reserved/dfs.namenode.resource.checked.volumes/dfs.namenode.resource.checked.volumes.minimum;
某客户线上业务系统中的大数据 HIVE 作业无法运行,查看 hdfs 发现进入了安全模式,如下所示:

进一步查看发现,所有 datanode 都成功启动了,但部分 datanode 存在存储卷故障,且这些存储卷背后是 nfs 网络文件系统,如下所示:


查看 datanode日志发现,datanode 底层的 DataXceiver 线程无法读取部分 block,导致 ReplicaNotFoundException:

通过 CM 管控台的 “诊断-日志” 页面,指定服务为HDFS,指定时间为近期1个小时,指定日志级别为 WARN,搜索发现,调用方法
user=pwd.getpwuid(s.st_uid) 时报错了:keyError:‘getpwuid(): uid not found: 4294967294’,且报错对应的正是 nfs 网盘目录:

通过 ls 命令查看发现,上述报错对应的 nfs 网盘目录的 owner显示的正是错误信息中的 4294967294,而不是用户名比如 hdfs等,且通过命令 ”uid hdfs“ 查看发现 hdfs 对应的uid并不是4294967294:

至此问题确认,概括如下:
nfs 挂载的目录被认为是 “Datanode Volume Failures” ,所以 nfs 目录下的 block 数据对 hdfs 不可读写,所以副本数达到最小要求的 block 占系统总 block 数的百分比达不到默认的阈值,hdfs 出于数据一致性的要求,自动进入了安全模式;
而导致 hdfs 无法读写 nfs 对应目录下的 block数据的原因是,不知出于何种原因,nfs 对应目录的 owner/group 显示的是 4294967294/4294967294,而不是期望的 hdfs/hdfs,所以底层调用方法 user=pwd.getpwuid(s.st_uid)获取 nfs 对应目录的woner/group 时,报错了:keyError:‘getpwuid(): uid not found: 4294967294’,最后 hdfs 因为无法获取 nfs 对应目录的 owner/group 而无法读取该目录下的文件;
为修复问题,手动通过命令 chown 更改了nfs 对应目录的 owner/group 为 hdfs/hdfs,然后重启 hdfs,在重启后 hdfs 自动进入并自动退出了安全模式,正常对外提供读写服务。
为避免节点重启再出现上述问题,后续安排了了解 nfs 的运维同学帮忙排查下 nfs 挂载的目录为什么显示的 owner/group 是 4294967294/4294967294 而不是 hdfs/hdfs。
最后需要强调说明下,由于 NFS 在性能和稳定性上相比本地磁盘差距不小,不建议在 hdfs 底层使用 nfs 网盘。(如果在测试等环境使用 nfs 网盘,一定要记得需要通过修改文件 /etc/fstab 确保开机自动挂载 nfs).
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
我正在使用ruby2.1.0我有一个json文件。例如:test.json{"item":[{"apple":1},{"banana":2}]}用YAML.load加载这个文件安全吗?YAML.load(File.read('test.json'))我正在尝试加载一个json或yaml格式的文件。 最佳答案 YAML可以加载JSONYAML.load('{"something":"test","other":4}')=>{"something"=>"test","other"=>4}JSON将无法加载YAML。JSON.load("
了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl