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