A. impala怎麼判斷從hive里刷新那部分元數據
Impala 獲取hive 的 metadata
Impala 通常和Hive共用同一個metadata 資料庫(通常是MySQL/PostgreSQL), 所以Impala 能夠讀取到Hive的元數據信息. 如果Impala需要訪問Hive表, 需要將Hive metadata 刷新到impala中.
在Hive中Create/Drop表後, 或者HDFS rebalance,或者手工刪除HDFS的文件後, 則需要在impala中執行下面兩行命令:
INVALIDATE METADATA table_name;
describe table_name;
第一行命令 INVALIDATE METADATA 告訴impala 指定的 table 元數據已經過期, impala 將在下一次使用到該表時自動刷新元數據, 第二行命令即觸發impala去更新元數據, 以免將來真正使用該表耗時太久.
如果Impala已經知道了Hive表的存在後, 又通過Hive增加或刪除分區或alter table, 使用 refresh 命令即可更新元數據. refresh是對元數據進行增量更新, 和INVALIDATE METADATA相比, refresh命令使用成本低很多.
利用catalogd提供元數據服務。可以直接連DB也可以通過catalogd,一般是利用hive里的metastore獲取數據。Impala高效的原因是其將原始數據緩存下來,catalogd啟動會瀏覽緩存獲取數據
因為impla默認catalogd會緩存,因此如果你重啟的後,catalogd會將緩存數據存入到內存中,
B. 在hive中怎樣刪除一張有數據的管理表,包括刪除數據
Hive的數據管理:
(1)元數據存儲
Hive 將元數據存儲在 RDBMS 中,有三種模式可以連接到資料庫:
Single User Mode:此模式連接到一個 In-memory 的資料庫 Derby,一般用於 Unit Test。
Multi User Mode:通過網路連接到一個資料庫中,這是最常用的模式。
Remote Server Mode:用於非 Java 客戶端訪問元資料庫,在伺服器端啟動一個 MetaStoreServer,客戶端則利用 Thrift 協議通過 MetaStoreServer來訪問元資料庫。
(2)數據存儲
首先,Hive 沒有專門的數據存儲格式,也沒有為數據建立索引,用戶可以非常自由地組織 Hive 中的表,只需要在創建表的時候告訴 Hive 數據中的列分隔符和行分隔符,它就可以解析數據了。
其次,Hive 中所有的數據都存儲在 HDFS 中,Hive 中包含4種數據模型:Table、External Table、Partition、Bucket。
Hive 中的 Table 和資料庫中的 Table 在概念上是類似的,每一個 Table 在 Hive 中都有一個相應的目錄來存儲數據。例如,一個表 pvs,它在 HDFS 中的路徑為:/wh/pvs,其中,wh 是在 hive-site.xml 中由 ${hive.metastore.warehouse.dir} 指定的數據倉庫的目錄,所有的 Table 數據(不包括 External Table)都保存在這個目錄中。
Partition 對應於資料庫中Partition 列的密集索引,但是 Hive 中 Partition 的組織方式與資料庫中的很不相同。在 Hive 中,表中的一個 Partition 對應於表下的一個目錄,所有的 Partition 數據都存儲在對應的目錄中。例如:pvs 表中包含 ds 和 city 兩個 Partition,則對應於 ds = 20090801, city = US 的 HDFS 子目錄為:/wh/pvs/ds=20090801/city=US;對應於 ds = 20090801, city = CA 的 HDFS 子目錄為:/wh/pvs/ds=20090801/city=CA。
Buckets 對指定列計算 hash,根據 hash 值切分數據,目的是為了便於並行,每一個 Buckets對應一個文件。將 user 列分散至 32 個Bucket上,首先對 user 列的值計算 hash,比如,對應 hash 值為 0 的 HDFS 目錄為:/wh/pvs/ds=20090801/city=US/part-00000;對應hash 值為 20 的 HDFS 目錄為:/wh/pvs/ds=20090801/city=US/part-00020。
External Table 指向已經在 HDFS 中存在的數據,可以創建 Partition。它和 Table 在元數據的組織結構上是相同的,而在實際數據的存儲上則有較大的差異。
在Table 的創建過程和數據載入過程(這兩個過程可以在同一個語句中完成)中,實際數據會被移動到數據倉庫目錄中。之後對數據的訪問將會直接在數據倉庫的目錄中完成。刪除表時,表中的數據和元數據將會被同時刪除。
External Table 只有一個過程,因為載入數據和創建表是同時完成的。實際數據是存儲在 Location 後面指定的 HDFS 路徑中的,它並不會移動到數據倉庫目錄中。
(3)數據交換
數據交換主要分為以下幾個部分
C. 銆孒ive榪涢樁綃囥嶈﹁В瀛樺偍鏍煎紡鍙婂帇緙╂柟寮
hive浼樺寲闄や簡鏈塰ql璇鍙ラ昏緫浼樺寲錛宧ql鍙傛暟璋冧紭絳夌瓑錛岃繕鏈変竴涓涓嶈搗鐪肩殑緇嗚妭瀹規槗琚蹇借嗘帀錛 閭d究鏄痟ive鏁頒粨妯″瀷琛ㄧ殑瀛樺偍鏍煎紡鍜屽帇緙╂柟寮 錛宧ive搴曞眰鏁版嵁鏄渚濇墭鍦╤adoop錛屼互HDFS鏂囦歡瀛樺偍鍦ㄩ泦緹や笂鐨勶紝 hive鏁頒粨妯″瀷琛ㄩ夋嫨涓涓鍚堥傜殑瀛樺偍鏍煎紡鍜屽帇緙╂柟寮忎篃鏄痟ive浼樺寲鐨勪竴鐐 銆
鏈綃囧氨鏉ヨ亰涓鑱婅繖鍧楃煡璇嗙偣鍚с😄
hive涓昏佹湁textfile銆乻equencefile銆乷rc銆乸arquet 榪欏洓縐嶅瓨鍌ㄦ牸寮忥紝鍏朵腑sequencefile寰堝皯浣跨敤錛屽父瑙佺殑涓昏佸氨鏄痮rc鍜宲arquet榪欎袱縐嶏紝寰寰涔熸惌閰嶇潃鍘嬬緝鏂瑰紡鍚堢悊浣跨敤銆
寤鴻〃澹版槑璇鍙ユ槸錛 stored as textfile/orc/parquet
琛屽紡瀛樺偍錛岃繖鏄痟ive琛ㄧ殑榛樿ゅ瓨鍌ㄦ牸寮忥紝榛樿や笉鍋氭暟鎹鍘嬬緝錛岀佺洏寮閿澶э紝鏁版嵁瑙f瀽寮閿澶э紝鏁版嵁涓嶆敮鎸佸垎鐗囷紙鍗充唬琛ㄧ潃浼氬甫鏉ユ棤娉曞規暟鎹榪涜屽苟琛屾搷浣滐級
琛屽垪寮忓瓨鍌錛屽皢鏁版嵁鎸夎屽垎鍧楋紝姣忎釜鍧楁寜鍒楀瓨鍌錛屽叾涓姣忎釜鍧楅兘瀛樺偍鐫涓涓緔㈠紩錛屾敮鎸乶one鍜寊lib鍜宻nappy榪3縐嶅帇緙╂柟寮忥紝榛樿ら噰鐢▃lib鍘嬬緝鏂瑰紡錛屼笉鏀鎸佸垏鐗囷紝orc瀛樺偍鏍煎紡鑳芥彁楂榟ive琛ㄧ殑璇誨彇鍐欏叆鍜屽勭悊鐨勬ц兘銆
鍒楀紡瀛樺偍錛屾槸涓涓闈㈠悜鍒楃殑浜岃繘鍒舵枃浠舵牸寮忥紙涓嶅彲鐩存帴璇誨彇錛夛紝鏂囦歡涓鍖呭惈鏁版嵁鍜屽厓鏁版嵁錛屾墍浠ヨュ瓨鍌ㄦ牸寮忔槸鑷瑙f瀽鐨勶紝鍦ㄥぇ鍨嬫煡璇㈡椂鏁堢巼寰堝揩楂樻晥錛宲arquet涓昏佺敤鍦ㄥ瓨鍌ㄥ氬眰宓屽楀紡鏁版嵁涓婃彁渚涜壇濂界殑鎬ц兘鏀鎸侊紝榛樿ら噰鐢╱ncompressed涓嶅帇緙╂柟寮忋
琛屽瓨鍌ㄥ紩鎿 錛氬悓涓鏉℃暟鎹鐨勪笉鍚屽瓧孌甸兘鍦ㄧ浉閭諱綅緗錛屾墍浠ュ綋瑕佹煡鎵炬煇涓鏉¤板綍鎵鏈夋暟鎹鏃惰屽瓨鍌ㄦ煡璇㈤熷害姣旇緝蹇
鍒楀瓨鍌ㄥ紩鎿 錛氫互鍒楁潵鑱氶泦鏁版嵁錛岀浉鍚屽瓧孌電殑鍊艱仛闆嗗湪涓璧鳳紝鎵浠ュ綋鏌ヨ㈡煇涓涓鎸囧畾鍒楃殑鎵鏈夋暟鎹鏃訛紝鍒楀瓨鍌ㄦ煡璇㈤熷害姣旇緝蹇
hive涓昏佹敮鎸乬zip銆亃lib銆乻nappy銆乴zo 榪欏洓縐嶅帇緙╂柟寮忋
鍘嬬緝涓嶄細鏀瑰彉鍏冩暟鎹鐨勫垎鍓叉э紝鍗沖帇緙╁悗鍘熸潵鐨勫間笉鍙樸
寤鴻〃澹版槑璇鍙ユ槸錛 tblproperties("orc.compress"="SNAPPY")
鍘嬬緝鏂瑰紡鐨勮瘎鍒ゆ爣鍑嗕富瑕佹湁浠ヤ笅鍑犵偣錛
閽堝瑰帇緙╂柟寮忓仛涓涓灝忕粨瀵規瘮錛