1. 程式人生 > >hive 伺服器客戶端 理解

hive 伺服器客戶端 理解

在hive的分散式安裝中,網上對於客戶端和伺服器的理解感覺並沒有很清晰。接下來將簡單說一下個人理解,如果有錯,請各位大佬儘管指出,只是一種學習討論罷了。

第一,在安裝hive的各個節點(包括master和slave)上,對應的配置檔案/conf/hive-site.xml中,都有下面這樣一個配置:

<property>  
        <name>javax.jdo.option.ConnectionURL</name>  
        <value>jdbc:mysql://192.168.140.122:3306/hive?createDatabaseIfNotExist=true</value>  
        <description>JDBC connect string for a JDBC metastore</description>      
 </property>

表示儲存hive元資料的地址,可以是MySQL,當然也可以是其他的資料庫。

第二,在網上的某些分散式安裝中,slave節點其實通常安裝的只是客戶端,其/conf/hive-site.xml檔案中比master節點多一個配置:

<property>
        <name>hive.metastore.uris</name>
        <value>thrift://192.168.140.122:9083</value>
 </property>

表示slave節點訪問master節點提供的metastore服務,因此slave節點想要通過hive命令(預設等同於hive --service cli命令)啟動客戶端,需要master節點提前使用hive --servive metastore & 啟動metastore服務(&表示在後臺執行)。

此時的javax.jdo.option.ConnectionURL對於slave節點而言是沒有意義的。

因此,上述配置存在的一個問題就是,假如master的metastore服務未啟動或者意外down掉了,其他slave節點的hive客戶端就無法讀取元資料,出現以下的情況:

相當於還是一個單機hive配置而已。

想要完全分散式,就需要每個節點自己提供metastore服務,因此slave中的那個配置需要去掉,再次使用slave客戶端讀取元資料:

可以看到,在slave節點獨自啟動metastore服務之後就可以訪問元資料了,並且不依賴於master的metastore服務。

如果在slave節點出現上述的異常,原因是之前在MySQL中為hive建立使用者'hive'來訪問hive的元資料時,對訪問該資料庫的IP地址授權的問題,可以如下修改授權:

進入MySQL命令列:

GRANT ALL PRIVILEGES ON *.* TO 'hive'@'%' IDENTIFIED BY 'hive';//兩個hive分別對應hive-site.xml中的username和password

flush privileges;

注意之前在MySQL中肯定是建立過該hive使用者的,且密碼為hive。//   create user hive identified by 'hive';

在master節點中不需要使用hive --service metastore &命令就可以訪問元資料,而slave節點必須自己使用命令才可以啟動,這個暫時不知道什麼原因,可能是MySQL也安裝在master上?這個有待後序考慮驗證。

有人肯定想說雖然你在不同節點上都啟動了metastore服務,可以保證各自不相互依賴,但是元資料庫(這裡是MySQL)炸了怎麼辦?這個可以通過keepalived+mysql主主模式來實現高可用,hive-site.xml中IP地址就只需要填寫keepalived提供的虛擬IP就可以了,這個詳細可以去自己多瞭解,有很多資料。

第三,通常我們可能還需要使用jdbc連線hive,這時候就需要啟動hiveserver2服務,一般而言,hiveserver2服務依賴於各節點訪問的metastore服務。在使用hive --service hiveserver2 &命令啟動之後使用jps,可以看到兩個RunJar程序,表示啟動成功。(意外的是,master中因為hiveserver2服務需要metastore服務的原因,自己又將其啟動了!)

通常會出現各種問題:

例如:user: ** is not allowed to impersonate anonymous,這個通常是因為Hadoop的hdfs需要配置使用者代理:

<property>
  <name>hadoop.proxyuser.**.hosts</name>
  <value>*</value>
</property>
<property>
  <name>hadoop.proxyuser.**.groups</name>
 <value>hadoop</value>
</property>

重啟hdfs或者直接重啟hadoop叢集,hive的兩個服務:metastore和hiveserver2無需重啟。