随笔 - 153  文章 - 0  评论 - 66  阅读 - 131万
  2021年10月22日

解决阿里云Flink连接Kafka报UnknownHostException的问题

问题描述

最近遇到一个较为麻烦的问题,写篇文章记录下解决问题的思路。

在使用阿里云Flink时,想连接公司之前自建的Kafka服务,但报UnknownHostException。这是由于Kafka通过advertised.listeners配置了域名,一般的解决办法是修改本机的/etc/hosts文件,添加域名和对应的IP,这样就能解析成功。但棘手的地方在于阿里云的Flink是云端服务,无法修改/etc/hosts,所以导致该Flink无法正常访问Kafka。后面我们也与公司运维及阿里技术支持进行了交流,阿里给出的解决方案是使用PrivateZone服务,提供一个私有DNS解析服务并绑定对应的VPC。然而阿里的PrivateZone服务也存在一个问题,它的域名只支持FQDN,也就是全路径的域名格式,但我们自建的Kakfa使用了简单Hostname形式,如:cx-kafka1cx-kafka2等,这样导致阿里的方案也被pass了。该集群由于有不少地方在使用,因此配置不能修改,这个问题也被搁置了。最近花了些时间,顺着之前的思路解决了该问题。

原理及解决思路

  • 我们知道bootstrap.servers配置的地址信息,只是Kafka用来获取连接引导信息的地址,是用于发现Kafka完整集群信息的,而连接真正Kafka服务的地址是advertised.listeners广播到Zookeeper的。所以为了正常连接Kafka,客户端必须要能解析advertised.listeners的地址。既然阿里的PrivateZone无法配置我们这样的域名格式,我们能否搭建自己的DNS Server解析该地址,并让阿里的Flink服务使用我们的DNS Server呢?

DNS Server很好办,由于没有大量的解析需求,我采用了短小精悍的dnsmasq,配置起来也很简单。

#dnsmasq config, for a complete example, see:
#  http://oss.segetech.com/intra/srv/dnsmasq.conf
log-queries
address=/cx-kafka1/xxx.xxx.xxx.xxx
address=/cx-kafka2/xxx.xxx.xxx.xxx
.........
.........

测试一下:

然后,向Flink集群开放UDP 53端口,第一步就算OK了。

  • 接下来,就是Flink服务如何去使用该DNS Server,通过调研我们了解到,JVM提供了两个参数sun.net.spi.nameservice.provider.<n>sun.net.spi.nameservice.nameservers,可以指定JVM解析域名的方式。通过在系统管理 > 作业模板 > Flink配置中增加下面的配置,将上面自建的DNS Server地址指定给JVM。
env.java.opts: >-
  -Dsun.net.spi.nameservice.provider.1=default
  -Dsun.net.spi.nameservice.provider.2=dns,sun
  -Dsun.net.spi.nameservice.nameservers=xxx.xxx.xxx.xxx

由于JDK7之后是链式解析,因此默认的解析方式放在前面,如果默认的DNS解析失败就会使用后面我们自定义的DNS Server。经过测试,阿里的Flink正常连接上了我们自己Kafka集群。这里还有一点需要注意,如果上述方法没有生效,Per-Job集群需要新建作业,而Session集群也需要按上面描述重新配置下,这样新的JVM配置才会生效。

上述修改JVM自定义DNS解析的方式,其实也可以延伸到其他不方便配置hosts的环境,如Docker容器中。

posted @ 2021-10-22 19:20 eshizhan 阅读(1669) 评论(0) 推荐(1) 编辑
  2021年8月6日
摘要: 聊聊TCP Keepalive、Netty和Docker 本文主要阐述TCP Keepalive和对应的内核参数,及其在Netty,Docker中的实现。简单总结了工作中遇到的问题,与大家共勉。 起因 之所以研究TCP Keepalive机制,主要是由于在项目中涉及TCP长连接。服务端接收客户端请求 阅读全文
posted @ 2021-08-06 21:21 eshizhan 阅读(1746) 评论(0) 推荐(0) 编辑
  2019年9月1日
摘要: Get the current free disk space in PostgreSQL PostgreSQL获取磁盘空间 "from eshizhan" Here has a simple way to get free disk space without any extended langu 阅读全文
posted @ 2019-09-01 22:27 eshizhan 阅读(560) 评论(0) 推荐(0) 编辑
  2018年4月29日
摘要: | key | value | meaning | | | | | | spark.sql.adaptive.enabled | false | When true, enable adaptive query execution. | | spark.sql.adaptive.shuffle.ta 阅读全文
posted @ 2018-04-29 15:57 eshizhan 阅读(2346) 评论(0) 推荐(0) 编辑
  2017年10月5日
摘要: 最简单的方式离线部署Python依赖包 SHOW ME CODE! 打包: $ tempdir=$(mktemp d /tmp/wheelhouse XXXXX) $ pip wheel r requirements.txt wheel dir=$tempdir $ cwd= $ (cd "$tem 阅读全文
posted @ 2017-10-05 14:26 eshizhan 阅读(2244) 评论(0) 推荐(0) 编辑
摘要: Mock an function to modify partial return value by special arguments on Python python mock一个带参数的方法,修改指定参数的返回值,大家直接看代码就能懂。 want mock code: mock code: 阅读全文
posted @ 2017-10-05 14:02 eshizhan 阅读(384) 评论(0) 推荐(0) 编辑
摘要: pip default install to $HOME/.local on Debian/Ubuntu After pip 8.1.1 2 on Debian or Ubuntu you can pip install package without root user, which defaul 阅读全文
posted @ 2017-10-05 11:51 eshizhan 阅读(420) 评论(0) 推荐(0) 编辑
摘要: [Cassandra] Mutation of bytes is too large for the maxiumum size of Q: `WARN [SharedPool Worker 4] 2015 11 28 20:04:44,663 AbstractTracingAwareExecuto 阅读全文
posted @ 2017-10-05 11:21 eshizhan 阅读(619) 评论(0) 推荐(0) 编辑
  2017年7月30日
摘要: 对于了解Docker容器网络的朋友,我想对虚拟机的网络也不会陌生,毕竟我们是跟随这个时代一起学习和进步的人。相比VM,Docker的网络也在逐步走向成熟,本文主要针对其中的macvlan做下简单的介绍。 Why macvlan? 首先我们去对比下VM和Docker中不同的网络,这样会比较清楚。 NA 阅读全文
posted @ 2017-07-30 00:48 eshizhan 阅读(9263) 评论(0) 推荐(1) 编辑
  2017年5月28日
摘要: 手中有台Netgear WNR2000v3,一直想尝试Openwrt,于是刷机。官方最新固件的稳定版本为15.05.1,该版本自带luci,BUT,不能保存配置,上网查了很久,得出结论,是由于WNR2000v3的Flash太小(4M)导致,放弃。然后去尝试刷Snapshots版本,该版本将luci剪 阅读全文
posted @ 2017-05-28 10:57 eshizhan 阅读(2880) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示