背景
最近在验证一个计算的方案,使用的是华为开源的数据虚拟化引擎OpenLookeng(hetu),底层基于presto引擎来提供交互式查询分析能力。先前成功部署过一套,添加hive,mysql等数据源一切正常。后重新在其他环境进行部署时,连接hive时出现java.net.UnknownHostException:hacluster。用的是华为平台,hadoop版本为3.1.1,hive版本3.1.1。
问题定位与解决
连接hive数据源需要指定两个配置文件core-site.xml和hdfs-site.xml,开启kerberos验证还需指定user.keytab和krb5.conf验证文件。hacluster是hadoop高可用名称,在core-site.xml的fs.default中有相关配置,在hdfs-site.xml中也有hacluster相关配置。于是我将问题定位到这几个地方
1.本地/etc/hosts没有相关配置
添加平台host文件中配置(无效)
2.core-site.xml文件中相关配置不匹配
修改fs.defaultFS配置,将value改为hdfs://host:port/ (无效)
添加fs.default.name配置(无效)
删除fs.defaultFS配置(无效)
3.hdfs-site文件中相关配置不匹配
将文件中的host名改为ip形式(无效)
4.比对部署成功的OpenLooKeng配置
将core-site.xml和hdfs-site.xml与当前配置文件的配置项一一比对,发现dfs.client.failover.proxy.provider.hacluster配置项的value有所不同,一个是ConfiguredFailoverProxyProvider,本地是AdaptiveFailoverProxyProvider,修改该配置项为ConfiguredFailoverProxyProvider后终于得到解决(有效)
反思
dfs.client.failover.proxy.provider.hacluster配置项的作用是什么呢?
在Hadoop HA集群中,一般有两个NameNode(简写为NN),一个是Active NameNode(简写为ANN),另一个是Standby NameNode(简写为SBNN)。 只有ANN对外提供读写功能,那么当客户端想要对文件系统元数据进行修改操作时,比如创建文件,删除文件,重命名文件等,客户端是如何连接到ANN的呢?dfs.client.failover.proxy.provider.hacluster就是来指定HDFS客户端连接集群中Active状态节点的Java类,而ConfiguredFailoverProxyProvider的意思是按照配置文件的方式去找active NN
怎么按照配置文件找active NN呢?
查看ConfiguredFailoverProxyProvider的源码,在它的构造方法中可以找到答案

下面这行代码返回值map的key为nameServiceId,由hdfs-site.xml中的dfs.nameservices来获取,而
value作为NN的通信地址,由hdfs-site.xml中的dfs.namenode.rpc-address,dfs.ha.namenodes来获取。
Map<String, Map<String, InetSocketAddress>> map = DFSUtilClient.getHaNnRpcAddresses(conf);
将获取的地址添加到proxies中,proxies这个list存储了多个NN的通信地址
this.proxies.add(new ConfiguredFailoverProxyProvider.AddressRpcProxyPair(address));
外部可通过getProxy()接口来实现访问
public synchronized ProxyInfo<T> getProxy() {
ConfiguredFailoverProxyProvider.AddressRpcProxyPair<T> current = (ConfiguredFailoverProxyProvider.AddressRpcProxyPair)this.proxies.get(this.currentProxyIndex);
return this.getProxy(current);
}
总结
由OpenLooKeng的安装与连接Hive数据源的使用中引发的问题定位到HDFS组件,再由HDFS的内部流程加深了配置文件及配置项的理解,有用的知识又增加了。
本文记录了使用OpenLooKeng连接Hive数据源时遇到的hacluster未知主机问题,并通过调整Hadoop配置文件中的dfs.client.failover.proxy.provider.hacluster参数解决了该问题。

5432

被折叠的 条评论
为什么被折叠?



