欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Zookeeper安装 Zookeeper启动 报错Error: JAVA_HOME is not set and java could not be found in PATH

程序员文章站 2022-04-28 12:42:09
...

Zookeeper启动 报错Error: JAVA_HOME is not set and java could not be found in PATH

背景:

原本打算安装 calal, kafkaclickhouse_sinker 配合使用。读取mysqlbinlog日志,实现 mysql 数据同步到clickhouse

重新启动一个新的虚拟机,开始尝试。

虽然kafka2.8可以不需要zookeeper的情况下执行。但是本人还是钟爱kafka2.6.2。由于这个版本需要zookeeper的支持,所有先安装zookeeper。就出现了这篇文章的内容了。

操作:

一、了解zookeeper

zookeeper官网:https://zookeeper.apache.org/
zookeeper下载地址:https://zookeeper.apache.org/releases.html

二、下载zookeeper 我使用的是3.6.3版本

$ wget https://dlcdn.apache.org/zookeeper/zookeeper-3.6.3/apache-zookeeper-3.6.3-bin.tar.gz

三、解压

- bin.tar.gz结尾的包,解压后是可以直接运行的包,不需要编译,下载的时候注意自己下载的是源码包还是编译后的可执行包。

- 解压到指定目录
$ tar -zxvf apache-zookeeper-3.6.3-bin.tar.gz -C ../soft/zookeeper/

四、安装java

  • 解压下载的包
$ wget -zxvf jdk-8u291-linux-x64.tar.gz -C ../soft/java
  • 配置环境变量 将下面配置追加到 /etc/profile 里面
    # set java env
    export JAVA_HOME=/home/han/work/soft/java
    export JRE_HOME=${JAVA_HOME}/jre
    export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
    export PATH=${JAVA_HOME}/bin:$PATH
    
  • 验证java环境是否ok
[email protected]:/home/han/work/package# java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
[email protected]:/home/han/work/package# echo $JAVA_HOME
/home/han/work/soft/java
[email protected]:/home/han/work/package#

五、运行zookeeper

[email protected]:/home/han/work/soft/zookeeper/apache-zookeeper-3.6.3-bin# sh bin/zkServer.sh
bin/zkServer.sh: 78: /home/han/work/soft/zookeeper/apache-zookeeper-3.6.3-bin/bin/zkEnv.sh: [[: not found
-p: not found
java is /home/han/work/soft/java/bin/java
Error: JAVA_HOME is not set and java could not be found in PATH.

六、报错原因排查

Error: JAVA_HOME is not set and java could not be found in PATH.

  • 权限排查:

    没找到java和java_home,第一反应是不可能的。java和java_home肯定是有的。会不会java权限问题,调整了一下权限,运行还是报错。

  • 查看运行文件zkEnv.sh

if [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]];  then
    JAVA="$JAVA_HOME/bin/java"
elif type -p java; then
    JAVA=java
else
    echo "Error: JAVA_HOME is not set and java could not be found in PATH." 1>&2
    exit 1
fi

发现了问题 shell脚本中 if [[]] 语法的问题

七、总结:

  • zookeeper3.5版本后关于java_home判断做个调整。3.5版本之前的
    if [ "$JAVA_HOME" != "" ]; then
      JAVA="$JAVA_HOME/bin/java"
    else
      JAVA=java
    fi
    
  • shell语法 [[]] 和 []
    [[]]结构比Bash版本的[]更通用。在[[和]]之间的所有的字符都不会被文件扩展或是标记分割,但是会有参数引用和命令替换。

用[[ … ]]测试结构比用[ … ]更能防止脚本里的许多逻辑错误。比如说,&&,||,<和>操作符能在一个[[]]测试里通过,但在[]结构会发生错误。

  • so:方案
    使用
bash zkServer.sh 

或者

./zkServer.sh

代替

sh zkServer.sh