前言:
Hadoop的課程已經告一段落,基本上在零基礎課程里不會再出現(xiàn)了,接下來的課程由若總來上,第一講Have。
復習前一個月的課程內容:
1、Linux
Linux:?
? ? ? ? ? ?? 文件(*****)?
? ? ? ? ? ?? 權限(*****)?
? ? ? ? ? ?? 壓縮/解壓(*****)?
? ? ? ? ? ?? 軟件安裝: JDK/MySQL/Hadoop/...(*****)
2、MySQL
DDL/DML(GROUP BY/JOIN:是大數據處理中的超級殺手:shuffle) 這兩個是重點數據傾斜的案例:必然是 GROUP BY/JOIN導致的,到時候把這兩個反復看熟解決shuffle對大數據來說已經掌握了60%

3、Hadoop
hadoop闡述:狹義和廣義兩個角度去闡述
狹義: 海量數據的一個分布式的存儲和計算框架而已 (HDFS MapReduce YARN)
廣義: 描述的是整個Hadoop生態(tài)圈,Hadoop里面的框架是處理某一個場景或者是某一類場景
Hadoop訪問方式:
? ? ? ?shell CLI(*****) 用命令行的方式
? ? ?? Java API(*****): FileSystem
? ? ? Web UI: ?HUE(HDFS/RDBMS/Hive/HBase/Solr...)
HDFS/MR/YARN架構:掌握一些基礎的就行,明白每個進程的結構和如何使用就行。(面試使用)
? ? ? ??面試前準備:
? ? ? ? ? ? ? ? ? 架構?
? ? ? ? ? ? ? ?? MapReduce 執(zhí)行流程 (生產不使用,比較low)
? ? ? ? ? ? ? ? ? MR/Spark/...提交到YARN的執(zhí)行流程:1~8步驟,舉一反三
4、Hadoop的常用操作
HDFS:mkdir put get rm mv
問題:copy vs mv
MR:mr的執(zhí)行流程(一定要掌握的)
YARN:mr作業(yè)跑在yarn之上,殺死yarn上的作業(yè),提交的時候指定的一些重要的參數。
問題:使用MapReduce實現(xiàn)join、mapjoin的功能?
===>非常繁瑣
? ? ? ? wordcount
明白:MR是非常麻煩的
5.Hive的產生背景:
1、MR編程不便性
2、傳統(tǒng)的RDBMS人員的需求
? ? HDFS上面的文件就是普通的文件,它并沒有schema的概念
? ? schema:RDBMS中的表結構
? ? ? ? people.txt <== id name age address
? ? sql? ===>? 搞定海量數據的統(tǒng)計分析
===>? 產生Hive
6.Hive
Hive 是一個使用SQL來操作分布式存儲系統(tǒng)上面的大數據集的讀寫和管理操作的一個客戶端,Hive它不是一個集群。用JDBC去連接Server的話,不應該是走查詢統(tǒng)計分析,而是去拿到統(tǒng)計結果,只拿結果,不做計算。
Structure:半 ?非
分布式系統(tǒng):HDFS/S3
問題:HDFS存的是近期的數據
? ? ? ? ? ? ? 1min:幾百G
? ? ? ? ? ? ? 冷數據:定期的移走S3 table的location指向S3
FaceBook開源目的是解決海量結構化日志數據的統(tǒng)計文件
Hive構建在Hadoop之上的數據倉庫
Hive的數據就是存在 HDFS之上
? ? ? ? ? ? ?? 計算時使用MR
? ? ? ? ? ? ? ? 彈性:線性擴展
Hive底層的執(zhí)行三個引擎:
? ? ? ? ? ?? MapReduce(在Hive1.x的時代MapReduce是默認引擎,在Hive2.x標記MapReduce為過期版本)
? ? ? ? ? ?? Tez
? ? ? ? ? ?? Spark (生產環(huán)境正在使用的引擎)
Hive定義一種類似SQL的查詢語言:HQL 類SQL
? ? ? ??問題:HQL和SQL的關系?
? ? ? ? ? ? ? ? ? ? 什么關系都沒有,只是語法類似,Hive抄的MySQL的語法
? ? ? ? ?? 很多的SQL on Hadoop的語法都是和RDBMS非常類似的?
Hive常用于:離線批處理
SQL ===> MR:我們輸入一個SQL通過我們的HIVE工具把SQL語句翻譯成MapReduce/Spark/Tez 作業(yè),并提交到YARN上運行 問題:是否智能、執(zhí)行計劃(sql是如何翻譯成mr作業(yè))
高級:UDF
Hive的重點
存儲格式:
1.textfile
textfile為默認格式
存儲方式:行存儲
磁盤開銷大 數據解析開銷大
壓縮的text文件 hive無法進行合并和拆分
2.sequencefile
二進制文件,以的形式序列化到文件中
存儲方式:行存儲
可分割 壓縮
一般選擇block壓縮
優(yōu)勢是文件和Hadoop api中的mapfile是相互兼容的。
3.rcfile存儲方式:
數據按行分塊 每塊按照列存儲
壓縮快 快速列存取
讀記錄盡量涉及到的block最少
讀取需要的列只需要讀取每個row group 的頭部定義。
讀取全量數據的操作 性能可能比sequencefile沒有明顯的優(yōu)勢
4.orc存儲方式:
數據按行分塊 每塊按照列存儲
壓縮快 快速列存取
效率比rcfile高,是rcfile的改良版本
5.自定義格式
用戶可以通過實現(xiàn)inputformat和 outputformat來自定義輸入輸出格式。
總結:
相比傳統(tǒng)的行式存儲引擎,列式存儲引擎具有更高的壓縮比,更少的IO操作而備受青睞(注:列式存儲不是萬能高效的,很多場景下行式存儲仍更加高效),尤其是在數據列(column)數很多,但每次操作僅針對若干列的情景,列式存儲引擎的性價比更高。在互聯(lián)網大數據應用場景下,大部分情況下,數據量很大且數據字段數目很多,但每次查詢數據只針對其中的少數幾行,這時候列式存儲是極佳的選擇
壓縮格式:
? ? 可使用Gzip,Bzip2等壓縮算法壓縮,壓縮后的文件不支持split
Hive階段版本
Stinger plan:(階段版本)?
? ? ? ? ? ? ? ? 08/2007: facebook
? ? ? ? ? ? ? ? 05/2013: 0.11.0 ?Stinger Phase1ORC HiveServer2?
? ? ? ? ? ? ?? 10/2013: 0.12.0 ?Stinger Phase2ORC improvement?
? ? ? ? ? ? ? ? 04/2014: 0.13.0 ?Stinger Phase3Vectorized query engine ?Tez(0.13版本后才能用)?
? ? ? ? ? ? ?? 11/2014: 0.14.0 ?Stinger.next Phase 1Cost-based optimizer(CBO基于成本的優(yōu)化,代價的優(yōu)化) ? ? ? ? ? ? ? ? ? ? ? ? ? ? 01/2015: 1.0.0 (里程碑點)
Stinger:不是一個項目或產品,而是一種提議,旨在將Hive性能提升100倍(僅僅是個參考),包括Hive的改進和Tez項目兩個部分。
為什么要使用Hive
? ? 1)、簡單易用
? ? 2)、擴展性好:hdfs空間不夠加磁盤加機器,存儲不是問題。底層MapReduce或者Spark計算處理不過來就加CPU加內存就行。
? ? 3)、統(tǒng)一的元數據管理
如果存放在hdfs上就僅僅就是一個文件而已,如果要進行計算,肯定要告訴這個文件meta信息,哪個文件哪個列,列的數據類型是什么Hive不是集群,Hdoop是集群,Hive僅僅是一個客戶端,沒有進程,不會掛掉,提交在YARN上執(zhí)行。
元數據信息:?
? ? ? ? ?? database、table、clumn:name type、hdfs存儲位置:location
元數據存放在哪里呢?
? ? ? ? ? ? 元數據信息,全部配置在MySQL里面
元數據統(tǒng)一管理的好處:
/ruozedata/hadoop/a.txt 將hdfs上的數據用 Hive可以處理,Sprk也可以計算處理,不需要做任何的改進。
Hive/Pig/Impala/Spark SQL/Presto:共享元數據的信息是最大的好處,Hive里面創(chuàng)建了一張表,可以直接用Spark SQL進行訪問
問題:Hive的數據存放在哪里?
? ? HDFS + metadata
Vectorized query engine(向量化查詢引擎):
? ? ? ? ? ? ?? 傳統(tǒng)方式中,對數據的處理是以行為單位,依次處理的。Hive也采用了這種方案。這種方案帶來的問題是,針對每一行數據,都要進行數據解析,條件判斷,方法調用等操作,從而導致了低效的CPU利用。
? ? ? ? ? ? ? 向量化特性,通過每次處理1024行數據,列方式處理,從而減少了方法調用,降低了CPU消耗,提高了CPU利用率。結合JDK1.8對SIMD的支持,獲得了極高的性能提升。
通過以下參數啟用向量化查詢引擎:
相關參考:
https://cwiki.apache.org/confluence/display/Hive/Vectorized+Query+Execution
Hive體系架構
測試環(huán)境部署架構:
? ? 客戶端(client、web、idbc)發(fā)送HQL語句到Hive(可以存放數據在MySQL或者Derby)上,最后作業(yè)提交到Hadoop集群上。
問題:Hive需要集群嗎?
? ? ? ? Hive不需要集群,可以理解Hive為一個客戶端。
問題:測試環(huán)境存在什么缺陷?
? ? ? ? 一個MySQL在生產中可能存在單點故障,所以需要準備兩個MySQL,一個是active一個是standby,一臺機器出現(xiàn)問題,另外一臺機器運行。 ? ? ? ? ? ? ?

