當前位置:
首頁 > 知識 > 想成為大數據分析工程師?那這份面試集錦一定要收好!

想成為大數據分析工程師?那這份面試集錦一定要收好!

作者:DD-Kylin

著作權歸作者所有。AI開發者獲得授權轉載,禁止二次轉載

注:封面圖片來自網路

導語

本篇文章為大家帶來Hive面試指南,文內會有兩種題型,問答題和代碼題,題目一部分來自於網上,一部分來自平時工作的總結。

精選題型

Hive可考察的內容有:基本概念、架構、數據類型、數據組織、DDL操作、函數、數據傾斜、SQL優化、數據倉庫。面試數據分析工程師更多會考察DDL操作、函數、數據傾斜、Hive優化、數據倉庫這些知識點。來看看具體問題吧

基本概念

基本概念一般會以問答題的方式進行考察,比如在面試的時候直接問:說說你對Hive的理解?Hive的作用有哪些?這種類似的問題。

說說你對Hive的理解

從概念上講,Hive是一款開源的基於hadoop的用於統計海量結構化數據的一個數據倉庫,它定義了簡單的類似SQL的查詢語言,稱為HQL,允許熟悉SQL的用戶查詢數據。

從本質上講:Hive是將HQL語句轉換成MapReduce程序的一個工具。

上題的回答提到了數據倉庫和MapReduce,考官可以針對你的回答,進而提問數據倉庫和MapReduce相關的知識點。

什麼是數據倉庫

數據倉庫的概念是在20世紀90年代被提出來,初衷是專門為業務分析建立一個數據中心,解決因為數據太多查詢效率低下的問題。一個被廣泛接受的定義是:數據倉庫(Data Warehouse)是一個面向主題的(Subject Oriented)、集成的(Integrated)、相對穩定的(Non-Volatile)、反映歷史變化(Time Variant)的數據集合,用於支持管理決策(Decision Making Support)。

簡單說說MapReduce

MapReduce是一個軟體框架,基於該框架能夠容易地編寫應用程序,這些應用程序能夠運行在大規模集群上,並以一種可靠的,具有容錯能力的方式並行地處理上TB級別的海量數據集。MapReduce的思想就是「分而治之」,Mapper負責「分」,即把複雜的任務分解為若干個「簡單的任務」來處理;Reducer負責對map階段的結果進行匯總。

一個比較形象的語言解釋MapReduce: 我們要統計圖書館中的所有書的數量。你統計1號書架,我統計2號書架。這就是「Map」。我們人越多,統計得就越快。現在我們到一起,把所有人的統計數加在一起。這就是「Reduce」。

Hive的作用有哪些

1.可以將結構化的數據文件映射成一張表,並提供類SQL查詢功能,方便非java開發人員對hdfs上的數據做 MapReduce 操作;

2.可以對數據提取轉化載入(ETL)

3.構建數據倉庫

Hive的使用場景

1.即席查詢:利用CLI或者類似Hue之類的工具,可以對Hive中的數據做即席查詢,如果底層的引擎使用的是MapReduce耗時會很久,可以替換成Tez或者Spark;

2.離線的數據分析:通過執行定時調度或者腳本去執行HQL語句,並將結果保存;

3.構建數倉時用於組織管理資料庫和表。

架構

架構這一塊主要考察Hive的基本組成,也可以針對具體的部分進行進一步考察。

Hive的構成包括哪些部分?

1.用戶介面層:常用的三個分別是CLI,JDBC/ODBC 和 WUI。其中最常用的是CLI,CLI啟動的時候,會同時啟動一個Hive副本。JDBC/ODBC是Hive的客戶端,用戶通過客戶端連接至Hive Server。在啟動客戶端模式的時候,需要指出Hive Server所在節點,並且在該節點啟動Hive Server。WUI是通過瀏覽器訪問Hive。

2.元數據存儲:Hive將元數據存儲在RDBMS中,有三種模式可以連接到資料庫,分別是內嵌式元存儲伺服器、本地元存儲伺服器、遠程元存儲伺服器。

3.Driver(Compiler/Optimizer/Executor)

