升级Apache Accumulo 2.0.1与ZooKeeper 3.8.1后无法检测ZooKeeper的解决办法
问题
将包含Apache Accumulo和ZooKeeper的Docker栈更新,原配置适配Accumulo 1.9.3与ZooKeeper 3.4.8,升级至Accumulo 2.0.1和ZooKeeper 3.8.1后,Accumulo无法检测到ZooKeeper,调整环境变量无效,需修改Dockerfile或docker-compose中的哪些配置?
旧Dockerfile内容:
FROM hdfs-custom-image ARG TAG ARG ZOOKEEPER_VERSION ARG ACCUMULO_VERSION # Install Zookeeper ENV ZOOKEEPER_VERSION ${ZOOKEEPER_VERSION} ENV ZOOKEEPER_HOME /opt/zookeeper ENV ZOOKEEPER_DATA /data/zookeeper ENV ZOOKEEPER_CONF_DIR $ZOOKEEPER_HOME/conf ENV ZOO_LOG4J_PROP WARN,CONSOLE ENV PATH $PATH:$ZOOKEEPER_HOME/bin ENV ACCUMULO_HOME=/opt/accumulo ENV PATH="$PATH:/opt/accumulo/bin" RUN set -x \ && mkdir -p $ZOOKEEPER_HOME $ZOOKEEPER_DATA \ && curl -# https://archive.apache.org/dist/zookeeper/zookeeper-${ZOOKEEPER_VERSION}/apache-zookeeper-${ZOOKEEPER_VERSION}.tar.gz \ | tar -xz -C ${ZOOKEEPER_HOME} --strip-components=1 # Install Accumulo ENV ACCUMULO_VERSION ${ACCUMULO_VERSION} ENV ACCUMULO_HOME /opt/accumulo ENV ACCUMULO_CONF_DIR $ACCUMULO_HOME/conf ENV PATH=$PATH:$ACCUMULO_HOME/bin ADD accumulo-${ACCUMULO_VERSION}-bin.tar.gz /opt RUN set -x \ && mv /opt/accumulo-${ACCUMULO_VERSION} ${ACCUMULO_HOME} \ && yum install -y make gcc-c++ \ # && bash -c "${ACCUMULO_HOME}/bin/build_native_library.sh" \ && yum -y autoremove gcc-c++ WORKDIR "${ACCUMULO_HOME}" COPY ./fs/sbin /sbin COPY ./fs/opt /opt ENTRYPOINT [ "/sbin/entrypoint.sh" ]
解决方案
一、Dockerfile核心调整
1. 修复ZooKeeper下载包类型
ZooKeeper 3.5+版本后,官方二进制包带-bin后缀,原下载地址指向源码包,会导致无法运行。修改下载命令:
# 替换原ZooKeeper下载行 && curl -# https://archive.apache.org/dist/zookeeper/zookeeper-${ZOOKEEPER_VERSION}/apache-zookeeper-${ZOOKEEPER_VERSION}-bin.tar.gz \ | tar -xz -C ${ZOOKEEPER_HOME} --strip-components=1
2. 启用Accumulo原生库构建
Accumulo 2.0.x依赖原生库支持,取消注释构建命令并补充编译依赖:
# 修改Accumulo安装段的RUN命令 RUN set -x \ && mv /opt/accumulo-${ACCUMULO_VERSION} ${ACCUMULO_HOME} \ && yum install -y make gcc-c++ openssl-devel \ && bash -c "${ACCUMULO_HOME}/bin/build_native_library.sh" \ && yum -y autoremove gcc-c++ openssl-devel
3. 添加ZooKeeper 3.8.x适配环境变量
新增必要的ZooKeeper配置变量:
# 在ZooKeeper环境变量段添加 ENV ZOO_CLIENT_PORT 2181 ENV ZOO_TICK_TIME 2000
二、Accumulo配置文件修正
修改${ACCUMULO_CONF_DIR}/accumulo.properties中的ZooKeeper相关配置(可在entrypoint脚本中动态生成或挂载自定义配置):
- 指定ZooKeeper地址:
instance.zookeeper.host=zookeeper:2181(对应docker-compose中ZooKeeper服务名) - 调整会话超时适配新版本:
instance.zookeeper.timeout=30s - 设置Accumulo专属ZooKeeper根节点:
instance.zookeeper.root=/accumulo
三、docker-compose.yml配置优化
1. 服务依赖与网络
确保Accumulo依赖ZooKeeper且同属一个网络:
version: '3.8' services: zookeeper: build: context: . args: ZOOKEEPER_VERSION: 3.8.1 ACCUMULO_VERSION: 2.0.1 environment: ZOO_MY_ID: 1 ZOO_SERVERS: server.1=0.0.0.0:2888:3888;2181 volumes: - zk-data:/data/zookeeper networks: - accumulo-net accumulo: build: context: . args: ZOOKEEPER_VERSION: 3.8.1 ACCUMULO_VERSION: 2.0.1 depends_on: - zookeeper environment: ACCUMULO_INSTANCE_NAME: myinstance ACCUMULO_ROOT_PASSWORD: secret ACCUMULO_ZOOKEEPERS: zookeeper:2181 volumes: - accumulo-data:/opt/accumulo/data networks: - accumulo-net volumes: zk-data: accumulo-data: networks: accumulo-net: driver: bridge
2. 健康检查确保服务就绪
给ZooKeeper添加健康检查,避免Accumulo提前启动:
zookeeper: # 其他配置不变 healthcheck: test: ["CMD", "zkServer.sh", "status"] interval: 10s timeout: 5s retries: 5
同时在Accumulo的entrypoint.sh中添加等待ZooKeeper就绪的逻辑:
# 等待ZooKeeper服务可用 until echo ruok | nc zookeeper 2181 | grep imok; do sleep 2 done
四、entrypoint.sh脚本补全
- 生成ZooKeeper配置文件(3.8.x默认无
zoo.cfg,需从模板复制):
cp ${ZOOKEEPER_CONF_DIR}/zoo_sample.cfg ${ZOOKEEPER_CONF_DIR}/zoo.cfg sed -i "s|dataDir=/tmp/zookeeper|dataDir=${ZOOKEEPER_DATA}|" ${ZOOKEEPER_CONF_DIR}/zoo.cfg echo "clientPort=${ZOO_CLIENT_PORT}" >> ${ZOOKEEPER_CONF_DIR}/zoo.cfg echo "tickTime=${ZOO_TICK_TIME}" >> ${ZOOKEEPER_CONF_DIR}/zoo.cfg
- 初始化Accumulo时指定正确的ZooKeeper地址:
accumulo init --instance-name $ACCUMULO_INSTANCE_NAME --password $ACCUMULO_ROOT_PASSWORD --zk-hosts $ACCUMULO_ZOOKEEPERS
内容的提问来源于stack exchange,提问作者Luigi
相关产品推荐
相关产品推荐

