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目錄