hive及hbase常見問題彙總

2018.12.4
1.hive中sort by與order by的區別
sort by是分組排序,order by是全局排序。

2.hive與mysql的區別
回答思路:hive背景(原理、本質)–>兩者操作、本質的差別–>讀寫差別–>其它差別。
Hive的誕生背景:學mysql的也想入門大數據,但又不會java,於是hive就誕生了。Hive 是基於 Hadoop 的一個數據倉庫工具,可以將結構化的數據文件映射爲一張表。本質是將HQL語句轉化爲MR程序。
hive總體來說操作等方面和MySQL沒有太大差別。但是本質卻有差別,Hive注重聯機分析的處理,mysql注重事務的處理。Hive注重的是分析,mysql注重的是處理。
MySQL在寫的時候檢查字段,hive在讀的時候檢查字段。所以在新增數據時,hive比較快,只需要直接load就行,而MySQL需要先檢查字段。
hive與mysql的其它差別如下:
1)數據存儲位置:Hive 的數據都是存儲在 HDFS 中的。而數據庫則可以將數據保存在塊設備或者本地文件系統中。
2)執行:Hive 中大多數查詢的執行是通過 Hadoop 提供的 MapReduce 來實現的。而數據庫通常有自己的執行引擎。
3)執行延遲:hive高延遲,mysql低延遲。
4)可擴展性:hive的可擴展性高,而數據庫由於ACID語義限制,擴展性有限。
5)數據規模:hive可以支持很大規模的數據,數據庫可以支持的數據規模較小。

3.hive內部表和外部表的 區別
未被external修飾的是內部表(managed table),被external修飾的爲外部表(external table)。
區別:
內部表數據由Hive自身管理,外部表數據由HDFS管理。
刪除內部表會直接刪除元數據(metadata)及存儲數據;刪除外部表僅僅會刪除元數據,HDFS上的文件並不會被刪除。
對內部表的修改會將修改直接同步給元數據,而對外部表的表結構和分區進行修改,則需要修復(MSCK REPAIR TABLE table_name;)

4.hive中union和union all的區別
Union合併時去除重複行,union all合併時不去除重複行。

5.公司中使用內部表多還是外部表多
內部表。


2018.12.7
1.hive中創建庫和創建表的本質是什麼
本質是在HDFS上創建目錄或命令空間。

2.說一下你所學過的窗口函數
FIRST_VALUE:取分組內排序後,截止到當前行,第一個值 。
LAST_VALUE: 取分組內排序後,截止到當前行,最後一個值 。
LEAD(col,n,DEFAULT) :用於統計窗口內往下第n行值。第一個參數爲列名,第二個參數爲往下第n行(可選,默認爲1),第三個參數爲默認值(當往下第n行爲NULL時候,取默認值,如不指定,則爲NULL) 。
LAG(col,n,DEFAULT) :與lead相反,用於統計窗口內往上第n行值。第一個參數爲列名,第二個參數爲往上第n行(可選,默認爲1),第三個參數爲默認值(當往上第n行爲NULL時候,取默認值,如不指定,則爲NULL)。


2018.12.08
1.hive加載數據的方式
LOAD DATA [LOCAL] INPATH ‘/AA/BB/CC’ INTO TABLE TABLE_NAME;
加載數據的本質:
將數據文件copy(不完全是copy)或者移動數據到表對應的目錄下。

加載數據:
insert into table t_5
select * from t_4
where uid <5
;

克隆表,不帶數據:
create table if not exists t_6 like t_5;

克隆錶帶數據:
create table if not exists t_7 like t_4
location ‘/user/hive/warehouse/gp1808.db/t_4’
;
location:後面接的一定是hdfs上的目錄,不是文件

克隆帶數據:
##更靈活更常用的方式:
##跟創建表的方式一樣,元數據和目錄都會創建。
create table if not exists t_8
as
select * from t_4
where uid >1
;

2.hive內部表和外部表的轉換
alter table t_newuser set TBLPROPERTIES(‘EXTERNAL’=‘TRUE’); ###true一定要大寫
alter table t_newuser set TBLPROPERTIES(‘EXTERNAL’=‘false’); ###false大小寫都沒關係