Driver完成HQL查詢語句的詞法分析、語法分析、編譯、優化以及查詢計劃的生成。生成的查詢計劃存儲在HDFS上,並由MapReduce調用執行。

可以參考下圖加深印象。

Hive有哪些方式保存元數據,各有什麼特點?

Hive支持三種不同的元存儲伺服器,分別為:內嵌式元存儲伺服器、本地元存儲伺服器、遠程元存儲伺服器,每種存儲方式使用不同的配置參數。

內嵌式元存儲主要用於單元測試,在該模式下每次只有一個進程可以連接到元存儲,Derby是內嵌式元存儲的默認資料庫。

在本地模式下,每個Hive客戶端都會打開到數據存儲的連接並在該連接上請求SQL查詢。

在遠程模式下,所有的Hive客戶端都將打開一個到元數據伺服器的連接,該伺服器依次查詢元數據,元數據伺服器和客戶端之間使用Thrift協議通信。

什麼是CLI,如何使用Hive的CLI?

CLI就是命令行模式,通過命令行執行HQL命令。Hive 命令行模式啟動有兩種方式。執行這條命令的前提是要配置 Hive 的環境變數。

1.進入 /home/hadoop/app/hive 目錄,執行如下命令。

2.直接執行命令。

Hive QL語句是怎麼執行的?

整個過程的執行步驟如下:

1.解釋器完成詞法、語法和語義的分析以及中間代碼生成,最終轉換成抽象語法樹;

2.編譯器將語法樹編譯為邏輯執行計劃;

3.邏輯層優化器對邏輯執行計划進行優化,由於Hive最終生成的MapReduce任務中,Map階段和Reduce階段均由OperatorTree組成,所以大部分邏輯層優化器通過變換OperatorTree,合併操作符,達到減少MapReduce Job和減少shuffle數據量的目的;

4.物理層優化器進行MapReduce任務的變換,生成最終的物理執行計劃;

5.執行器調用底層的運行框架執行最終的物理執行計劃。

仔細看一下六七八的問題是遞進的,第六題回答出來後,才有可能被問到第七和第八。

數據類型

Hive支持哪些數據類型?

簡單的數據類型支持:TINYINT、SMALLINT、INT、BIGINT、BOOLEAN、FLOAT、DOUBLE、STRING,複雜的數據類型支持:ARRAY_TYPE、MAP_TYPE、STRUCT_TYPE。

數據組織

數據組織主要考察面試者對Hive的資料庫、表、視圖、分區和表數據的概念的考察,清楚的說出每個概念的含義就可以了。

HIve的存儲結構包括哪些?

包括資料庫、表、分區、桶、視圖和表數據。

可以具體說說每種結構嗎?

database-資料庫在 HDFS 中表現為指定的目錄下的一個文件夾,通過$可以進行設置;

table-內部表在 HDFS 中表現為某個 database 目錄下一個文件夾,默認創建的都是內部表;

external table-外部表與內部表類似,在 HDFS 中表現為指定目錄下一個文件夾;

bucket-桶在 HDFS 中表現為同一個表目錄或者分區目錄下根據某個欄位的值進行 hash 散列之後的多個文件;

view-視圖與表類似,只讀,基於基本表創建,不佔存儲空間,實際是一連串的查詢語句;

表數據對應 HDFS 對應目錄下的文件。

你知道內部表和外部表的區別嗎?

內部表數據由Hive自身管理,外部表數據由HDFS管理;刪除內部表會直接刪除元數據(metadata)及存儲數據;刪除外部表僅僅會刪除元數據,HDFS上的文件並不會被刪除。

說說分區表和分桶表的區別

分區表,Hive 數據表可以根據某些欄位進行分區操作,細化數據管理,讓部分查詢更快,不同分區對應不同的目錄;

分桶表:表和分區也可以進一步被劃分為桶,分桶是相對分區進行更細粒度的劃分。分桶將整個數據內容按照某列屬性值的hash值進行區分,不同的桶對應不同的文件。

DDL操作

DDL操作主要考察的是對庫和表的操作,這是數據分析師工作中最常用的。一般會結合實際的需求進行出題。

