我正在为 Hadoop 构建自动安装脚本,但遇到了 HBase 无法启动的问题,因为 HDFS 尚未完全启动并准备就绪。我如何以编程方式(最好是从 Bash)判断 HDFS 系统是否已准备好 HBase 启动,以便我可以等到它准备好?
我尝试使用“hadoop dfsadmin -report”并查找正确数量的节点,但显然在集群实际准备好业务之前仍然会返回。
使用
hadoop dfsadmin -safemode wait
检查 HDFS 是否已退出安全模式。像这样的事情应该可以解决问题:
while $HADOOP_HOME/bin/hadoop dfsadmin -safemode wait | grep ON
do
sleep 1s # Or 10s or 1m or whatever time
done
编辑:正如levand在评论中提到的那样,根据HADOOP-756,
-safemode wait
本身将等待安全模式关闭。在这种情况下,您只需发出 wait 即可,而无需 while 循环。但是,如果您只想继续尝试一定的时间并在 DFS 仍未启动或其他情况下终止进程,那么 while
循环可能仍然有用。我见过当我们在设置集群时出错时会发生这种情况。
这似乎是一篇有点旧的帖子,但我想补充一点。
启动HDFS时,如果使用
hdfs dfsadmin -safemode wait
,可能会抛出以下异常:
safemode: Call From shworker1/xxx.xxx.xxx.xxx to main:8020 failed on connection exception: java.net.ConnectException: Connection refused; For more details see: http://wiki.apache.org/hadoop/ConnectionRefused
显然是HDFS启动不完整导致的。
因此,我添加了一个简单的循环来确保 HDFS 正确启动并退出安全模式,然后再继续进一步操作:
echo "Waiting for HDFS to start..."
hdfs_started=false
while [ $hdfs_started == false ]; do
# Block until HDFS exits safe mode or cannot connect to the NameNode
hdfs dfsadmin -safemode wait
if [ $? -eq 0 ]; then
hdfs_started=true
break
fi
# Note that HDFS may not have started yet and may throw ConnectException: Connection refused, so we need to continue looping
sleep 0.5
echo "HDFS not started yet...Retrying..."
done
希望这对您有帮助!