Hive介紹與核心知識(shí)點(diǎn)

Hive

Hive簡(jiǎn)介

Facebook為了解決海量日志數(shù)據(jù)的分析而開(kāi)發(fā)了Hive,后來(lái)開(kāi)源給了Apache軟件基金會(huì)。

官網(wǎng)定義:

The Apache Hive ? data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage using SQL.

Hive是一種用類SQL語(yǔ)句來(lái)協(xié)助讀寫(xiě)、管理那些存儲(chǔ)在分布式存儲(chǔ)系統(tǒng)上大數(shù)據(jù)集的數(shù)據(jù)倉(cāng)庫(kù)軟件。

Hive的幾個(gè)特點(diǎn)

  • Hive最大的特點(diǎn)是通過(guò)類SQL來(lái)分析大數(shù)據(jù),而避免了寫(xiě)MapReduce程序來(lái)分析數(shù)據(jù),這樣使得分析數(shù)據(jù)更容易。

  • 數(shù)據(jù)是存儲(chǔ)在HDFS上的,Hive本身并不提供數(shù)據(jù)的存儲(chǔ)功能

  • Hive是將數(shù)據(jù)映射成數(shù)據(jù)庫(kù)和一張張的表,庫(kù)和表的元數(shù)據(jù)信息一般存在關(guān)系型數(shù)據(jù)庫(kù)上(比如MySQL)。

  • 數(shù)據(jù)存儲(chǔ)方面:它能夠存儲(chǔ)很大的數(shù)據(jù)集,并且對(duì)數(shù)據(jù)完整性、格式要求并不嚴(yán)格。

  • 數(shù)據(jù)處理方面:因?yàn)镠ive語(yǔ)句最終會(huì)生成MapReduce任務(wù)去計(jì)算,所以不適用于實(shí)時(shí)計(jì)算的場(chǎng)景,它適用于離線分析。

Hive架構(gòu)

image.png

Hive的底層存儲(chǔ)

Hive的數(shù)據(jù)是存儲(chǔ)在HDFS上的。Hive中的庫(kù)和表可以看作是對(duì)HDFS上數(shù)據(jù)做的一個(gè)映射。所以Hive必須是運(yùn)行在一個(gè)Hadoop集群上的。

Hive語(yǔ)句的執(zhí)行過(guò)程

Hive中的執(zhí)行器,是將最終要執(zhí)行的MapReduce程序放到Y(jié)ARN上以一系列Job的方式去執(zhí)行。

Hive的元數(shù)據(jù)存儲(chǔ)

Hive的元數(shù)據(jù)是一般是存儲(chǔ)在MySQL這種關(guān)系型數(shù)據(jù)庫(kù)上的,Hive和MySQL之間通過(guò)MetaStore服務(wù)交互。

Hive重要概念

外部表和內(nèi)部表

內(nèi)部表(managed table)
  • 默認(rèn)創(chuàng)建的是內(nèi)部表(managed table),存儲(chǔ)位置在hive.metastore.warehouse.dir設(shè)置,默認(rèn)位置是/user/hive/warehouse。
  • 導(dǎo)入數(shù)據(jù)的時(shí)候是將文件剪切(移動(dòng))到指定位置,即原有路徑下文件不再存在
  • 刪除表的時(shí)候,數(shù)據(jù)和元數(shù)據(jù)都將被刪除
  • 默認(rèn)創(chuàng)建的就是內(nèi)部表create table xxx (xx xxx)
外部表(external table)
  • 外部表文件可以在外部系統(tǒng)上,只要有訪問(wèn)權(quán)限就可以
  • 外部表導(dǎo)入文件時(shí)不移動(dòng)文件,僅僅是添加一個(gè)metadata
  • 刪除外部表時(shí)原數(shù)據(jù)不會(huì)被刪除
  • 分辨外部表內(nèi)部表可以使用DESCRIBE FORMATTED table_name命令查看
  • 創(chuàng)建外部表命令添加一個(gè)external即可,即create external table xxx (xxx)
  • 外部表指向的數(shù)據(jù)發(fā)生變化的時(shí)候會(huì)自動(dòng)更新,不用特殊處理

