Apache Drill:同一服务器部署多Drillbit启动失败求助
本地搭建多Drillbit节点Apache Drill集群启动失败问题
问题背景
在本地搭建包含3个Drillbit节点的Apache Drill集群,已部署3个ZooKeeper节点(192.168.1.2:2181、192.168.1.3:2181、192.168.1.4:2181),并为每个Drillbit准备独立配置目录,包含不同的drill-env.sh和统一的drill-override.conf:
各节点drill-env.sh配置
- node1配置:
export DRILL_HOST_NAME=node1 export DRILL_IDENT_STRING="node1" export DRILL_PID_DIR=${DRILL_PID_DIR:-"<path_to_pid_dir>/pid_dir1/"}
- node2配置:
export DRILL_HOST_NAME=node2 export DRILL_IDENT_STRING="node2" export DRILL_PID_DIR=${DRILL_PID_DIR:-"<path_to_pid_dir>/pid_dir2/"}
- node3配置:
export DRILL_HOST_NAME=node3 export DRILL_IDENT_STRING="node3" export DRILL_PID_DIR=${DRILL_PID_DIR:-"<path_to_pid_dir>/pid_dir3/"}
drill-override.conf配置
drill.exec: { cluster-id: "mycluster", zk.connect: "192.168.1.2:2181,192.168.1.3:2181,192.168.1.4:2181", }
/etc/hosts配置
192.168.1.2 node1 192.168.1.3 node2 192.168.1.4 node3
启动命令
/bin/drillbit.sh --config <path_to_conf>/conf1/ start /bin/drillbit.sh --config <path_to_conf>/conf2/ start /bin/drillbit.sh --config <path_to_conf>/conf3/ start
问题现象
仅第一个Drillbit能正常启动,其余启动失败,抛出端口绑定异常:
Exception in thread "main" org.apache.drill.exec.exception.DrillbitStartupException: Failure during initial startup of Drillbit. at org.apache.drill.exec.server.Drillbit.start(Drillbit.java:590) at org.apache.drill.exec.server.Drillbit.start(Drillbit.java:556) at org.apache.drill.exec.server.Drillbit.main(Drillbit.java:552) Caused by: org.apache.drill.common.exceptions.UserException: RESOURCE ERROR: Drillbit could not bind to port 31010. Server type: UserServer [Error Id: bb497859-bf3e-43b7-bad7-dfa295122068 ] at org.apache.drill.common.exceptions.UserException$Builder.build(UserException.java:688) at org.apache.drill.exec.rpc.BasicServer.bind(BasicServer.java:211) at org.apache.drill.exec.service.ServiceEngine.start(ServiceEngine.java:100) at org.apache.drill.exec.server.Drillbit.run(Drillbit.java:227) at org.apache.drill.exec.server.Drillbit.start(Drillbit.java:586) ... 2 more Caused by: java.net.BindException: Address already in use at java.base/sun.nio.ch.Net.bind0(Native Method) at java.base/sun.nio.ch.Net.bind(Net.java:555)
已确认ZooKeeper运行正常,尝试设置allow_loopback_address_binding: true无效,希望使用相同端口而非为每个节点分配不同端口。
解决方案说明
目前在Drill 1.21.1版本之前,Drillbit默认会绑定到0.0.0.0(所有可用IP),导致同一机器上多个Drillbit无法使用相同端口启动。官方已在DRILL-8409问题中修复该问题,即将发布的Drill 1.21.1版本将支持为每个Drillbit绑定特定IP地址。
在等待新版本发布期间,若要在同一机器上用相同端口启动多Drillbit节点,可采用以下临时方案:
方案1:使用不同端口
在每个节点的drill-override.conf中为各服务指定不同端口,示例:drill.exec: { cluster-id: "mycluster", zk.connect: "192.168.1.2:2181,192.168.1.3:2181,192.168.1.4:2181", user.port: 31010, control.port: 31011, data.port: 31012, http.port: 8047 }每个节点对应修改上述端口值,确保不冲突。
方案2:使用网络命名空间(Linux环境)
为每个Drillbit节点创建独立的网络命名空间,分配不同的虚拟IP,这样每个节点可绑定各自的虚拟IP和相同端口,避免端口冲突。
内容的提问来源于stack exchange,提问作者ztv
相关产品推荐
相关产品推荐