3.hive分區的三種類型
靜態分區:加載數據的時候指定分區的值。
動態分區:數據未知,根據分區的值確定創建分區。
混合分區:靜態加動態。

4.hive的存儲格式
Textfile 未經過壓縮的。
Sequencefile:hive爲用戶提供的二進制存儲,本身就壓縮,不能使用load方式加載數據。
Rcfile:hive提供的行列混合存儲,hive在該格式下,會盡量將附近的行和列的塊存儲到一起,仍然是壓縮格式,查詢效率比較高。
Orc是rcfile的升級版本。
Parquet列式存儲。


2018.12.10
1.hive的建表語法
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]

create table if not exists stu(name string,age int)
partitioned by (year int,month int)
row format delimited fields terminated by ‘,’
LINES TERMINATED BY ‘\n’
stored as orc;

2.hive中怎麼解決分組後的數據傾斜
設置hive.groupby.skewindata
hive.groupby.skewindata如果設置爲true,生成的查詢計劃會有兩個MR 的job
第一個MR job中map的輸出結果集合會隨機分配到reduce中,每個reduce做部分的聚合操作,然後輸出結果.
也就是說原來分在一個組的數據打散後分散到多個reduce中,從而達到負載均衡的目的.
第二個MR job處理第一個MR job處理過的結果進行group by.

3.HDFS中的普通格式的數據如何導入到hive表中並且存儲格式改爲orc,說明實現的步驟。
創建一個臨時表tab1(默認存儲格式)---->將數據加載到該臨時表tab1中---->創建存儲格式爲orc的hive表tab2---->將臨時表tab1中數據插入到表tab2中,insert into tab2 select ……from tab1.


2018.12.15
1.hbase的架構
在這裏插入圖片描述
HMaster:
負責HBase中table和region的管理,regionserver的負載均衡,region分佈調整,region分裂以及分裂後的region分配,regionserver失效後的region遷移等。

Zookeeper:
存儲root表的地址和master地址,regionserver主動向zookeeper註冊,使得master可隨時感知各regionserver的健康狀態。避免master單點故障。

RegionServer:
HRegion Server主要負責響應用戶I/O請求,向HDFS文件系統中讀寫數據,是HBase中最核心的模塊。
HRegion Server內部管理了一系列HRegion對象,每個HRegion對應了Table中的一個Region,Region中由多個Store組成。每個Store對應了Table中的一個Column Family的存儲,即一個Store管理一個region上的一個列簇。每個Store包含一個MemStore和0到多個StoreFile。Store是HBase存儲核心,由MemStore和StoreFiles組成。

MemStore:
MemStore是Sorted Memory Buffer,用戶寫入的數據首先會放入MemStore,當MemStore滿了以後會Flush成一個StoreFile(底層實現是HFile), 當StoreFile文件數量增長到一定閾值,會觸發Compact合併操作,將多個StoreFiles合併成一個StoreFile,合併過程中會進行版本合併和數據刪除,因此可以看出HBase其實只有增加數據,所有的更新和刪除操作都是在後續的compact過程中進行的,這使得用戶的寫操作只要進入內存中就可以立即返回,保證了HBase I/O的高性能。當StoreFiles Compact後,會逐步形成越來越大的StoreFile,當單個StoreFile大小超過一定閾值後,會觸發Split操作,同時把當前Region Split成2個Region,父Region會下線,新Split出的2個孩子Region會被HMaster分配到相應的HRegionServer 上,使得原先1個Region的壓力得以分流到2個Region上。

2.hbase的行鍵(rowkey)設計原則
參見此篇博文末尾

3.如何避免hbase行鍵的熱點問題
參見此篇博文末尾

4.hbase的應用場景
1)需對數據進行隨機讀寫操作;
2)大數據上高併發操作,比如每秒對PB級數據進行上千次操作;
3)讀寫訪問均是非常簡單的操作。

5.hbase的尋址過程(讀寫數據過程)
client–zookeeper–root–meta–region
客戶端先通過zookeeper獲取到root表的地址,通過root表獲取.meta表的地址,.meta表上記錄了具體的region的地址。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章