例如一份視頻APP的播放數據,記錄用戶每次的起播和結束播放:包括用戶的設備ID、日期、起播或者結束,播放時長(起播時為0)

先構建一個測試資料庫,然後構建一張表用來存儲上述的數據,按照日期進行分區

將如下數據導入到test.video_play這張表中

導入數據到Hive表中,可以從文件中讀取,也可以直接在代碼中將數據一條一條插入,不同的分區需要不同的插入代碼。

給video_play表增加一個20190103的分區

這樣的話,如果需要計算兩個數的乘積的話只需要調用:mulOneAtTime(5)(4)

函數

Hive函數的考察主要是函數的使用,一般代碼類的題目居多,窗口函數是考察的要點。

統計每天的人均播放次數和播放時長,其中播放次數按照起播日誌來算,播放時長按照播放結束日誌來統計

找出每天播放時長最長的用戶

本題考察了窗口函數rank的使用,也可以用子查詢和join配合得出一樣的結果,但是如果你在面試的時候使用窗口函數,無疑是一個加分項。

你知道哪些統計函數和窗口函數嗎?

統計函數有:sum、avg、max/min、count

窗口函數常用的有:除了上述統計函數外,還有first_value/last_value、lag/lead、rank、row_number

hive中 order by,sort by,cluster by,distrbute by,partition by各代表什麼意思?

order by:會對輸入做全局排序,因此只有一個reducer(多個reducer無法保證全局有序)。當輸入規模較大時,需要較長的計算時間。

sort by:不是全局排序,其在數據進入reducer前完成排序。

distribute by:按照指定的欄位對數據進行劃分輸出到不同的reducer中。

cluster by:除了具有 distribute by 的功能外還兼具 sort by 的功能。

partition by:按照指定欄位進行分區,用在窗口函數中。

數據傾斜

數據傾斜不僅在Hive面試中會被問到,其他只要涉及到大規模程序開發的組件都會問到數據傾斜方面的問題,因為這是在實際工作中經常會出現的問題,如何去避免和解決出現的數據傾斜問題是衡量你代碼水平高低的尺子。

什麼是數據傾斜?

數據傾斜就是數據的分布不平衡,某些地方特別多,某些地方又特別少,導致在處理數據的時候,有些很快就處理完了,而有些又遲遲未能處理完,導致整體任務最終遲遲無法完成,這種現象就是數據傾斜。

你知道發生數據傾斜的原因嗎?

發生數據傾斜的原因有很多,大致可以歸為:

1.key分布不均勻;

2.數據本身的特性,原本按照日期進行分區,如果在特定日期數據量劇增,就有可能造成傾斜;

3.建表時考慮不周,分區設置不合理或者過少;

4.某些 HQL 語句本身就容易產生數據傾斜,如 join。

哪些HQL操作可能會發生數據傾斜?

對照上面的表格,可以得出有三種情況可能會發生數據傾斜:

1.join

大小表join的時候,其中一個較小表的key集中,這樣分發到某一個或者幾個的Reduce上的數據就可能遠高於平均值;

兩張大表join的時候,如果有很多0值和空值,那麼這些0值或者空值就會分到一個Reduce上進行處理;

join的時候,不同數據類型進行關聯,發生類型轉換的時候可能會產生null值,null值也會被分到一個Reduce上進行處理;

2.group by

進行分組的欄位的值太少,造成Reduce的數量少,相應的每個Reduce的壓力就大;

3.count distinct

count distinct的時候相同的值會分配到同一個Reduce上,如果存在特殊的值太多也會造成數據傾斜。

HIVE優化

Hive優化包括Hive Sql優化以及Hive的配置參數優化。

count(distinct uid),該用法在MR 的 reduce 階段只有一個 reduce 來處理,當數據量較大會導致嚴重的數據傾斜,如何進行優化呢?

可以先對uid進行去重,然後再count統計。

以下代碼,如果數據量很大,會有什麼問題?如何優化?

Hive SQL中的order by就是將結果按某欄位全局排序,這會導致所有map端數據都進入一個reducer中,在數據量大時可能會長時間計算不完。

