背景
為了降低大數(shù)據(jù)領(lǐng)域使用mepreduce的使用門檻,提高分析效率,大數(shù)據(jù)引用了對(duì)sql的支持
- mepreduce對(duì)應(yīng)hive
- spark對(duì)應(yīng)spark sql
sql on hadoop
目的:
- 基于計(jì)算引擎
- 基于mpp架構(gòu)
hive架構(gòu)
hive 對(duì)外訪問
- hive對(duì)外提供了三種訪問方式褂萧,包括web ui 据悔、cli 床绪、thrift協(xié)議
hive 后端主要由三個(gè)服務(wù)組成
- driver(驅(qū)動(dòng)器) :與傳統(tǒng)數(shù)據(jù)庫的查詢引擎類似婆廊,在這里指的是mepreduce或者spark等
- metastore:hive metastore是管理和儲(chǔ)存元信息的,在hive中默認(rèn)用的是derby,但是一般用的mysql
- hadoop:hive依賴于hadoop 儲(chǔ)存用的是hdfs,分析用的mepreduce溺森,資源用的是yarn等
metastore分為三種 部署模式
- 嵌入式模式:metestore和數(shù)據(jù)庫嵌入到driver中(一般用于測試)
- 本地模式:driver和metastore運(yùn)行在本地慕爬,而數(shù)據(jù)庫啟動(dòng)在一個(gè)共享節(jié)點(diǎn)上
- 遠(yuǎn)程模式:metastore運(yùn)行在單獨(dú)的一個(gè)節(jié)點(diǎn)上窑眯,由其他所有服務(wù)共享 使用beeline,jdbc等方式訪問(這是一種常用的生產(chǎn)環(huán)境下的部署模式)
(hive 的metastore里面的元數(shù)據(jù)可以直接被presto,impala等sql直接訪問)
hive查詢引擎(dag相比于mepreduce的優(yōu)點(diǎn):)
- dag避免了記住分布式文件系統(tǒng)交換數(shù)據(jù)帶來的不必要的網(wǎng)絡(luò)和磁盤的io
- 將重復(fù)使用的數(shù)據(jù)放在內(nèi)存中加速讀取效率
- 服用資源直到sql執(zhí)行完畢
hive表操作
- 傳統(tǒng)型數(shù)據(jù)庫是插入時(shí)校驗(yàn)医窿,而hive是計(jì)算式校驗(yàn)(數(shù)據(jù)合法的校驗(yàn))
- hive數(shù)據(jù)表是分層的
- hive數(shù)據(jù)表的類型(臨時(shí)表(只對(duì)當(dāng)前session有效磅甩,如果當(dāng)前session退出,則消失)姥卢、外部表(刪除數(shù)據(jù)庫時(shí)卷要,只是刪除了元數(shù)據(jù))、受管理表(與元數(shù)據(jù)的生命周期是一致的独榴,如果刪除則都刪除了))
- 分區(qū)表:
數(shù)據(jù)表可以按照某一個(gè)或者幾個(gè)字段進(jìn)一步劃分多個(gè)數(shù)據(jù)分區(qū)(使用語句:partitioned by col_name),不同的分區(qū)其實(shí)在不同的目錄中僧叉,這樣在查詢時(shí)候不同的分區(qū)會(huì)直接跳過,大大減少了不必要的磁盤io - 分桶表:
數(shù)據(jù)表或者數(shù)據(jù)分區(qū)可以按照某個(gè)字段進(jìn)一步分成若干個(gè)桶棺榔,(不如語句:clustered by(userid) into 32 buckets 瓶堕,這一語句將數(shù)據(jù)表按照userid 分成32個(gè)數(shù)據(jù)桶)
hive執(zhí)行引擎
image.png
hive 分區(qū)表
- 查詢時(shí)為了減少不必要的掃描可以采用分區(qū)表
- 為了避免產(chǎn)生過多的小文件,建議只對(duì)離散字段進(jìn)行分區(qū)
hive實(shí)用優(yōu)化
- 分區(qū)表-提高查詢(partition)
- 列式存儲(chǔ)(parquet和orc)
- 表連接優(yōu)化(將大表放后面)
- 盡早的過濾數(shù)據(jù)
- 盡量原子化操作(避免復(fù)雜的語句症歇,建議使用臨時(shí)表來過渡)
- 如果要用到union into 替換成insert into(性能能提上50%)
- order by 改為 sort by (全局排序改為局部排序)
- 數(shù)據(jù)傾斜