Hive架構(gòu)原理
a.用戶接口:Client
- CLI(Hive shell)、JDBC/ODBC(java訪問(wèn)hive)、Hive WEBUI(瀏覽器訪問(wèn)hive)和Thrift服務(wù)器
b.驅(qū)動(dòng)器:Driver - 解析器(SQL Parser):將SQL字符串轉(zhuǎn)換成抽象語(yǔ)法樹(shù)AST,這一步一般都用第三方工具庫(kù)完成,比如antlr;對(duì)AST進(jìn)行語(yǔ)法分析,比如表是否存在、字段是否存在、SQL語(yǔ)義是否有誤。
- 編譯器(Physical Plan):將AST編譯生成邏輯執(zhí)行計(jì)劃
- 優(yōu)化器(Query Optimizer):對(duì)邏輯執(zhí)行計(jì)劃進(jìn)行優(yōu)化。
- 執(zhí)行器(Execution):把邏輯執(zhí)行計(jì)劃轉(zhuǎn)換成可以運(yùn)行的物理計(jì)劃對(duì)于Hive來(lái)說(shuō),就是MR/Spark
c.元數(shù)據(jù):MetaStore - 通俗來(lái)說(shuō),元數(shù)據(jù)就是“數(shù)據(jù)的數(shù)據(jù)”,例如一張表里有許多數(shù)據(jù),而元數(shù)據(jù)則是在描述該表的相關(guān)信息,例如創(chuàng)建時(shí)間、列數(shù)、行數(shù)等。Hive的元數(shù)據(jù)默認(rèn)儲(chǔ)存在derby數(shù)據(jù)庫(kù)里,但推薦儲(chǔ)存在MySQL里。
d.存儲(chǔ)和計(jì)算 - 使用HDFS進(jìn)行存儲(chǔ),使用MapReduce進(jìn)行計(jì)算
- 一句話概括:Hive通過(guò)給用戶提供的一系列交互接口,接收到用戶的指令(SQL),使用自己的Driver,結(jié)合元數(shù)據(jù)(MetaStore),將這些指令翻譯成MapReduce,提交到Hadoop中執(zhí)行,最后,將執(zhí)行返回的結(jié)果輸出到用戶交互接口
索引!
- Hive在加載數(shù)據(jù)的過(guò)程中不會(huì)對(duì)數(shù)據(jù)進(jìn)行任何處理,甚至不會(huì)對(duì)數(shù)據(jù)進(jìn)行掃描,因此也沒(méi)有對(duì)數(shù)據(jù)中的某些Key建立索引。
- Hive要訪問(wèn)數(shù)據(jù)中滿足條件的特定值時(shí),需要暴力掃描整個(gè)數(shù)據(jù),因此訪問(wèn)延遲較高。由于 MapReduce 的引入, Hive 可以并行訪問(wèn)數(shù)據(jù),因此即使沒(méi)有索引,對(duì)于大量數(shù)據(jù)的訪問(wèn),Hive 仍然可以體現(xiàn)出優(yōu)勢(shì)但由于數(shù)據(jù)的訪問(wèn)延遲較高,決定了 Hive 不適合在線數(shù)據(jù)查詢
- 延遲原因:掃描整個(gè)表、底層MR延遲也高
- 數(shù)據(jù)庫(kù)的低延遲是有條件的,當(dāng)數(shù)據(jù)庫(kù)單獨(dú)處理不了超大規(guī)模數(shù)據(jù)時(shí),并行提供的優(yōu)勢(shì)就大于低延遲的單個(gè)個(gè)體了
- 而在數(shù)據(jù)庫(kù)中,通常會(huì)針對(duì)一個(gè)或者幾個(gè)列建立索引,提升訪問(wèn)特定條件下數(shù)據(jù)訪問(wèn)的效率,并擁有較低的延遲
建表
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], …)][CLUSTERED BY (col_name, col_name, ...)
[SORTED BY (col_name [ASC|DESC], …)] INTO num_buckets BUCKETS][ROW FORMAT row_format]
[STORED AS file_format]
`` [LOCATION hdfs_path];文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-773833.html
- EXTERNAL關(guān)鍵字可以讓用戶創(chuàng)建一個(gè)外部表,在建表的同時(shí)指定一個(gè)指向?qū)嶋H數(shù)據(jù)的路徑(LOCATION),Hive創(chuàng)建內(nèi)部表時(shí),會(huì)將數(shù)據(jù)移動(dòng)到數(shù)據(jù)倉(cāng)庫(kù)指向的路徑。
- 若創(chuàng)建外部表,僅記錄數(shù)據(jù)所在的路徑,不對(duì)數(shù)據(jù)的位置做任何改變
- 在刪除表的時(shí)候,內(nèi)部表的元數(shù)據(jù)和數(shù)據(jù)會(huì)被一起刪除,而外部表只刪除元數(shù)據(jù),不刪除數(shù)據(jù)
-
STORED AS ORC
:下次試一下以O(shè)RC文件存儲(chǔ)一張表,養(yǎng)成這樣的習(xí)慣,這個(gè)表只有優(yōu)點(diǎn)
內(nèi)部表和外部表
- **內(nèi)部表:**默認(rèn)創(chuàng)建的表都是內(nèi)部表,或稱(chēng)管理表
managed table
。Hive會(huì)::或多或少地::控制著數(shù)據(jù)的生命周期。Hive默認(rèn)情況下會(huì)將這些表的數(shù)據(jù)存儲(chǔ)在由配置項(xiàng)hive.metastore.warehouse.dir
(例如/user/hive/warehouse
)所定義的目錄的子目錄下。 當(dāng)我們刪除一個(gè)管理表時(shí),Hive也會(huì)刪除這個(gè)表中數(shù)據(jù)。++管理表不適合和其他工具共享數(shù)據(jù)++ - 外部表:如果表是外部表,那么Hive并非認(rèn)為其完全擁有這份數(shù)據(jù)刪除該表并不會(huì)刪除掉這份數(shù)據(jù),不過(guò)描述表的元數(shù)據(jù)信息會(huì)被刪除掉。::所以建一張外部表的實(shí)質(zhì)是在元數(shù)據(jù)建立一個(gè)路徑指向外部數(shù)據(jù)源::,刪除外部表只是刪除元數(shù)據(jù)里的信息而原始數(shù)據(jù)不會(huì)刪除,當(dāng)重建表時(shí)可直接讀取原始數(shù)據(jù)
分區(qū)
究其實(shí)質(zhì),建一張表就是建一個(gè)文件夾,然后把數(shù)據(jù)放在該文件夾里;而分區(qū)則是指在這個(gè)文件夾(table)下又建立一個(gè)子文件夾,把歸屬這個(gè)分區(qū)的數(shù)據(jù)放在這個(gè)子文件夾中。最為常見(jiàn)的分區(qū)字段就是日期字段,如20200630的數(shù)據(jù)會(huì)放在該表下‘20200630’歸屬的文件夾里。::以后會(huì)出現(xiàn)分區(qū)刪除等操作,所以掌握分區(qū)非常重要::文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-773833.html
- 分區(qū)的好處在于提供數(shù)據(jù)查詢效率,當(dāng)需要某個(gè)分區(qū)數(shù)據(jù)時(shí)Hive只需要去掃描該表下所需子文件夾即可,而不用全表掃描一遍。++是有點(diǎn)像跳表的索引層,不過(guò)會(huì)不會(huì)允許像跳表一樣重疊,這個(gè)需要進(jìn)一步學(xué)習(xí)++
- 分區(qū)需要在建表時(shí)進(jìn)行,語(yǔ)句為:
PARTITIONED BY (col_name data_type)
- 增加一個(gè)分區(qū)時(shí):
alter table table_name add partition(dt='20200630');
- 增加多個(gè)分區(qū)時(shí):
alter table table_name add partition(dt='20200630') partition(dt='20200701');
- 刪除一個(gè)分區(qū)時(shí):
alter table table_name drop partition(dt='20200630');
- 刪除多個(gè)分區(qū)時(shí)(注意逗號(hào)!):
alter table table_name drop partition(dt='20200630'),partition(dt='20200701');
其他科普小知識(shí)
- 世界上最大的Hadoop 集群在 Yahoo!,2009年的規(guī)模在4000 臺(tái)節(jié)點(diǎn)左右,美團(tuán)近年來(lái)達(dá)到了6000臺(tái)以上。而數(shù)據(jù)庫(kù)由于** ACID 語(yǔ)義的嚴(yán)格限制,擴(kuò)展性非常有限**目前最先進(jìn)的并行數(shù)據(jù)庫(kù)Oracle在理論上的擴(kuò)展能力也只有100臺(tái)左右
- 但好像Hadoop也沒(méi)有萬(wàn)臺(tái)那種,好像也不是很厲害……
到了這里,關(guān)于最近怎么流量漲這么多?那我開(kāi)始講Hive特性了!的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!