可以使用sort by,會視情況啟動多個reducer進行排序,並且保證每個reducer內局部有序。為了控制map端數據分配到reducer的key,往往還要配合distribute by一同使用,如果不加distribute by的話,map端數據就會隨機分配到reducer。

下面是優化後的代碼。

談談如何對join操作進行優化?

join優化是個複雜的問題,可以從以下幾點進行優化:

1.小表前置

大小表在join的時候,應該將小表放在前面,Hive在解析帶join的SQL語句時,會默認將最後一個表作為大表,將前面的表作為小表並試圖將它們讀進內存。如果表順序寫反,大表在前面,可能會引發OOM。

2.key值相同

多表join的時候盡量使用相同的key來關聯,這樣會將會將多個join合併為一個MR job來處理。

3.利用map join特性

map join特別適合大小表join的情況。Hive會將大表和小表在map端直接完成join過程,消滅reduce,效率很高。Hive 0.8版本之前,需要加上map join的暗示,以顯式啟用map join特性,具體做法是在select語句後面增加/* mapjoin(需要廣播的較小表)*/。

對於空值或者無意義的值引發的數據傾斜,該怎麼處理呢?

這在寫程序的時候要考慮清楚,這些異常值的過濾會不會影響計算結果,如果影響那就不能直接過濾掉,可以將這些異常的key用隨機方式打散,例如將用戶ID為null的記錄隨機改為負值。

如何調整mapper數?

mapper數量與輸入文件的split數息息相關,可以通過設置相關參數來調整mapper數。

可以直接通過參數mapred.map.tasks(默認值2)來設定mapper數的期望值,但它不一定是最終mapper數;

2.輸入文件的總大小為total_input_size。HDFS中,一個塊的大小由參數dfs.block.size指定,默認值64MB或128MB。所以得出來的默認mapper數就是:

default_mapper_num = total_input_size / dfs.block.size,但是它也不一定是最終的mapper數;

4.最終得出mapper數:

mapper_num=MIN(split_num,MAX(default_mapper_num,mapred.map.tasks))。

其中可變的參數有:mapred.map.tasks、dfs.block.size(不會為了一個程序去修改,但是也算是一個可變參數)、mapred.min.split.size、mapred.max.split.size,通過調整他們來實現,mapper數的變化。

如何調整reducer數?

使用參數mapred.reduce.tasks可以直接設定reducer數量,不像mapper一樣是期望值。如果不設這個參數的話,Hive就會自行推測,邏輯如下:

reducer數量決定了輸出文件的數量。如果reducer數太多,會產生大量小文件,對HDFS造成壓力。如果reducer數太少,每個reducer要處理很多數據,容易拖慢執行時間也有可能造成OOM。

什麼時候又需要合併文件?如何合併小文件?

當有很多小文件的時候沒需要合併小文件,可以在輸入階段合併,也可以在輸出階段合併。

1.輸入階段合併

2.輸出階段合併

什麼是嚴格模式?

嚴格模式不允許用戶執行3種有風險的HiveSQL語句,一旦執行就會直接失敗。這3種語句是:

1.查詢分區表時不限定分區列的語句;

2.兩表join產生了笛卡爾積的語句;

3.用order by來排序但沒有指定limit的語句。

小結

參考文獻

[1] Hive編程指南,作者:Edward Capriolo

[2] MapReduce詳解,作者:burpee - https://blog.csdn.net/burpee/article/details/78769161

[3] Hive知識歸納——詳解 hive 各個知識點,作者:code_solve - https://www.jianshu.com/p/9fe1559fea30

[4] 據面試題——Hive篇,作者:提燈尋夢在南國 -https://blog.csdn.net/weixin_38073885/article/details/89320464

[5] Hive/HiveQL常用優化方法全面總結,作者:LittleMagic -https://www.jianshu.com/p/8e2f2f0d4b6c

ml

推薦崗位1:美團點評-機器學習工程師

推薦崗位2:安健科技-圖像演算法工程師

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI研習社 的精彩文章:

數據挖掘面試題之:生成模型 VS 判別模型
如何使用 Google的AutoAugment 改進圖像分類器

TAG:AI研習社 |