最近公司新項目申請資源,虛擬機資源打開時候使用source login.sh的腳本來進行登錄注冊,好奇心驅使下看了看里面的shell腳本,使用到了hiveserver2的zookeeper連接,百度一下找了篇博客學習一下;
轉自:https://blog.csdn.net/qq_30950329/article/details/78024282
在生產環境中使用Hive,強烈建議使用HiveServer2來提供服務,好處很多:
1. 在應用端不用部署Hadoop和Hive客戶端;
2. 相比hive-cli方式,HiveServer2不用直接將HDFS和Metastore暴漏給用戶;
3. 有安全認證機制,並且支持自定義權限校驗;
4. 有HA機制,解決應用端的並發和負載均衡問題;
5. JDBC方式,可以使用任何語言,方便與應用進行數據交互;
6. 從2.0開始,HiveServer2提供了WEB UI。
如果使用HiveServer2的Client並發比較少,可以使用一個HiveServer2實例,沒問題。

但如果這一個實例掛掉,那么會導致所有的應用連接失敗。
Hive從0.14開始,使用Zookeeper實現了HiveServer2的HA功能(ZooKeeper Service Discovery),Client端可以通過指定一個nameSpace來連接HiveServer2,而不是指定某一個host和port。本文學習和研究HiveServer2的高可用配置。使用的Hive版本為apache-hive-2.0.0-bin。

如上圖,我准備在node1和node2上分別啟用兩個HiveServer2的實例,並通過zookeeper完成HA的配置。
Hive配置
注:這里假設你的Zookeeper已經安裝好,並可用。
在兩個安裝了apache-hive-2.0.0-bin的機器上,分別編輯hive-site.xml,添加以下參數:
-
<property>
-
<name>hive.server2.support.dynamic.service.discovery</name>
-
<value>true</value>
-
</property>
-
-
<property>
-
<name>hive.server2.zookeeper.namespace</name>
-
<value>hiveserver2_zk</value>
-
</property>
-
-
<property>
-
<name>hive.zookeeper.quorum</name>
-
<value> zkNode1:2181,zkNode2:2181,zkNode3:2181</value>
-
</property>
-
<property>
-
<name>hive.zookeeper.client.port</name>
-
<value>2181</value>
-
</property>
-
<property>
-
<name>hive.server2.thrift.bind.host</name>
-
<value>0.0.0.0</value>
-
</property>
-
<property>
-
<name>hive.server2.thrift.port</name>
-
<value>10001</value> //兩個HiveServer2實例的端口號要一致
-
</property>
先啟動第一個HiveServer2 :
cd $HIVE_HOME/bin
./hiveserver2

再啟動另一個:

第二個實例啟動后,ZK中可以看到兩個都注冊上來。
JDBC連接
JDBC連接的URL格式為:
jdbc:hive2://<zookeeper quorum>/<dbName>;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2
其中:
<zookeeper quorum> 為Zookeeper的集群鏈接串,如zkNode1:2181,zkNode2:2181,zkNode3:2181
<dbName> 為Hive數據庫,默認為default
serviceDiscoveryMode=zooKeeper 指定模式為zooKeeper
zooKeeperNamespace=hiveserver2 指定ZK中的nameSpace,即參數hive.server2.zookeeper.namespace所定義,我定義為hiveserver2_zk
使用beeline測試連接:
-
cd $HIVE_HOME/bin
-
./beeline
-
!connect jdbc:hive2://zkNode1:2181,zkNode2:2181,zkNode3:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_zk liuxiaowen ""

可以正常連接。
執行一個HQL查詢,日志中顯示連接到的HiveServer2實例為Node2,停掉Node2中的HiveServer2實例后,需要重新使用!connect命令連接,之后可以繼續正常執行查詢,日志顯示連接到了Node1中的實例。
關於Hadoop2中的用戶權限認證
本例中兩個HiveServer2實例均使用普通用戶liuxiaowen啟動,
剛開始使用beeline鏈接時候報錯:
1. Error: Failed to open new session:
2. java.lang.RuntimeException: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.security.authorize.AuthorizationException):
3. User: liuxiaowen is not allowed to impersonate liuxiaowen (state=,code=0)
這是由於Hadoop2中的用戶權限認證導致的。
參考資料:
https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/Superusers.html
http://dongxicheng.org/mapreduce-nextgen/hadoop-secure-impersonation/
解決辦法:
在Hadoop的core-site.xml中增加配置:
-
<property>
-
<name>hadoop.proxyuser.liuxiaowen.groups</name>
-
<value>*</value>
-
</property>
-
-
<property>
-
<name>hadoop.proxyuser.liuxiaowen.hosts</name>
-
<value>*</value>
-
</property>
其中 liuxiaowen 為啟動HiveServer2的用戶。
使用超級用戶hadoop刷新配置:
yarn rmadmin -refreshSuperUserGroupsConfiguration
hdfs dfsadmin -refreshSuperUserGroupsConfiguration
如果是對namenode做過HA,則需要在主備namenode上執行:
hdfs dfsadmin -fs hdfs://cdh5 -refreshSuperUserGroupsConfiguration
之后問題解決,后續再詳細研究這塊。
至此,HiveServer2的多實例高可用-Ha配置完成,的確能解決生產中的很多問題,比如:並發、負載均衡、單點故障、安全等等。
因此強烈建議在生產環境中使用該模式來提供Hive服務。
