环境:
- centos 7
- hadoop 2.6.5
- hive 1.2.2
前提,启动hadoop集群,hive依赖hadoop。
启动hive,报错:
[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.
...
解决:离开安全模式
[root@master hadoop-2.6.5]# hdfs dfsadmin -safemode leave
原因:
刚启动完hadoop时,hadoop会进入安全模式,此时不能对hdfs进行上传、修改、删除文件等操作。而hive依赖于hadoop,因此报上述ERROR。
hdfs dfsadmin -safemode [enter/leave/get/wait]
enter - 进入安全模式
leave - 强制NameNode离开安全模式
get - 返回安全模式是否开启的信息
wait - 等待,一直到安全模式结束
hadoop为了防止数据丢失,启动了“安全模式”的设置,每次启动hadoop后一段时间内集群处于安全模式,该模式下集群会检查各节点文件块的记录,如果数据块中满足replication
设置值的数据块的数量在总数据块数量中所占比例没有超过一定值(称为安全模式阀值
,默认为0.999f
),那么集群将持续处于安全模式,在该模式下,文件系统中的内容不允许修改也不允许删除,直到安全模式结束。
安全模式主要是为了系统启动的时候检查各个DataNode上数据块的有效性,同时根据策略必要的复制或者删除部分数据块。运行期通过命令也可以进入安全模式。在实践过程中,系统启动时去修改和删除文件也会有安全模式不允许修改的出错提示,只需要等待一会儿即可。
但是如果是在小型测试集群,往往因为结点数量较少,很可能导致集群一直处于安全模式无法自动退出,这种情况下可以通过两种方式进行设置:
1)、 在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>
因为是在配置文件中进行硬修改,不利于管理员操作和修改,因此不推荐此方式。
2) 直接在bash输入指令脱离安全模式(推荐)
在安全模式下输入指令:
hdfs dfsadmin -safemode leave