標籤:
HIVE配置mysql metastore
hive中除了儲存真正的資料以外還要額外儲存用來描述庫、表、資料的資料,稱為hive的中繼資料。這些中繼資料又存放在何處呢?
如果不修改配置hive預設使用內建的derby資料庫儲存中繼資料。
derby是apache開發的基於java的檔案型資料庫。
可以檢查之前執行命令的目錄,會發現其中產生了一個metastore.db的檔案,這就是derby產生的用來儲存中繼資料的資料庫檔案。
derby資料庫僅僅用來進行測試,真正使用時會有很多限制。
最明顯的問題是不能支援並發。
經測試可以發現,在同一目錄下使用無法同時開啟hive,不同目錄下可以同時開啟hive但是會各自產生metastore.db檔案造成資料無法共同訪問。
所以真正生產環境中我們是不會使用預設的derby資料庫儲存hive的中繼資料的。
hive目前支援derby和mysql來儲存中繼資料。
配置hive使用mysql儲存中繼資料資訊:
刪除hdfs中的/user/hive
hadoop fs -rmr /user/hive
複製hive/conf/hive-default.xml.template為hive-site.xml
cp hive-default.xml.template hive-site.xml
在<configuration>中進行配置
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop01:3306/hive?createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBC metastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
<description>username to use against metastore database</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
<description>password to use against metastore database</description>
</property>
!!手動建立hive中繼資料庫,注意此庫必須是latin1,否則會出現奇怪問題!所以推薦手動建立!並且建立庫之前不能有任意的hive操作,否則自動建立出來的庫表將使用mysql預設的字元集,仍然報錯!
!!另一種方法是修改mysql的設定檔,讓mysql預設編碼集就是latin1,這樣hive自動建立的中繼資料庫就是latin1的了,但是這已修改將會影響整個mysql資料庫,如果mysql中有其他庫,這種方式並不好。
create database hive character set latin1;
將mysql的串連jar包拷貝到$HIVE_HOME/lib目錄下
如果出現沒有許可權的問題,在mysql授權(在安裝mysql的機器上執行)
mysql -uroot -p
#(執行下面的語句 *.*:所有庫下的所有表 %:任何IP地址或主機都可以串連)
GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘ IDENTIFIED BY ‘root‘ WITH GRANT OPTION;
FLUSH PRIVILEGES;
再進入hive命令列,試著建立庫表發現沒有問題。
測試發現開啟多個串連沒有問題。
串連mysql,發現多了一個hive庫。其中儲存有hive的中繼資料。DBS-資料庫的中繼資料資訊,TBLS-表資訊。COLUMNS_V2表中欄位資訊,SDS-表對應hdfs目錄
HIVE配置mysql metastore