Hive VS RDBMS 關系和區(qū)別 異同點
1、Hive關注的是大數據的數據庫倉庫的統(tǒng)計和分析,跑一個Hive作業(yè)跑個7~8個小時是正常的,關注點不同,處理的場景不一樣
2、關系型數據庫,節(jié)點數量是有限制的,Hive是構建在Hadoop之上的,可以支持成千上萬的節(jié)點的,而且是分布式計算的
3、關系型數據庫里面是有事物的 insert/update ?Hive是沒有事物的,都批次執(zhí)行的,都是離線導入一個批次的數據。
總結:
Hive適用于離線計算,所以它的延遲性和實時性差別很大。MySQL講究實時性和事物,一個insert或者一個update就要commit,更新數據,Hive處理的數據都是這些數據已經和業(yè)務沒有直接關聯(lián)的,停機的數據,進行離線批量的操作。
Hive環(huán)境的搭建
若澤數據-J哥:hadoop-2.8.1 Apache Hadoop
生產環(huán)境建議使用: CDH HDP (兼容性非常好)大數據平臺里面會用到非常非常多的組件,也會遇到非常多的兼容性的問題,Jar包沖突,所以不介意很多組合使用Apache版本,建議使用 CDH HDP
[若澤大數據機器結構]
機器目錄結構相關: hadoop/hadoop?
? ? ? ? ? ? ? ? ?? hadoop000(192.168.199.151)
? ? ? ? ? ? ? ? ?? hadoop001?
? ? ? ? ? ? ? ? ?? hadoop002
? ? ? ? ? ? ? ? ? ?? .........
/home/hadoop/?
? ? ? ? ? ?? software ?存放安裝軟件?
? ? ? ? ? ? ? ? ?? hadoop-2.6.0-cdh5.7.0.tar.gz?
? ? ? ? ? ? ? ? ? ? ? ?? hive-1.1.0-cdh5.7.0.tar.gz?
? ? ? ? ?? data 存放測試數據?
? ? ? ? ? ? source 存放源代碼 ? ? ? ? ??
? ? ? ? ? ? ? ? hadoop-2.6.0-cdh5.7.0-src.tar.gz?
? ? ? ? ? ? lib ?存放相關開發(fā)的jar
? ? ? ? ? ? ? ? ? ?? commons-lang3-3.5.jar?
? ? ? ? ? ? ? ? ? ? ? ? ? ? hive-1.0.jarhive-train.jar
? ? ? ? ? ? ? ? ? ? ? ? ? ? scala-train-1.0jar
? ? ? ? ? ? ? ? ? ? ? ? ? ? spark-2.2.0-bin-2.6.0-cdh5.7.0tgz
? ? ? ? ? ? ? ? ? ? ? ? ? ? spark-train-1.0.jar
? ? ? ? ? ? ? ? ? ? ? ? ? ?? train-scala-1.0.jar
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? train-scala-1.0-jar-with-dependencies.jar?
app ?軟件安裝目錄 ? ? ? ? ??
? ? ? ? ? ?? apache-flume-1.6.0-cdh5.7.0-bin
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? apache-maven-3.3.9
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? hadoop-2.6.0-cdh5.7.0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? hive-1.1.0-cdh5.7.0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? jdk1.8.0_144
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? jdk1.8.0_91
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? kafka_2.11-0.9.0.0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? nginx-1.6.2
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? scala-2.11.8
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? spark-2.2.0-bin-2.6.0-cdh5.7.0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? sqoop-1.4.6-cdh5.7.0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? zookeeper-3.4.11
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? zookeeper-3.4.5-cdh5.7.0?
tmp 存放HDFS/Kafka/ZK數據目錄
? ? ? ? ? ? ? maven_repo ?maven本地倉庫 <localRepository>/home/hadoop/maven_repo</localRepository>
? ? ? ? ? ? ? ? ?? [hadoop@hadoop-01 conf]$ pwd
? ? ? ? ? ? ? ? ? ??vi /home/hadoop/app/apache-maven-3.3.9/conf/setting.xml
? ? ? ? ? ? ? ? ? ? ? ? ? ? <localRepository> /home/hadoop/maven_repo</localRepository>
shell ?存放上課相關的腳本
? ? ? ? mysql:root/root ? ? ? ?
? ? ? ? ? ? ? ? ?? mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('root');
? ? ? ? ? ? ? ? ???mysql> ?FLUSH PRIVILEGES;
CDH版本選擇:
選擇統(tǒng)一的cdh5.7.0尾號?
? ? ? ? ? ? ?? hadoop-2.6.0-cdh5.7.0.tar.gz?
? ? ? ? ? ? ? ?? hive-1.1.0-cdh5.7.0.tar.gz
wget http://archive.cloudera.com/cdh5/cdh/5/hive-1.1.0-cdh5.7.0.
tar.gztar -zxvf hive-1.1.0-cdh5.7.0.tar.gz -C ~/app
? ? ? ? ? ? ? ? ? ? ? ?
1)創(chuàng)建目錄:
[hadoop@hadoop-01 ~]$ mkdir app data lib maven_repo shell software source tmp
查看目錄詳情
[hadoop@hadoop-01 ~]$ ll
total 32
drwxrwxr-x. 2 hadoop hadoop 4096 May 31 17:07 app
drwxrwxr-x. 2 hadoop hadoop 4096 May 31 17:04 data
drwxrwxr-x. 2 hadoop hadoop 4096 May 31 17:07 lib
drwxrwxr-x. 2 hadoop hadoop 4096 May 31 17:12 maven_repo
drwxrwxr-x. 2 hadoop hadoop 4096 May 31 17:27 shell
drwxrwxr-x. 2 hadoop hadoop 4096 May 31 17:04 software
drwxrwxr-x. 2 hadoop hadoop 4096 May 31 17:04 source
drwxrwxr-x. 2 hadoop hadoop 4096 May 31 17:27 tmp
2)上傳tar.gz文件:
[hadoop@hadoop-01 ~]$ cd software
[hadoop@hadoop-01 software]$ rz
[hadoop@hadoop-01 software]$ll
total 459260
-rw-r--r--. 1 hadoop hadoop ?42610549 Jun ?2 ?2018 hadoop-2.6.0-cdh5.7.0-src.tar.gz
-rw-r--r--. 1 hadoop hadoop 311585484 Jun ?2 ?2018 hadoop-2.6.0-cdh5.7.0.tar.gz
-rw-r--r--. 1 hadoop hadoop 116082695 Jun ?2 ?2018 hive-1.1.0-cdh5.7.0.tar.gz
3)解壓:
[hadoop@hadoop-01 software]$ tar -zxvf hadoop-2.6.0-cdh5.7.0.tar.gz -C ~/app/
[hadoop@hadoop-01 software]$ tar -zxvf hive-1.1.0-cdh5.7.0.tar.gz -C ?~/app/
4)添加HIVE_HOME到系統(tǒng)環(huán)境變量:
[hadoop@hadoop-01 app]$ vi ~/.bash_profile?
export HIVE_HOME=/home/hadoop/app/hive-1.1.0-cdh5.7.0
export PATH=$HIVE_HOME/bin:$PATH
[hadoop@hadoop-01 app]$ source ~/.bash_profile
5)Hive配置修改
[hadoop@hadoop-01 conf]$ cp hive-env.sh.template hive-env.sh
vi hive-env.sh

