如何让 HBase 等到 HDFS 准备好后再启动?

问题描述 投票:0回答:2

我正在为 Hadoop 构建自动安装脚本,但遇到了 HBase 无法启动的问题,因为 HDFS 尚未完全启动并准备就绪。我如何以编程方式(最好是从 Bash)判断 HDFS 系统是否已准备好 HBase 启动,以便我可以等到它准备好?

我尝试使用“hadoop dfsadmin -report”并查找正确数量的节点,但显然在集群实际准备好业务之前仍然会返回。

bash hadoop hbase hdfs
2个回答
5
投票

使用

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
循环可能仍然有用。我见过当我们在设置集群时出错时会发生这种情况。


0
投票

这似乎是一篇有点旧的帖子,但我想补充一点。

启动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

希望这对您有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.