1、Hive介紹html
Hive是基於Hadoop的一個數據倉庫,Hive可以將SQL語句轉化爲MapReduce任務進行運行。java
Hive架構圖分爲如下四部分。python
一、用戶接口mysql
Hive有三個用戶接口:linux
二、元數據存儲程序員
將元數據存儲在關係數據庫中(MySql、Derby),元數據包括表的屬性、表的名稱、表的列、分區及其屬性以及表數據所在的目錄等。web
三、解釋器、編譯器、優化器sql
分別完成SQL查詢語句從詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在HDFS中,並在隨後由MapReduce調用執行。shell
四、數據存儲數據庫
Hive沒有專門的數據存儲格式,也沒有爲數據創建索引,Hive中全部數據都存儲在HDFS中。
Hive包含如下數據模型:表、外部表、分區和桶
2、Metadata,Metastore 的做用
Metadata即元數據: 元數據包含用Hive建立的database、tabel等的元信息。元數據存儲在關係型數據庫中。如Derby、MySQL等。
Metastore的做用是: 客戶端鏈接metastore服務,metastore再去鏈接MySQL數據庫來存取元數據。
有了metastore服務,就能夠有多個客戶端同時鏈接,並且這些客戶端不須要知道MySQL數據庫的用戶名和密碼,只須要鏈接metastore 服務便可。
3、Hive的元數據存儲(Metastore三種配置方式)
因爲元數據不斷地修改、更新,因此Hive元數據不適合存儲在HDFS中,通常存在RDBMS中。
一、內嵌模式(Embedded)
hive服務和metastore服務運行在同一個進程中,derby服務也運行在該進程中.
內嵌模式使用的是內嵌的Derby數據庫來存儲元數據,也不須要額外起Metastore服務。
這個是默認的,配置簡單,可是一次只能一個客戶端鏈接,適用於用來實驗,不適用於生產環境。
二、本地模式(Local):本地安裝mysql 替代derby存儲元數據
這種安裝方式和嵌入式的區別在於,再也不使用內嵌的Derby做爲元數據的存儲介質,而是使用其餘數據庫好比MySQL來存儲元數據。
hive服務和metastore服務運行在同一個進程中,mysql是單獨的進程,能夠同一臺機器,也能夠在遠程機器上。
這種方式是一個多用戶的模式,運行多個用戶client鏈接到一個數據庫中。這種方式通常做爲公司內部同時使用Hive。
每個用戶必需要有對MySQL的訪問權利,即每個客戶端使用者須要知道MySQL的用戶名和密碼才行。
<property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://127.0.0.1:3306/hive? createDatabaseIfNotExit=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>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>root</value> </property> <property> <name>hive.metastore.uris</name> <value></value> <description>指向的是運行metastore服務的主機,這是hive客戶端配置,metastore服務不須要配置</description> </property> <property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> <description>hive表的默認存儲路徑,爲HDFS的路徑location of default database for the warehouse</description> </property>
三、遠程模式(Remote): 遠程安裝mysql 替代derby存儲元數據
Hive服務和metastore在不一樣的進程內,多是不一樣的機器,該模式須要將hive.metastore.local設置爲false,將hive.metastore.uris設置爲metastore服務器URL,
若是有多個metastore服務器,將URL之間用逗號分隔,metastore服務器URL的格式爲thrift://127.0.0.1:9083。
遠程元存儲須要單獨起metastore服務,而後每一個客戶端都在配置文件裏配置鏈接到該metastore服務。
將metadata做爲一個單獨的服務進行啓動。各類客戶端經過beeline來鏈接,鏈接以前無需知道數據庫的密碼。
僅鏈接遠程的mysql並不能稱之爲「遠程模式」,是否遠程指的是metastore和hive服務是否在同一進程內.
hive metastore 服務端啓動命令: hive --service metastore -p <port_num>
若是不加端口默認啓動:hive --service metastore
,則默認監聽端口是:9083 。
注意客戶端中的端口配置須要和啓動監聽的端口一致。服務端啓動正常後,客戶端就能夠執行hive操做了。
客戶端鏈接metastore服務配置以下:
<property> <name>hive.metastore.uris</name> <value>thrift://127.0.0.1:9083,thrift://127.0.0.1:9084</value> <description>指向的是運行metastore服務的主機</description> </property>
在服務器端啓動一個MetaStoreServer,客戶端利用Thrift協議經過MetaStoreServer訪問元數據庫。以下圖:
4、Thrift 服務
經過hiveServer/hiveServer2啓動Thrift服務,客戶端鏈接Thrift服務訪問Hive數據庫(JDBC,JAVA等鏈接Thrift服務訪問Hive)。
<property> <name>hive.server2.thrift.port</name> <value></value> <description>Port number of HiveServer2 Thrift interface when hive.server2.transport.mode is 'binary'.</description> </property> <property> <name>hive.server2.thrift.bind.host</name> <value>127.0.0.1</value> <description>Bind host on which to run the HiveServer2 Thrift service.</description> </property> <property> <name>hive.server2.enable.doAs</name> <value>false</value> <description> Setting this property to true will have HiveServer2 execute Hive operations as the user making the calls to it.
若是爲True:Hive Server會以提交用戶的身份去執行語句
若是爲False:會以hive server daemon的admin user來執行語句
</description> </property>
啓動Thrift服務:hive --service hiveserver2
測試Thrift服務:
新開一個命令行窗口,執行beeline命令:
shuwendeMBP:~ shuwen$ beeline
Beeline version 1.2.1.spark2 by Apache Hive
beeline> !connect jdbc:hive2://127.0.0.1:10000
Connecting to jdbc:hive2://127.0.0.1:10000
Enter username for jdbc:hive2://127.0.0.1:10000: shuwen
Enter password for jdbc:hive2://127.0.0.1:10000: ******
log4j:WARN No appenders could be found for logger (org.apache.hive.jdbc.Utils).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Connected to: Apache Hive (version 1.2.2)
Driver: Hive JDBC (version 1.2.1.spark2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://127.0.0.1:10000> show databases;
+----------------+--+
| database_name |
+----------------+--+
| db_2_1 |
| default |
| netuml |
+----------------+--+
3 rows selected (1.941 seconds)
5、Hive的三種啓動方式
一、hive 命令行模式
進入hive安裝目錄,輸入bin/hive的執行程序,或者輸入 hive –service cli,用於linux平臺命令行查詢,查詢語句基本跟mysql查詢語句相似
二、hive web界面的啓動方式
Hive 2.0 之後才支持Web UI的
bin/hive –service hwi (& 表示後臺運行)
用於經過瀏覽器來訪問hive,感受沒多大用途,瀏覽器訪問地址是:127.0.0.1:9999/hwi
三、hive 遠程服務 (端口號10000) 啓動方式 (Thrift服務)
bin/hive –service hiveserver2 &(&表示後臺運行)
用java,python等程序實現經過jdbc等驅動的訪問hive就用這種起動方式了,這個是程序員最須要的方式了
6、Hive幾種內置服務
執行bin/hive --service help 以下:
shuwendeMBP:~ shuwen$ hive --service help Usage ./hive <parameters> --service serviceName <service parameters> Service List: beeline cli help hiveburninclient hiveserver hiveserver2 hwi jar lineage metastore metatool orcfiledump rcfilecat schemaTool version Parameters parsed: --auxpath : Auxillary jars --config : Hive configuration directory --service : Starts specific service/component. cli is default Parameters used: HADOOP_HOME or HADOOP_PREFIX : Hadoop install directory HIVE_OPT : Hive options For help on a particular service: ./hive --service serviceName --help Debug help: ./hive --debug --help
咱們能夠看到上邊輸出項Server List,裏邊顯示出Hive支持的服務列表,beeline cli help hiveserver2 hiveserver hwi jar lineage metastore metatool orcfiledump rcfilecat。
下面介紹最有用的一些服務
一、cli:是Command Line Interface 的縮寫,是Hive的命令行界面,用的比較多,是默認服務,直接能夠在命令行裏使用。
三、hwi:其實就是hive web interface的縮寫它是hive的web藉口,是hive cli的一個web替代方案。
二、hiveserver:這個可讓Hive以提供Thrift服務的服務器形式來運行,能夠容許許多個不一樣語言編寫的客戶端進行通訊,使用須要啓動HiveServer服務以和客戶端聯繫,
咱們能夠經過設置HIVE_PORT環境變量來設置服務器所監聽的端口,在默認狀況下,端口號爲10000,這個能夠經過如下方式來啓動Hiverserver:
bin/hive --service hiveserver -p 10002
其中-p參數也是用來指定監聽端口的
四、jar:與hadoop jar等價的Hive接口,這是運行類路徑中同時包含Hadoop 和Hive類的Java應用程序的簡便方式
五、metastore:在默認的狀況下,metastore和hive服務運行在同一個進程中,使用這個服務,可讓metastore做爲一個單獨的進程運行。
咱們能夠經過METASTOE——PORT來指定監聽的端口號
7、問題總結
Could not create ServerSocket on address 0.0.0.0/0.0.0.0:9083
遇到這種狀況你們都找不到頭緒,是由於你開始運行了hive的metastore,能夠輸入jps
查看有沒有RunJar
而後再輸入
hive --service metastore啓動
Hive在spark2.0.0啓動時沒法訪問spark-assembly-*.jar的解決辦法
ls: /usr/local/share/spark-2.0.0-bin-hadoop2.7/lib/spark-assembly-*.jar: No such file or directory
發現主要緣由是:在/<PathToHive>/bin/hive文件中,有這樣的命令:加載spark中相關的JAR包if [[ -n "$SPARK_HOME" ]] then sparkAssemblyPath=`ls ${SPARK_HOME}/lib/spark-assembly-*.jar` CLASSPATH="${CLASSPATH}:${sparkAssemblyPath}" fi可是spark升級到spark2之後,原有lib目錄下的大JAR包被分散成多個小JAR包,原來的spark-assembly-*.jar已經不存在,因此hive沒有辦法找到這個JAR包。
解決方法:修改/<PathToHive>/bin/hive文件,將加載原來的lib/spark-assembly-*.jar`替換成jars/*.jar,就不會出現這樣的問題。
1.hive.metastore.uris指向的是運行metastore服務的主機,並非指向運行hiveserver的主機,那臺主機不用啓動hiveserver也ok;
2.直接使用hive命令啓動shell環境時,其實已經順帶啓動了hiveserver,因此遠程模式下其實只須要單獨啓動metastore,而後就能夠進入shell環境正常使用
3.hiveserver和metastore進程名都叫RunJar。