有时候我们启动 hive shell的时候可能会遇到类似如下报错:
......
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.SafeModeException): Cannot create directory /tmp/hive/ycaha/d57fcae3-6387-4434-87c8-237f21008357. Name node is in safe mode.
一、Hadoop NameNode 的安全模式
1.1 什么是SafeMode ?
当 Hadoop NameNode 处于safemode 时,DataNode 对于客户端而言是read-only
的。
当启动 Hadoop 时需要启动 NameNode,在启动 NameNode 时,需要将镜像文件fsimage
载入内存,并执行编辑日志edits log
中的所有操作,以建立完整的文件系统的元数据metadata
(创建新的fsimage
文件和空的edits log
)。在这个过程中,NameNode 将一直处于safemode
。如果满足最小副本条件(配置项minimal replication condition决定)
,NameNode 将会在随后(默认30s,配置项dfs.namenode.safemode.extension)
自动退出safemode。
如果满足“最小副本条件”(minimal replication condition),namenode会在30秒钟之后就退出安全模式。所谓的最小副本条件指的是在整个文件系统中有99.9%的块满足最小副本级别(默认值是1,由dfs.namenode.replication.min属性设置)。
safemode 的属性
属性名称 | 数据类型 | 默认值 | 说明 |
---|---|---|---|
dfs.namenode.replication.min | int | 1 | 成功执行写操作所需要创建的最小副本数目(也称为最小副本级别) |
dfs.namenode.safemode.threshold-pct | float | 0.999 | 在namenode退出安全模式之前,系统中满足最小副本级别(由dfs.namenode.replication.min定义)的块的比例。将这项值设为0或更小会令namenode无法启动安全模式;设为高于1则永远不会退出安全模式 |
dfs.namenode.safemode.extension | int | 30000 | 在满足最小副本条件(由dfs.namenode.safemode.threshold-pct定义)之后,namenode还需要处于安全模式的时间(以毫秒为单位)。对于小型集群(几十个节点)来说,这项值可以设为0 |
1.2 什么情况下,NameNode 处于安全模式 ?
从上述可以看出,当出现下面任一情况时,NameNode 会处于安全模式:
- 在启动
Hadoop NameNode
过程中; - 不满足
最小副本级别
约束条件。
二、如何强制退出安全模式?
有时候需要强制退出安全模式,这时候可以在shell中执行命令(前提:hadoop 配置在了环境变量PATH中):
# hdfs:可执行命令
# dfsadmin:运行一个dfs admin client
# -safemode:参数,安全模式
# get:参数,是否安全模式(on表示是,off表示否)
# enter:参数,进入安全模式
# leave:参数,离开安全模式
hdfs dfsadmin -safemode get # NameNode是否出于安全模式
hdfs dfsadmin -safemode enter # 进入安全模式
hdfs dfsadmin -safemode leave # 离开安全模式
笔者水平有限,如有错误,敬请指正!
网友评论