启动hive报namenode.safemode
[root@master hadoop-2.6.5]# hive
Logging initialized using configuration in jar:file:/usr/local/src/apache-hive-1.2.2-bin/lib/hive-common-1.2.2.jar!/hive-log4j.properties
Exception in thread "main" java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.SafeModeException): Cannot create directory /tmp/hive/root/a8ec83f9-45e3-4182-ac3f-8e9c9fa5c184. Name node is in safe mode.
...
Caused by: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.SafeModeException): Cannot create directory /tmp/hive/root/a8ec83f9-45e3-4182-ac3f-8e9c9fa5c184. Name node is in safe mode.
原因分析:
刚启动完hadoop时,hadoop会进入安全模式,此时不能对hdfs进行上传、修改、删除文件等操作。而hive依赖于hadoop,因此报上述ERROR。
hadoop为了防止数据丢失,启动了“安全模式”的设置,每次启动hadoop后一段时间内集群处于安全模式,该模式下集群会检查各节点文件块的记录,如果数据块中满足replication设置值的数据块的数量在总数据块数量中所占比例没有超过一定值(称为安全模式阀值,默认为0.999f),那么集群将持续处于安全模式,在该模式下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。
安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入安全模式。在实践过程中,系统启动时去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。
但是如果是在小型测试集群,往往因为结点数量较少,很可能导致集群一直处于安全模式无法自动退出,这种情况下可以通过两种方式进行设置:
(1)在安全模式下输入(推荐):
hdfs dfsadmin -safemode leave
其他的
hdfs dfsadmin -safemode [enter/leave/get/wait]
enter - 进入安全模式
leave - 强制NameNode离开安全模式
get - 返回安全模式是否开启的信息
wait - 等待,一直到安全模式结束
(2)在HDFS配置文件中修改安全模式阀值
在/hadoop-2.6.5/etc/hadoop/hdfs-site.xml中设置安全阀值属性,属性值默认为0.999f,如果设为1则不进行安全检查,因为是在配置文件中进行硬修改,不利于管理员操作和修改,因此不推荐此方式
<property>
<name>dfs.safemode.threshold.pct</name>
<value>0.999f</value>
<description>
Specifies the percentage of blocks that should satisfy
the minimal replication requirement defined by dfs.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.
</description>
</property>
如果离开安全模式后,再次启动hive时,仍然报安全模式故障,则:
应该是hafs的文件有损坏,删除损坏文件即可
hdfs fsck / -delete
删除后再重起hive即可
这里也提醒一下,关闭虚拟机之前,最好先关闭Hadoop相关组件,避免丢失数据