hadoop - 如何在不导致 Hadoop 进入安全模式的情况下限制 DataNode 上的磁盘使用?
问题描述
我有 3 个节点 Hadoop 2.7.3 集群,可以描述如下:
- 节点A:25gb,DataNode,NameNode
- 节点B:50gb,DataNode
- 节点C:25gb,数据节点
问题是节点A上的磁盘使用率很高(大约 95%)。我想要实现的是限制磁盘使用率,使其永远不会超过 85%。
我尝试将dfs.namenode.resource.du.reserved
属性设置为大约 3gb,但这并不能解决我的问题,因为一旦可用磁盘空间低于该值,我的 Hadoop 就会立即进入安全模式。
我知道,NN 必须提供所有必需的资源才能继续运行,并且只要有任何冗余资源可用,NN 就会继续运行。
另外,我知道dfs.namenode.edits.dir.required
定义所需资源的属性,但我不认为使 NN 冗余而不是必需是一个好主意。
所以我的问题与主题相同。我怎么能对 Hadoop 说:“嘿,听着。这是一个数据节点,把你想要的任何东西放在这里,但是如果磁盘使用率高于 85%,那么不要惊慌——停止在这里放任何东西,继续做你的事情在 DN 的其余部分。”?
我错过了什么吗?甚至可能吗?如果没有,那么你们会建议我做什么?
解决方案
有一个名为 Namenode 资源检查器的进程,它扫描 Namenode 存储卷以查找可用的可用磁盘空间。只要可用空间低于dfs.namenode.resource.du.reserved
属性中指定的值(默认为 100MB),它就会强制 Namenode 进入安全模式。
将其设置为3GB将期望此节点上有可用空间。但是,不考虑 Namenode 的磁盘空间要求,Datanode 将消耗所有可用空间用于其数据存储。
限制datanode在这个特定节点上的磁盘使用,将此属性添加到hdfs-site.xml
<property>
<name>dfs.datanode.du.reserved</name>
<value>3221225472</value>
<description>3GB of disk space reserved for non DFS usage.
This space will be left unconsumed by the Datanode.
</description>
</property>
根据您所需的阈值更改预留空间值。
推荐阅读
- java - AES/CBC/PKCS5PADDING IV - NodeJs 中的解密(Java 加密)
- swift4.1 - 如何获取动态字符串并将其转换为 base64
- c# - 如何对treeView的子节点进行排序
- angularjs - 使用 Angular 获取预定义输入的值
- java - InfluxDBIOException:java.net.SocketTimeoutException:超时
- python - Python:如何从导入中打印所有常量的值?
- android - 由于 FirebaseInstanceIdReceiver 中的 Intent { act=com.google.android.c2dm.intent.RECEIVE 广播而导致 ANR
- angularjs - 如何在没有本地服务器的情况下在 Cordova 中移动 angular 1 项目
- angular - 如何根据输入值更新嵌套的反应式表单
- c# - 关注点分离的 MVC 最佳实践