Hive運行架構及配置部署
Hive 運行架構
由非死book開源,最初用于解決海量結構化的日志數據統計問題:ETL工具;
構建于Hadoop的HDFS和MapReduce智商,用于管理和查詢結構化/非結構化數據的數據倉庫;
設計目的是讓SQL技能良好,但Java技能較弱的分析師可以查詢海量數據:
使用HQL作為查詢接口;
使用HDFS作為存儲底層;
使用MapReduce作為執行層;
2008年非死book把Hive項目貢獻給Apache;
1、Hive的缺點
Hive的HQL表達能力有限:有些復雜運算用HQL不易表達;
Hive效率低:Hive自動生成MR作業,通常不夠智能;HQL調優困難,粒度較粗;可控性差;
2、Hive系統架構
1) 元數據存儲(Metastore):Hive的數據由兩部分組成:數據文件和元數據;
元數據存儲,Derby只能用于一個Hive連接,一般存儲在MySQL。
2)驅動(Driver):編譯器、優化器、執行器;
用戶通過下面的接口提交Hive給Driver,由Driver進行HQL語句解析,此時從Metastore中獲取表的信息,先生成邏輯計劃,再生成物理計劃,再由Executor生成Job交給Hadoop運行,然后由Driver將結果返回給用戶。
編譯器(Hive的核心):1,語義解析器(ParseDriver),將查詢字符串轉換成解析樹表達式;2,語法解析器(SemanticAnalyzer),將解析樹轉換成基于語句塊的內部查詢表達式;3,邏輯計劃生成器(Logical Plan Generator),將內部查詢表達式轉換為邏輯計劃,這些計劃由邏輯操作樹組成,操作符是Hive的最小處理單元,每個操作符處理代表一道HDFS操作或者是MR作業;4,查詢計劃生成器(QueryPlan Generator),將邏輯計劃轉化成物理計劃(MR Job)。
優化器:優化器是一個演化組件,當前它的規則是:列修剪,謂詞下壓。
執行器:編譯器將操作樹切分成一個Job鏈(DAG),執行器會順序執行其中所有的Job;如果Task鏈不存在依賴關系,可以采用并發執行的方式進行Job的執行。
3)接口:CLI(Common LineInterface)、HWI(Hive WebInterface)、ThriftServer;
CLI:為命令行工具,默認服務。bin/hive或bin/hive--service cli;
HWI:為Web接口,可以用過瀏覽器訪問Hive,默認端口9999,啟動方式為bin/hive --service hwi;
ThriftServer:通過Thrift對外提供服務,默認端口是10000,啟動方式為bin/hive --service hiveserver;
4)其他服務(bin/hive --service -help):metastore(bin/hive --service metastore)、hiveserver2(bin/hive --service hiveserver2),HiveServer2是HieServer改進版本,它提供給新的ThriftAPI來處理JDBC或者ODBC客戶端,進行Kerberos身份驗證,多個客戶端并發,HS2還提供了新的CLI:BeeLine,是Hive 0.11引入的新的交互式CLI,基于SQLLine,可以作為Hive JDBC Client 端訪問HievServer2,啟動一個beeline就是維護了一個session.
5)Hadoop:用HDFS進行存儲,用MapReduce進行計算;
表中的一個Partition對應表下的一個子目錄,每一個Bucket對應一個文件;Hive的默認數據倉庫目錄是/user/hive /warehouse,在hive-site.xml中由hive.metastore.warehouse.dir項定義;
3、Hive的運行過程
由客戶端提供查詢語句,提交給Hive,Hive再交給Driver處理(1,Compiler先編譯,編譯時要從Metastore中獲取元數據信息,生成邏輯計劃;2,生成物理計劃;3,由Driver進行優化;4,Executor執行時對物理計劃再進行分解成Job,并將這些Job提交給MR的 JobTracker運行,提交Job的同時,還需要提取元數據信息關聯具體的數據,這些元數據信息送到NN),JT拆分成各個Task進行計算,并將結果返回或寫入HDFS。
4、Hive的數據模型
Database
Table
Partition
Bucket
File(文件格式:TextFile,RCFile,),
數據類型,Numeric(Tinyint,Smallint,Bigint,Float,Double,Decimal(Hive 0.13.0可以自定義精度進行擴展)),Date/Time(TIMESTAMP,DATE(0.12.0支持)),String(STRING,VARCHAR(0.12),CHAR(0.13)),Misc(BOLLEAN,BINARY),Complex(ARRAY、 MAP、STRUCT、UNIONTYPE)
Hive 0.13的配置與部署
使用版本:Hive 0.13.1
1、Metastore(MySQL作為元數據存儲,安裝于Master1節點,前提是MySQL的訪問權限需要設置好。)
1)解壓
tar zxf apache-hive-0.13.1-bin.tar.gz
mv apache-hive-0.13.1-bin /usr/hive013
vim /etc/profile加入
export HIVE_HOME=/usr/hive013
PATH=$HIVE_HOME/bin:$PATH
source /etc/profile
2)配置hive-env.sh文件(啟動時用到的環境文件)
HADOOP_HOME=/usr/hadoop-2.2.0
3)復制hive-default.xml -> hive-site.xml文件(配置文件)
<property>
<name>javax.jdo.option.ConnectionURL</name>
<!--<value>jdbc:derby:;databaseName=metastore_db;create=true</value>-->
<value>jdbc:mysql://master1:3306/metastore?=createDatabaseIfNotExist=true</value>
<description>JDBC connect string for a JDBCmetastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<!--<value>org.apache.derby.jdbc.EmbeddedDriver</value>-->
<value>com.mysql.jdbc.Driver</value>
<description>Driver class name for a JDBCmetastore</description>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
<description>username to use against metastoredatabase</description>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
<description>password to use against metastoredatabase</description>
</property>
4)拷貝jdbc文件到hive的lib中
下載jdbc的jar文件http://pan.baidu.com/s/1zYi5o
cp mysql-connector-java-5.1.26-bin.jar$HIVE_HOME/lib/
2、HiveClient,在Slave1上安裝Hive客戶端,同樣設置好HIVE_HOME的環境變量
1)將Hive013從Master1拷貝到Slave1
scp -r /usr/hive013 root@slave1:/usr/
2)配置Metastore的連接信息
<property>
<name>hive.metastore.uris</name>
<value>thrift://master1:9083</value>
<description>Thrift URI for the remote metastore.Used by metastore client to connect to remote metastore.</description>
</property>
3)啟動metastore服務
前臺服務:hive--service metastore CTRL+C關閉
后臺服務:nohup hive--service metastore > metastore.log 2>&1 & jobs查看后臺任務 kill %id關閉后臺任務
4)測試鏈接Metastore
由于設置好HIVE_HOME環境變量,直接在Shell中輸入hive即可打開HiveCLI
5)拷貝至OPC節點,可以達到多個客戶端訪問metastore