一、Hive介紹
Hive是基於Hadoop的一個數據倉庫,Hive能夠將SQL語句轉化為MapReduce任務進行運行。
Hive架構圖分為以下四部分。
1、用戶接口
Hive有三個用戶接口:
-
- 命令行接口(CLI):以命令行的形式輸入SQL語句進行數據數據操作
- Web界面:通過Web方式進行訪問。
- Hive的遠程服務方式:通過JDBC等方式進行訪問。
2、元數據存儲
將元數據存儲在關系數據庫中(MySql、Derby),元數據包括表的屬性、表的名稱、表的列、分區及其屬性以及表數據所在的目錄等。
3、解釋器、編譯器、優化器
分別完成SQL查詢語句從詞法分析、語法分析、編譯、優化以及查詢計划的生成。生成的查詢計划存儲在HDFS中,並在隨后由MapReduce調用執行。
4、數據存儲
Hive沒有專門的數據存儲格式,也沒有為數據建立索引,Hive中所有數據都存儲在HDFS中。
Hive包含以下數據模型:表、外部表、分區和桶
二、Metadata,Metastore 的作用
Metadata即元數據: 元數據包含用Hive創建的database、tabel等的元信息。元數據存儲在關系型數據庫中。如Derby、MySQL等。
Metastore的作用是: 客戶端連接metastore服務,metastore再去連接MySQL數據庫來存取元數據。
有了metastore服務,就可以有多個客戶端同時連接,而且這些客戶端不需要知道MySQL數據庫的用戶名和密碼,只需要連接metastore 服務即可。
三、Hive的元數據存儲(Metastore三種配置方式)
由於元數據不斷地修改、更新,所以Hive元數據不適合存儲在HDFS中,一般存在RDBMS中。
1、內嵌模式(Embedded)
hive服務和metastore服務運行在同一個進程中,derby服務也運行在該進程中.
內嵌模式使用的是內嵌的Derby數據庫來存儲元數據,也不需要額外起Metastore服務。
這個是默認的,配置簡單,但是一次只能一個客戶端連接,適用於用來實驗,不適用於生產環境。
2、本地模式(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>
3、遠程模式(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訪問元數據庫。如下圖:
四、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)
五、Hive的三種啟動方式
1、hive 命令行模式
進入hive安裝目錄,輸入bin/hive的執行程序,或者輸入 hive –service cli,用於linux平台命令行查詢,查詢語句基本跟mysql查詢語句類似
2、hive web界面的啟動方式
Hive 2.0 以后才支持Web UI的
bin/hive –service hwi (& 表示后台運行)
用於通過瀏覽器來訪問hive,感覺沒多大用途,瀏覽器訪問地址是:127.0.0.1:9999/hwi
3、hive 遠程服務 (端口號10000) 啟動方式 (Thrift服務)
bin/hive –service hiveserver2 &(&表示后台運行)
用java,python等程序實現通過jdbc等驅動的訪問hive就用這種起動方式了,這個是程序員最需要的方式了
六、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。
下面介紹最有用的一些服務
1、cli:是Command Line Interface 的縮寫,是Hive的命令行界面,用的比較多,是默認服務,直接可以在命令行里使用。
3、hwi:其實就是hive web interface的縮寫它是hive的web借口,是hive cli的一個web替代方案。
2、hiveserver:這個可以讓Hive以提供Thrift服務的服務器形式來運行,可以允許許多個不同語言編寫的客戶端進行通信,使用需要啟動HiveServer服務以和客戶端聯系,
我們可以通過設置HIVE_PORT環境變量來設置服務器所監聽的端口,在默認情況下,端口號為10000,這個可以通過以下方式來啟動Hiverserver:
bin/hive --service hiveserver -p 10002
其中-p參數也是用來指定監聽端口的
4、jar:與hadoop jar等價的Hive接口,這是運行類路徑中同時包含Hadoop 和Hive類的Java應用程序的簡便方式
5、metastore:在默認的情況下,metastore和hive服務運行在同一個進程中,使用這個服務,可以讓metastore作為一個單獨的進程運行。
我們可以通過METASTOE——PORT來指定監聽的端口號
七、問題總結
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。