分區(qū)表和桶表

分區(qū)(partioned)
  • 有些時(shí)候數(shù)據(jù)是有組織的,比方按日期/類型等分類,而查詢數(shù)據(jù)的時(shí)候也經(jīng)常只關(guān)心部分?jǐn)?shù)據(jù),比方說(shuō)我只想查2017年8月8號(hào),此時(shí)可以創(chuàng)建分區(qū),查詢具體某一天的數(shù)據(jù)時(shí),不需要掃描全部目錄,所以會(huì)明顯優(yōu)化性能
  • 一個(gè)Hive表在HDFS上是有一個(gè)對(duì)應(yīng)的目錄來(lái)存儲(chǔ)數(shù)據(jù),普通表的數(shù)據(jù)直接存儲(chǔ)在這個(gè)目錄下,而分區(qū)表數(shù)據(jù)存儲(chǔ)時(shí),是再劃分子目錄來(lái)存儲(chǔ)的
  • 使用partioned by (xxx)來(lái)創(chuàng)建表的分區(qū)
分桶(clustered)
  • 分桶是相對(duì)分區(qū)進(jìn)行更細(xì)粒度的劃分。分桶將整個(gè)數(shù)據(jù)內(nèi)容安裝某列屬性值得hash值進(jìn)行區(qū)分,按照取模結(jié)果對(duì)數(shù)據(jù)分桶。如取模結(jié)果相同的數(shù)據(jù)記錄存放到一個(gè)文件。
  • 桶表也是一種用于優(yōu)化查詢而設(shè)計(jì)的表類型。創(chuàng)建通表時(shí),指定桶的個(gè)數(shù)、分桶的依據(jù)字段,hive就可以自動(dòng)將數(shù)據(jù)分桶存儲(chǔ)。查詢時(shí)只需要遍歷一個(gè)桶里的數(shù)據(jù),或者遍歷部分桶,這樣就提高了查詢效率。

具體說(shuō)明分桶

  • clustered by (user_id) sorted by(leads_id) into 10 buckets
    • clustered by是指根據(jù)user_id的值進(jìn)行哈希后模除分桶個(gè)數(shù),根據(jù)得到的結(jié)果,確定這行數(shù)據(jù)分入哪個(gè)桶中,這樣的分法,可以確保相同user_id的數(shù)據(jù)放入同一個(gè)桶中。

    • sorted by 是指定桶中的數(shù)據(jù)以哪個(gè)字段進(jìn)行排序,排序的好處是,在join操作時(shí)能獲得很高的效率。

    • into 10 buckets是指定一共分10個(gè)桶。

    • 在HDFS上存儲(chǔ)時(shí),一個(gè)桶存入一個(gè)文件中,這樣根據(jù)user_id進(jìn)行查詢時(shí),可以快速確定數(shù)據(jù)存在于哪個(gè)桶中,而只遍歷一個(gè)桶可以提供查詢效率。

Hive文件格式

hive文件存儲(chǔ)格式包括以下幾類:

  1. TEXTFILE
  2. SEQUENCEFILE
  3. RCFILE
  4. ORCFILE(0.11以后出現(xiàn))

其中TEXTFILE為默認(rèn)格式,建表時(shí)不指定默認(rèn)為這個(gè)格式,導(dǎo)入數(shù)據(jù)時(shí)會(huì)直接把數(shù)據(jù)文件拷貝到hdfs上不進(jìn)行處理;SEQUENCEFILE,RCFILE,ORCFILE格式的表不能直接從本地文件導(dǎo)入數(shù)據(jù),數(shù)據(jù)要先導(dǎo)入到textfile格式的表中, 然后再?gòu)谋碇杏胕nsert導(dǎo)入SequenceFile,RCFile,ORCFile表中。

列式存儲(chǔ)和行式存儲(chǔ)

