hiveserver2和zookeeper的HA搭建(轉)


最近公司新項目申請資源,虛擬機資源打開時候使用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,添加以下參數:

 

 

  1.  
    <property>
  2.  
    <name>hive.server2.support.dynamic.service.discovery</name>
  3.  
    <value>true</value>
  4.  
    </property>
  5.  
     
  6.  
    <property>
  7.  
    <name>hive.server2.zookeeper.namespace</name>
  8.  
    <value>hiveserver2_zk</value>
  9.  
    </property>
  10.  
     
  11.  
    <property>
  12.  
    <name>hive.zookeeper.quorum</name>
  13.  
    <value> zkNode1:2181,zkNode2:2181,zkNode3:2181</value>
  14.  
    </property> 
  15.  
    <property>
  16.  
    <name>hive.zookeeper.client.port</name>
  17.  
    <value>2181</value>
  18.  
    </property> 
  19.  
    <property>
  20.  
    <name>hive.server2.thrift.bind.host</name>
  21.  
    <value>0.0.0.0</value>
  22.  
    </property> 
  23.  
    <property>
  24.  
    <name>hive.server2.thrift.port</name>
  25.  
    <value>10001</value> //兩個HiveServer2實例的端口號要一致
  26.  
    </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測試連接:

  1.  
    cd $HIVE_HOME/bin
  2.  
    ./beeline
  3.  
    !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中增加配置:

  1.  
    <property>
  2.  
    <name>hadoop.proxyuser.liuxiaowen.groups</name>
  3.  
    <value>*</value>
  4.  
    </property>
  5.  
     
  6.  
    <property>
  7.  
    <name>hadoop.proxyuser.liuxiaowen.hosts</name>
  8.  
    <value>*</value>
  9.  
    </property>

 

其中 liuxiaowen 為啟動HiveServer2的用戶。

使用超級用戶hadoop刷新配置:

yarn rmadmin -refreshSuperUserGroupsConfiguration

hdfs dfsadmin -refreshSuperUserGroupsConfiguration

如果是對namenode做過HA,則需要在主備namenode上執行:

hdfs dfsadmin -fs hdfs://cdh5 -refreshSuperUserGroupsConfiguration

之后問題解決,后續再詳細研究這塊。

至此,HiveServer2的多實例高可用-Ha配置完成,的確能解決生產中的很多問題,比如:並發、負載均衡、單點故障、安全等等。

因此強烈建議在生產環境中使用該模式來提供Hive服務。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM