【问题标题】:Drill JDBC and Zookeeper throws UnresolvedAddressExceptionDrill JDBC 和 Zookeeper 抛出 UnresolvedAddressException
【发布时间】:2023-03-29 09:07:02
【问题描述】:

我正在尝试使用此处所示的 JDBC 驱动程序从外部连接到 DC/OS 上的容器化分布式 Apache Drill 设置

https://drill.apache.org/docs/using-the-jdbc-driver/#example-of-connecting-to-drill-programmatically

但是,当在集群外部运行它以从我的机器连接时,zookeeper 连接完成,然后它尝试以以下形式解析 Drillbit 地址

2d7f7217340c:31010

2d7f7217340c 是内部钻头 ID,如钻头 Web 控制台中所示

当然会抛出

java.nio.channels.UnresolvedAddressException

直到我在我的本地 /etc/hosts 文件中输入 将2d7f7217340c解析为钻孔节点的公网ip。

我已经搜索了相当多的主题,但没有找到任何东西。 有没有办法将 Zookeeper 或 Drill 配置为返回 IP 而不是 Drillbit ID,以便不需要手动更新 hosts 文件?

【问题讨论】:

  • 您是否指定了以下字符串? Connection connection =DriverManager.getConnection("jdbc:drill:zk= PUBLIC_IP:2181/drill/my_cluster_com-drillbits"); PUBLIC_IP 是你的公共 IP 地址,drillbit 正在运行。
  • 是的,我有connection = DriverManager.getConnection("jdbc:drill:zk=<zk_public_ip>:<zk_port>/drill/<cluster_id>"); jdbc 连接在集群中的节点上运行时有效,但在集群外运行时需要上述主机文件编辑

标签: java docker mesos apache-drill dcos


【解决方案1】:

我注意到地址字符串2d7f7217340c 是由部署期间生成的容器ID 定义的。即使通过

修改容器的主机名

lsns

nsenter --target <container_pid> --uts hostname <public_ip>

在容器中重启drill,zookeeper仍然返回2d7f7217340c地址。

一个可行的解决方案是修改最近在apache-drill/conf/drill-env.sh 中添加的DRILL_HOSTNAME 变量,以通过AWS 元数据服务获取公共主机名

export DRILL_HOSTNAME=`curl -s http://169.254.169.254/latest/meta-data/public-hostname`

公共主机名现在由 Drill 公布,并且可以在外部和内部解析

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多