首先我們看一下一張表的存儲(chǔ)格式

image.png

行式存儲(chǔ)

image.png

列式存儲(chǔ)

image.png

列式存儲(chǔ)和行式存儲(chǔ)的比較

行式存儲(chǔ)

優(yōu)點(diǎn):

  • 相關(guān)的數(shù)據(jù)是保存在一起,比較符合面向?qū)ο蟮乃季S,因?yàn)橐恍袛?shù)據(jù)就是一條記錄
  • 這種存儲(chǔ)格式比較方便進(jìn)行INSERT/UPDATE操作

缺點(diǎn):

  • 如果查詢只涉及某幾個(gè)列,它會(huì)把整行數(shù)據(jù)都讀取出來(lái),不能跳過(guò)不必要的列讀取。當(dāng)然數(shù)據(jù)比較少,一般沒(méi)啥問(wèn)題,如果數(shù)據(jù)量比較大就比較影響性能
  • 由于每一行中,列的數(shù)據(jù)類型不一致,導(dǎo)致不容易獲得一個(gè)極高的壓縮比,也就是空間利用率不高
  • 不是所有的列都適合作為索引

列式存儲(chǔ)

優(yōu)點(diǎn):

  • 查詢時(shí),只有涉及到的列才會(huì)被查詢,不會(huì)把所有列都查詢出來(lái),即可以跳過(guò)不必要的列查詢
  • 高效的壓縮率,不僅節(jié)省儲(chǔ)存空間也節(jié)省計(jì)算內(nèi)存和CPU
  • 任何列都可以作為索引

缺點(diǎn):

  • INSERT/UPDATE很麻煩或者不方便
  • 不適合掃描小量的數(shù)據(jù)

TEXTFILE

默認(rèn)格式,數(shù)據(jù)不做壓縮,磁盤(pán)開(kāi)銷大,數(shù)據(jù)解析開(kāi)銷大。

可結(jié)合Gzip、Bzip2使用(系統(tǒng)自動(dòng)檢查,執(zhí)行查詢時(shí)自動(dòng)解壓),但使用這種方式,hive不會(huì)對(duì)數(shù)據(jù)進(jìn)行切分,從而無(wú)法對(duì)數(shù)據(jù)進(jìn)行并行操作。

SEQUENCEFILE

SequenceFile是Hadoop API提供的一種二進(jìn)制文件支持,其具有使用方便、可分割、可壓縮的特點(diǎn)。

SequenceFile支持三種壓縮選擇:NONE,RECORD,BLOCK。Record壓縮率低,一般建議使用BLOCK壓縮。

RCFILE

RCFILE是一種行列存儲(chǔ)相結(jié)合的存儲(chǔ)方式。首先,其將數(shù)據(jù)按行分塊,保證同一個(gè)record在一個(gè)塊上,避免讀一個(gè)記錄需要讀取多個(gè)block。其次,塊數(shù)據(jù)列式存儲(chǔ),有利于數(shù)據(jù)壓縮和快速的列存取。

  • RCFile保證同一的數(shù)據(jù)位于同一節(jié)點(diǎn),因此元組重構(gòu)代價(jià)較低(需要將分散的數(shù)據(jù)重新組織,比如一列數(shù)據(jù)散落在不同集群,查詢的時(shí)候,需要將各個(gè)節(jié)點(diǎn)的數(shù)據(jù)重新組織;但是如果數(shù)據(jù)都在一個(gè)機(jī)器上,那就沒(méi)有必要重新組織)
  • RCFile通過(guò)列進(jìn)行數(shù)據(jù)壓縮,因?yàn)橥涣卸际窍嗤臄?shù)據(jù)類型,所以壓縮比比較好
  • RCFile可以跳過(guò)不必要的列讀取

從以上幾點(diǎn)也可以看出它是兼顧了行式和列式存儲(chǔ)的部分優(yōu)點(diǎn)。

ORC File