7)拷貝MySQL驅動包到$HIVE_HOME/lib
拷貝 mysql-connector-java-5.1.27-bin.jar
[hadoop@hadoop-01 ~]$ cd $HIVE_HOME?
[hadoop@hadoop-01 hive-1.1.0-cdh5.7.0]$ cd lib
[hadoop@hadoop-01 lib]$ rz mysql-connector-java-5.1.27-bin.jar?
[hadoop@hadoop-01 lib]$ ll?
-rw-r--r--. 1 hadoop hadoop 872303 Dec 19 17:22 mysql-connector-java-5.1.27-bin.jar
如果沒有拷貝MySQL驅動包,啟動hive會報錯: ??
?The specified datastore driver ("com.mysql.jdbc.Driver") was not foundintheCLASSPATH. ? ?
Please check yourCLASSPATHspecification, ? ?
and the name of the driver.
8)權限問題
創(chuàng)建表失敗:
? ? FAILED: Execution Error,
? ? return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask.
? ? MetaException(message:For direct MetaStore DB
? ? connections, we don't support retries at the client
? ? level.)
? ? 思路:找日志
? ? 日志在哪里:$HIVE_HOME/conf/hive-log4j.properties.template? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? hive.log.dir=${java.io.tmpdir}/${user.name}
? ? ? ? ? ? ? ? ? ? ? hive.log.file=hive.log? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? 問題:能不能改,如何改?
? ? 日志錯誤:
? ? ? ? ERROR [main]: Datastore.Schema (Log4JLogger.java:error(115)) - An exception was thrown while adding/validating class(es) :
? ? ? ? Specified key was too long; max key length is 767 bytes
? ? ? ? com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Specified key was too long; max key length is 767 bytes
? ? 解決:
? ? ? ? alter database ruozedata_basic02 character set latin1;
啟動Hive


