通过Athena访问Amazon EMR上HBase域名解析失败如何解决
问题根因
你遇到的报错核心是HBase客户端从ZooKeeper获取到的是EMR节点的内部私有域名(ip-xxx.my.domain.com格式),部署在VPC中的Lambda无法正常解析该自定义后缀的私有域名,和你推测的逻辑一致:即使你配置公网ZK地址,HBase客户端拉取到的集群节点地址依然是内部域名,所以还是会解析失败。
可行解决方案
方案1:配置Route 53私有托管区实现解析(最推荐,无业务侵入)
- 进入AWS Route 53控制台,创建私有托管区,域名填写你VPC DHCP里配置的
my.domain.com,关联Lambda和EMR所在的VPC - 为你的EMR HBase Master节点、RegionServer节点批量添加A记录,把
ip-10-113-8-29.my.domain.com这类域名直接映射到对应节点的私有IP - 不需要修改Lambda和EMR的任何配置,等待DNS记录生效后重试即可,VPC内的资源默认会走Route53私有托管区的解析规则
方案2:修改Lambda的Hosts文件强制绑定解析
如果不想配置Route53,可以在Lambda函数启动时动态写入hosts规则,针对Java版的Athena Lambda你可以这么改:
- 在Lambda的处理函数最开头增加代码,把需要的HBase节点域名和IP的映射写入
/etc/hosts文件,Lambda运行环境的/etc目录是可写的 - 参考Java代码片段:
File hosts = new File("/etc/hosts"); FileWriter writer = new FileWriter(hosts, true); writer.write("\n10.113.8.29 ip-10-113-8-29.my.domain.com\n"); // 其他HBase节点的映射也按相同格式追加 writer.close();
- 缺点是如果EMR集群重建或者节点IP变更,需要同步更新Lambda里的绑定规则
方案3:修改EMR HBase配置,返回IP而不是域名
直接修改HBase的配置,让ZK里存储的节点地址直接是IP而不是域名,从根源避免解析问题:
- 进入EMR控制台,修改HBase的配置项:
- 把
hbase.regionserver.dns.interface改为对应内网网卡名(通常是eth0) - 新增配置项
hbase.regionserver.hostname设置为节点的私有IP - 新增配置项
hbase.master.hostname设置为HBase Master节点的私有IP
- 把
- 重启HBase服务后,ZK中存储的节点地址就会变成IP,不需要做任何解析配置Lambda就能正常连接
- 缺点是需要重启HBase服务,会中断正在运行的HBase任务
方案4:配置Lambda的VPC DNS服务器
你也可以直接指定Lambda运行时使用的DNS地址为你VPC内部的DNS服务器:
- 在Lambda的环境变量中增加
JAVA_TOOL_OPTIONS,值为-Dsun.net.spi.nameservice.provider.1=dns,sun -Dsun.net.spi.nameservice.nameservers=VPC内部DNS地址 - VPC的默认DNS地址通常是VPC网段的基础上加2,比如VPC网段是10.113.0.0/16,DNS地址就是
10.113.0.2
内容的提问来源于stack exchange,提问作者Andrey Chuchalov
相关产品推荐
相关产品推荐