ORCFile存儲(chǔ)格式,就是Optimized RC File的縮寫(xiě)。意指優(yōu)化的RCFile存儲(chǔ)格式。

ORC File 和 RC File比較

  • 每一個(gè)任務(wù)只輸出單個(gè)文件,這樣可以減少NameNode的負(fù)載
  • 支持各種復(fù)雜的數(shù)據(jù)類型,比如datetime,decimal,以及復(fù)雜的struct,List,map等
  • 在文件中存儲(chǔ)了輕量級(jí)的索引數(shù)據(jù)
  • 基于數(shù)據(jù)類型的塊模式壓縮:比如Integer類型使用RLE(RunLength Encoding)算法,而字符串使用字典編碼(DictionaryEncoding)
  • 使用單獨(dú)的RecordReader并行讀相同的文件
  • 無(wú)需掃描標(biāo)記就能分割文件
  • 綁定讀寫(xiě)所需要的內(nèi)存
  • 元數(shù)據(jù)存儲(chǔ)使用PB,允許添加和刪除字段

Hive ROW FORMAT

Serde是 Serializer/Deserializer的簡(jiǎn)寫(xiě)。hive使用Serde進(jìn)行行對(duì)象的序列與反序列化。

你可以創(chuàng)建表時(shí)使用用戶自定義的Serde或者native Serde,如果 ROW FORMAT沒(méi)有指定或者指定了 ROW FORMAT DELIMITED就會(huì)使用native Serde。

hive已經(jīng)實(shí)現(xiàn)了許多自定義的Serde,之前我們?cè)诮榻Bstored時(shí)也涉及到:

  • Avro (Hive 0.9.1 and later)
  • ORC (Hive 0.11 and later)
  • RegEx
  • Thrift
  • Parquet (Hive 0.13 and later)
  • CSV (Hive 0.14 and later)
  • JsonSerDe (Hive 0.12 and later)

Hive寫(xiě)入數(shù)據(jù)的方式

和我們熟悉的關(guān)系型數(shù)據(jù)庫(kù)不一樣,Hive現(xiàn)在還不支持在insert語(yǔ)句里面直接給出一組記錄的文字形式,也就是說(shuō),Hive并不支持INSERT INTO …. VALUES形式的語(yǔ)句(目前新版本早已支持,但是并不十分建議使用,性能和可用性方面難以滿足要求)。

從本地文件系統(tǒng)中導(dǎo)入數(shù)據(jù)到Hive表

load data local inpath 'xxx.txt' into table xxx;

從HDFS上導(dǎo)入數(shù)據(jù)到Hive表

load data inpath '/home/xxx/add.txt' into table xxx

alter table db.access_log add partition (dt='18-09-18') location 'hdfs://ns/hive/warehouse/access_log/dt=18-09-18';

從別的表中查詢出相應(yīng)的數(shù)據(jù)并導(dǎo)入到Hive表中

insert overwrite table db.log_v2 partition(dt='18-09-26') select uid,model,key,value,time from db.log where dt='18-09-26';

在創(chuàng)建表的時(shí)候通過(guò)從別的表中查詢出相應(yīng)的記錄并插入到所創(chuàng)建的表中

create table test4 as select id, name, tel from xxx;


歡迎關(guān)注 高廣超的簡(jiǎn)書(shū)博客 與 收藏文章 !
歡迎關(guān)注 頭條號(hào):互聯(lián)網(wǎng)技術(shù)棧 !

個(gè)人介紹:

高廣超:多年一線互聯(lián)網(wǎng)研發(fā)與架構(gòu)設(shè)計(jì)經(jīng)驗(yàn),擅長(zhǎng)設(shè)計(jì)與落地高可用、高性能、可擴(kuò)展的互聯(lián)網(wǎng)架構(gòu)。目前從事大數(shù)據(jù)相關(guān)研發(fā)與架構(gòu)工作。

本文首發(fā)在 高廣超的簡(jiǎn)書(shū)博客 轉(zhuǎn)載請(qǐng)注明!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容