以下網上摘錄:
Hive最初是應Facebook每天產生的海量新興社會網絡數據進行管理和機器學習的需求而產生和發(fā)展的。那么,到底什么是Hive,我們先看看Hive官網Wiki是如何介紹Hive的(https://cwiki.apache.org/confluence/display/Hive/Home):
The Apache HiveTM?data warehouse software facilitates querying and managing large datasets residing in distributed storage. Built on top of Apache HadoopTM, it provides:
(1)、Tools to enable easy data extract/transform/load (ETL)
(2)、A mechanism to impose structure on a variety of data formats
(3)、Access to files stored either directly in Apache HDFSTM?or in other data storage systems such as Apache HBaseTM
(4)、Query execution via MapReduce
上面英文的大致意思是:Apache Hive數據倉庫軟件提供對存儲在分布式中的大型數據集的查詢和管理,它本身是建立在Apache Hadoop之上,主要提供以下功能:它提供了一系列的工具,可用來對數據進行提取/轉化/加載(ETL);是一種可以存儲、查詢和分析存儲在HDFS(或者HBase)中的大規(guī)模數據的機制;查詢是通過MapReduce來完成的(并不是所有的查詢都需要MapReduce來完成,比如select * from XXX就不需要;在Hive0.11對類似select a,b from XXX的查詢通過配置也可以不通過MapReduce來完成,具體怎么配置請參見本博客《Hive:簡單查詢不啟用Mapreduce job而啟用Fetch task》)。
從上面的定義我們可以了解到,Hive是一種建立在Hadoop文件系統(tǒng)上的數據倉庫架構,并對存儲在HDFS中的數據進行分析和管理;那么,我們如何來分析和管理那些數據呢?
Hive定義了一種類似SQL的查詢語言,被稱為HQL,對于熟悉SQL的用戶可以直接利用Hive來查詢數據。同時,這個語言也允許熟悉 MapReduce 開發(fā)者們開發(fā)自定義的mappers和reducers來處理內建的mappers和reducers無法完成的復雜的分析工作。Hive可以允許用戶編寫自己定義的函數UDF,來在查詢中使用。Hive中有3種UDF:User Defined Functions(UDF)、User Defined Aggregation Functions(UDAF)、User Defined Table Generating Functions(UDTF)。
今天,Hive已經是一個成功的Apache項目,很多組織把它用作一個通用的、可伸縮的數據處理平臺。
當然,Hive和傳統(tǒng)的關系型數據庫有很大的區(qū)別,Hive將外部的任務解析成一個MapReduce可執(zhí)行計劃,而啟動MapReduce是一個高延遲的一件事,每次提交任務和執(zhí)行任務都需要消耗很多時間,這也就決定Hive只能處理一些高延遲的應用(如果你想處理低延遲的應用,你可以去考慮一下Hbase)。同時,由于設計的目標不一樣,Hive目前還不支持事務;不能對表數據進行修改(不能更新、刪除、插入;只能通過文件追加數據、重新導入數據);不能對列建立索引(但是Hive支持索引的建立,但是不能提高Hive的查詢速度。如果你想提高Hive的查詢速度,請學習Hive的分區(qū)、桶的應用)。
Hive的數據存儲
在讓你真正明白什么是hive 博文中我們提到Hive是基于Hadoop分布式文件系統(tǒng)的,它的數據存儲在Hadoop分布式文件系統(tǒng)中。Hive本身是沒有專門的數據存儲格式,也沒有為數據建立索引,只需要在創(chuàng)建表的時候告訴Hive數據中的列分隔符和行分隔符,Hive就可以解析數據。所以往Hive表里面導入數據只是簡單的將數據移動到表所在的目錄中(如果數據是在HDFS上;但如果數據是在本地文件系統(tǒng)中,那么是將數據復制到表所在的目錄中)。
Hive中主要包含以下幾種數據模型:Table(表),External Table(外部表),Partition(分區(qū)),Bucket(桶)(本博客會專門寫幾篇博文來介紹分區(qū)和桶)。
1、表:Hive中的表和關系型數據庫中的表在概念上很類似,每個表在HDFS中都有相應的目錄用來存儲表的數據,這個目錄可以通過${HIVE_HOME}/conf/hive-site.xml配置文件中的 hive.metastore.warehouse.dir屬性來配置,這個屬性默認的值是/user/hive/warehouse(這個目錄在 HDFS上),我們可以根據實際的情況來修改這個配置。如果我有一個表wyp,那么在HDFS中會創(chuàng)建/user/hive/warehouse/wyp 目錄(這里假定hive.metastore.warehouse.dir配置為/user/hive/warehouse);wyp表所有的數據都存放在這個目錄中。這個例外是外部表。
2、外部表:Hive中的外部表和表很類似,但是其數據不是放在自己表所屬的目錄中,而是存放到別處,這樣的好處是如果你要刪除這個外部表,該外部表所指向的數據是不會被刪除的,它只會刪除外部表對應的元數據;而如果你要刪除表,該表對應的所有數據包括元數據都會被刪除。
3、分區(qū):在Hive中,表的每一個分區(qū)對應表下的相應目錄,所有分區(qū)的數據都是存儲在對應的目錄中。比如wyp 表有dt和city兩個分區(qū),則對應dt=20131218,city=BJ對應表的目錄為/user/hive/warehouse /dt=20131218/city=BJ,所有屬于這個分區(qū)的數據都存放在這個目錄中。
4、桶:對指定的列計算其hash,根據hash值切分數據,目的是為了并行,每一個桶對應一個文件(注意和分區(qū)的區(qū)別)。比如將wyp表id列分散至16個桶中,首先對id列的值計算hash,對應hash值為0和16的數據存儲的HDFS目錄為:/user /hive/warehouse/wyp/part-00000;而hash值為2的數據存儲的HDFS 目錄為:/user/hive/warehouse/wyp/part-00002。
下面為抽象圖:

? ? ?? 二、Hive的元數據
Hive中的元數據包括表的名字,表的列和分區(qū)及其屬性,表的屬性(是否為外部表等),表的數據所在目錄等。 由于Hive的元數據需要不斷的更新、修改,而HDFS系統(tǒng)中的文件是多讀少改的,這顯然不能將Hive的元數據存儲在HDFS中。目前Hive將元數據存儲在數據庫中,如Mysql、Derby中。我們可以通過以下的配置來修改Hive元數據的存儲方式

Hive架構在Hadoop生態(tài)圈中已經是老生常談。盡管如此,很多資料并沒有將Hive模塊之間的關系描述的十分清楚,本人也在管理Hive數據倉庫時繞了不少彎路。所以我們仍要再談Hive架構,希望將積累的經驗總結出一套完整而又易懂的Hive架構,借此為行業(yè)新人開路,為大數據運維排憂。
Hive是典型C/S模式。Client端有JDBC/ODBC Client和Thrift Client兩類。Server 端則分為如下幾個部分:
? ? ? ? ? ?? CLI
? ? ? ? ? ? Thrift Server
? ? ? ? ? ? Metastore
? ? ? ? ? ? WUI
? ? ? ? ? ? Driver

其他資料要么把Hive架構分為Clients/Services兩個部分,要么全部稱之為組件。為了更好地理解Hive,我重新調整一下組織結構,如上圖所示。Hive的模塊分為:
Clients:遠程訪問Hive的應用客戶端;
Services:需要獨立部署的Hive服務;
Components:獨立功能的Hive組件。
下面且聽我細細分解。
Clients
Thrift Client
Thrift客戶端采用Hive Thrift Server提供的接口來訪問Hive。官網已經公開了Thrift服務的RPC,有興趣的同學可以了解一下。
如果不想重新編寫Thrift客戶端,Hive也提供了封裝好Thrift RPC的Python Client和Ruby Client。
Thrift Client的優(yōu)點在于,程序員不再依賴Hive環(huán)境來訪問Hive數據倉庫。
JDBC Client
Hive官方已經實現(xiàn)了JDBC Driver(hive-jdbc-*.jar)。如果你希望通過Java訪問Hive,請參照官網JDBC Client Sample Code。
Hive 0.14以后,Hive將自帶的Beeline重構成一個命令行界面的JDBC Client。之前,Beeline類似于Hive CLI的運行模式。
Beeline解決了CLI無法避免的并發(fā)訪問沖突。
ODBC Client
目前Hive暫沒有提供ODBC Driver支持。
Services
CLI(命令行界面)
CLI是和Hive交互的最簡單/最常用方式,你只需要在一個具備完整Hive環(huán)境下的Shell終端中鍵入hive即可啟動服務。
我們之所以將CLI歸為Services,是因為它可以直接調用Driver來工作。不妨把CLI看成一個命令行界面的單機版Hive服務,用戶可以在CLI上輸入HQL來執(zhí)行創(chuàng)建表、更改屬性以及查詢等操作。不過Hive CLI不適應于高并發(fā)的生產環(huán)境,僅僅是Hive管理員的好工具。
Hive Thrift Server
Hive Thrift Server是基于Thrift 軟件框架開發(fā)的,它提供Hive的RPC通信接口。目前的HiveServer2(HS2)較之前一版HiveServer,增加了多客戶端并發(fā)支持和認證功能,極大地提升了Hive的工作效率和安全系數。
在運維HS2的時候,我們還需要注意以下一些細節(jié):
? ? ? ? ? ? ? ? ? ? ? ?? HS2啟動加載hive-site.xml文件配置時,只會加載HS2相關參數。也就是說,你在hive-site.xml里 ? ? ? ? ? ? ? ? 面設置的Hive任務參數并不會對Clients生效;
? ? ? ? ? ? ? ? ? ? ? ? Hive Clients的用戶權限取決于啟動HS2進程的用戶;
? ? ? ? ? ? ? ? ? ? ?? 利用hive.reloadable.aux.jars.path參數可以不用重啟HS2而熱加載第三方jar包(UDF或SerDe)。
WUI (Web User Interface)
WUI并不屬于Apache Hive,它是Hive生態(tài)圈的一項服務,目前熟知的有Karmasphere、Hue、Qubole等項目。WUI是B/S模式的服務進程,Server一端與Hive Thrfit Server交互,Brower一端供用戶進行Web訪問。
目前絕大多數的數據分析公司都采用了Cloudera公司的開源項目Hue作為Hive WUI。后續(xù)文章也會著重提及Hue的運維,本文不做詳細解說。有關Hue的內容大家可以詳見Hue官網。
Components
Driver
Driver在很多Hive架構描述里都劃分到Services中,這給我初入Hive帶來了一些困擾。我認為Driver并不是服務,而是在輸入HQL后才會被調用的一項組件,在這里將其歸納到Components部分。每一個Hive服務都需要調用Driver來完成HQL語句的翻譯和執(zhí)行。通俗地說,Driver就是HQL編譯器,它解析和優(yōu)化HQL語句,將其轉換成一個Hive Job(可以是MapReduce,也可以是Spark等其他任務)并提交給Hadoop集群。
Metastore
Metastore是Hive元數據的存儲地。在功能上Metastore分為兩個部分:服務和存儲,也就是架構圖中提到的Metastore及其Database。
官方提供了服務和存儲部署的三種模式,我們一一介紹之。
內嵌模式

內嵌模式是Hive Metastore的最簡單的部署方式,使用Hive內嵌的Derby數據庫來存儲元數據。但是Derby只能接受一個Hive會話的訪問,試圖啟動第二個Hive會話就會導致Metastore連接失敗。
Hive官方并不把內嵌模式當做默認的Metastore模式。我們把官方解釋翻譯成了大白話,“內嵌模式自個兒玩玩就行,投入生產概不負責”。需要嘗試內嵌模式的同學,可以手動修改hive-site.xml中的embedded.metastore.configruation參數并重啟相應的Hive服務。
本地模式

本地模式是Metastore的默認模式(懶人專用模式)。該模式下,單Hive會話(一個Hive 服務JVM)以組件方式調用Metastore和Driver。
我們可以采用MySQL作為Metastore的數據庫。下面列出部署細節(jié):
在hive-site.xml中設置MySQL的Connection URL、用戶名和密碼以及ConnectionDriverName;
將MySQL的JDBC驅動Jar文件放到Hive的lib目錄下。
遠程模式

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Remote Metastore
遠程模式將Metastore分離出來,成為一個獨立的Hive服務(Metastore服務還可以部署多個)。這樣的模式可以將數據庫層完全置于防火墻后,客戶就不再需要用戶名和密碼登錄數據庫,避免了認證信息的泄漏。
遠程模式的配置如下:
