轉載來自:
https://blog.csdn.net/qq_40990732/article/details/80914873
https://blog.csdn.net/tp15868352616/article/details/80891057
相關概念
1.Metadata概念:
元數據包含用Hive創建的database、table等的元信息。元數據存儲在關系型數據庫中。如Derby、MySQL等。
2.Metastore作用:
客戶端連接metastore服務,metastore再去連接MySQL數據庫來存取元數據。有了metastore服務,就可以有多個客戶端同時連接,而且這些客戶端不需要知道MySQL數據庫的用戶名和密碼,只需要連接metastore 服務即可。
bin/hin --訪問--> metaStore server --訪問-->MySQL
beeline --訪問-->hiveServer2 --訪問--> metaStore server --訪問--> MySQL
3.Metastore 有3中開啟方式:
--1-->默認開啟方式:
沒有配置metaStore的時候,每當開啟bin/hive;或者開啟hiveServer2的時候,都會在內部啟動一個metastore
嵌入式服務;資源比較浪費,如果開啟多個窗口,就會存在多個metastore server。
--2-->local mataStore(本地)
當metaStore和裝載元數據的數據庫(MySQL)存在同一機器上時配置是此模式,
開啟metastore服務就只需要開啟一次就好,避免資源浪費!
--3-->Remote Metastore(遠程)
當metaStore和裝載元數據的數據庫(MySQL)不存在同一機器上時配置是此模式,
開啟metastore服務就只需要開啟一次就好,避免資源浪費!
Metastore三種配置方式
由於元數據不斷地修改、更新,所以Hive元數據不適合存儲在HDFS中,一般存在RDBMS中。
1、內嵌模式(Embedded)
- hive服務和metastore服務運行在同一個進程中,derby服務也運行在該進程中.內嵌模式使用的是內嵌的Derby數據庫來存儲元數據,也不需要額外起Metastore服務。
- 這個是默認的,配置簡單,但是一次只能一個客戶端連接(這句話說實在有點坑,其實就是你啟動一個hive服務會內嵌一個metastore服務,然后在啟動一個又會內嵌一個metastore服務,並不是說你的客戶端只能啟動一個hive,是能啟動多個,但是每個都有metastore,浪費資源),適用於用來實驗,不適用於生產環境。
2、本地模式(Local):本地安裝mysql 替代derby存儲元數據
-
不再使用內嵌的Derby作為元數據的存儲介質,而是使用其他數據庫比如MySQL來存儲元數據。hive服務和metastore服務運行在同一個進程中,mysql是單獨的進程,可以同一台機器,也可以在遠程機器上。(我之前有種方式是:只在接口機配置hive,並配置mysql數據庫,用戶和密碼等;但是集群不配置hive,不起hive任何服務,就屬於這種情況)
-
這種方式是一個多用戶的模式,運行多個用戶client連接到一個數據庫中。這種方式一般作為公司內部同時使用Hive。每一個用戶必須要有對MySQL的訪問權利,即每一個客戶端使用者需要知道MySQL的用戶名和密碼才行。
-
服務端配置如下:
<configuration> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive_remote/warehouse</value> </property> <property> <name>hive.metastore.local</name> <value>true</value> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://localhost/hive_remote?createDatabaseIfNotExist=true</value> </property> 或者 jdbc:mysql://ip:3306/hive?characterEncoding=UTF-8(推薦這個。不會web,不然兩個參數都給加上。。。。) <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>hive</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>password</value> </property> </configuration>
3、遠程模式(Remote): 遠程安裝mysql 替代derby存儲元數據
-
Hive服務和metastore在不同的進程內,可能是不同的機器(集群實例來說metastore有3個
,啟動在三台機器,但是都是指向的一台主機的mysql,當然mysql也能配置成主備集群的模式),該模式需要將hive.metastore.local設置為false(但是在0.10 ,0.11或者之后的HIVE版本 hive.metastore.local 屬性不再使用。),將hive.metastore.uris設置為metastore服務器URL,
-
遠程元存儲需要單獨起metastore服務,然后每個客戶端都在配置文件里配置連接到該metastore服務。將metadata作為一個單獨的服務進行啟動。各種客戶端通過beeline來連接,連接之前無需知道數據庫的密碼。
-
僅連接遠程的mysql並不能稱之為“遠程模式”,是否遠程指的是metastore和hive服務是否在同一進程內.
-
服務端配置如下:
<configuration> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://192.168.1.214:3306/hive_remote?createDatabaseIfNotExist=true</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>hive</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>password</value> </property> <property> <name>hive.metastore.local</name> <value>false</value> </property> 但是在0.10 ,0.11或者之后的HIVE版本 hive.metastore.local 屬性不再使用。 <property> <name>hive.metastore.uris</name> <value>thrift://192.168.1.188:9083</value> </property> </configuration>
附:遠程模式下,hive客戶端配置:
(1)hive-site.xml
<configuration> <property> <name>hive.metastore.uris</name> <value>thrift://hive服務端ip:9083</value> </property> </configuration>
(2)配置日志存放位置:配置文件為hive-log4j.properties.template
修改如下:
hive.log.dir=/opt/beh/log/hive
或者修改為:
hive.log.dir=/opt/beh/logs/hive/${user.name}
這樣對於同一台機器不同的用戶可以把日志動態寫入各自用戶目錄下,前提是/opt/beh/log/hive權限足夠:rwx
重點:hive-log4j.properties.template要修改為hive-log4j.properties不然無法識別。
(3)服務端metastore 啟動方式:
第一種:hive --service metastore -p 9083 &
第二種:在hive-site.xml中配置hive.metastore.uris,指定端口,然后直接 hive --service metastore
(4)對比測試:(客戶端主機2*6C,128Gmem)
=======我之前是本地模式,集群不配置hive,不啟動hive metastore,直接在客戶端配置鏈接數據庫,使用用戶名和密碼,然后啟動hive執行命令查看如下:
簡單的showdatabase 執行時間為:3.29s ,費時
cpu損耗較大:178%
=======后來配置了遠程模式,在集群配置了hive,並后台運行了metastore,然后配置客戶端連接metastore后,測試如下:
簡單的showdatabase 執行時間為:0.8s,明顯快了很多
cpu損耗:74.8% 少了一倍
總結:為什么集群要啟用metastore,因為啟用后,直接bin/hive啟動進程,只會有hive交互式客戶端一個服務,不會再有metastore同時存在在該進程中,資源占用率下降,查詢速度更快。