1. 程式人生 > >大資料每日默寫(面試題)整理(持續更新)

大資料每日默寫(面試題)整理(持續更新)

2018.10.22
1.抽象類與介面的區別?
1.語法層面上的區別
  1)抽象類可以提供成員方法的實現細節,而介面中只能存在public abstract 方法;
  2)抽象類中的成員變數可以是各種型別的,而介面中的成員變數只能是public static final型別的;
  3)介面中不能含有靜態程式碼塊以及靜態方法,而抽象類可以有靜態程式碼塊和靜態方法;
  4)一個類只能繼承一個抽象類,而一個類卻可以實現多個介面。
2.設計層面上的區別
  1)抽象類是對一種事物的抽象,即對類抽象,而介面是對行為的抽象。抽象類是對整個類整體進行抽象,包括屬性、行為,但是介面卻是對類區域性(行為)進行抽象。例如將鳥,飛機各定義為一個類,將飛行定義為一個介面。
  2)設計層面不同,抽象類作為很多子類的父類,它是一種模板式設計。而介面是一種行為規範,它是一種輻射式設計。對於抽象類,如果需要新增新的方法,可以直接在抽象類中新增具體的實現,子類可以不進行變更;而對於介面則不行,如果介面進行了變更,則所有實現這個介面的類都必須進行相應的改動。
  
2.構造方法的定義規則


定義時候的基本構成
修飾詞 方法名(引數列表){
   方法體
}
注意點:1.沒有返回值這一項 2.方法名必須與類名保持一致 3.不能被static、final、synchronized、abstract和native修飾。

3.多執行緒實現的兩種方式
第一種方式:通過建立Thread類的子類——讓run留在了執行緒的內部,造成任務與執行緒的繫結,操作不方便。
第二種方式:建立任務類實現Runnable介面——將run從執行緒中獨立出來。好處:操作更方便,哪個執行緒想工作,我就把任務交給誰。

4.List介面與Set介面的區別以及常用子類。
List中的元素,有序(元素的順序與新增元素的順序一致)、可重複、可為空;
Set中的元素,無序、不重複、只有一個空元素;
Map中的元素,無序、鍵不重,值可重、可一個空鍵、多可空值。
List常用子類ArrayList、Vector、LinkedList,其中ArrayList、Vector底層為陣列,查詢速度快,插入刪除速度慢,LinkedList底層為雙向連結串列,查詢速度慢,插入刪除速度快。Vector執行緒安全。
Set常用子類HashSet與TreeSet,其中HashSet底層是雜湊表;TreeSet底層是二叉樹。
Map常用子類HashMap與TreeMap。

補充:
HashMap和HashTable的區別:
HashMap時HashTable的輕量級實現(非執行緒安全的實現),它們都實現了Map介面,主要區別在於HashMap允許空(null)鍵值(key),由於非執行緒安全,效率上高於HashTable。
HashMap允許將null作為一個entry的key或者value,而HashTable不允許。
HashMap去掉了HashTable的contains方法,改成containsValue和containsKey方法。
二者最大的不同是,HashTable的方法是synchronized(執行緒安全的),而HashMap不是,在多個執行緒訪問HashTable時,不需要自己為它的方法實現同步,而HashMap就必須為之提供外同步。


2018.10.23
HDFS 和YARN 的基本概念。
1 HDFS
分散式檔案系統,主/從架構
NameNode 負責管理元資料(檔名稱,副本數量,檔案位置,塊大小)。HDFS 儲存是以塊儲存 預設塊大小 128MB,hadoop1 中預設的塊大小是64MB。一個節點。
DataNode:主要儲存真正的資料,多節點。
secondaryNamenode 輔助節點,用於合併兩類檔案。
Fsimage ,edits 作為元資料的映象和操作的日誌記錄。
在HDFS第一次使用的時候需要對其進行格式化,目的是生成fsimage 和 edits 檔案。
在這裡插入圖片描述

2 YARN 資源管理器,作業系統 可以在YARN進行任務的執行,YARN為這些執行的任務分配資源,管理。
主節點: resourceManager 負責全部叢集中的資源管理,和任務分配
從節點: nodeManager 負責每個機器上的資源管理


2018.10.23
hadoop常用配置檔案位置及其含義。


2018.10.24
1.HDFS的副本複製策略
hadoop官網描述如下:

對於常見情況,當複製因子為3時,HDFS的放置策略是在編寫器位於datanode上時將一個副本放在本地計算機上,否則放在隨機datanode上,另一個副本放在另一個(遠端)機架上的節點上,最後一個在同一個遠端機架的不同節點上。此策略可以減少機架間寫入流量,從而提高寫入效能。機架故障的可能性遠小於節點故障的可能性; 此策略不會影響資料可靠性和可用性保證。但是,它確實減少了讀取資料時使用的聚合網路頻寬,因為塊只放在兩個唯一的機架而不是三個。使用此策略時,檔案的副本不會均勻分佈在機架上。三分之一的副本位於一個節點上,三分之二的副本位於一個機架上,另外三分之一均勻分佈在剩餘的機架上。此策略可提高寫入效能,而不會影響資料可靠性或讀取效能。

如果複製因子大於3,則隨機確定第4個及以下副本的放置,同時保持每個機架的副本數量低於上限(基本上是(副本-1)/機架+ 2)。

由於NameNode不允許DataNode具有同一塊的多個副本,因此建立的最大副本數是此時DataNode的總數。

在將儲存型別和儲存策略的支援新增到HDFS之後,除了上述機架感知之外,NameNode還會考慮策略以進行副本放置。NameNode首先根據機架感知選擇節點,然後檢查候選節點是否具有與檔案關聯的策略所需的儲存。如果候選節點沒有儲存型別,則NameNode將查詢另一個節點。如果在第一個路徑中找不到足夠的節點來放置副本,則NameNode會在第二個路徑中查詢具有回退儲存型別的節點。

此處描述的當前預設副本放置策略是正在進行的工作。

概括為:
在這裡插入圖片描述

2.HDFS寫資料流程,畫圖加文字描述。
在這裡插入圖片描述
1.客戶端向namenode請求上傳檔案,namenode檢測該檔案是否已存在,父目錄是否存在,然後返回是否可以上傳。
2.客戶端請求上傳第一個block,namenode返回三個節點(dn1,dn2,dn3)。
3.客戶端向dn1請求上傳資料,dn1收到請求後會呼叫dn2,dn2呼叫dn3,建立傳輸通道,dn1、dn2、dn3逐級應答。
4.客戶端開始往dn1上傳第一個block(先從磁碟讀取放到一個本地記憶體快取),以packet為單位。dn1收到一個block就會傳給dn2,dn2傳給dn3。dn1每傳完一個packet會被放入一個應答佇列等待應答。
5.當一個block傳輸完成之後,客戶端再次向namenode請求上傳第二、第三個block,重複上面的步驟(2-4步),直至檔案上傳完成。

HDFS讀資料流程
在這裡插入圖片描述
文字描述:
1 客戶端通過向namenode請求下載檔案 ,namenode 收到請求之後查詢元資料資訊,找到datanode資料塊的資訊。
2 客戶端挑選一臺就近的datanode,進行請求資料。
3 datanode開始傳輸資料給客戶端,是以packet 為單位進行讀取。
4 客戶端 接收packet 資料,先在本地快取,最後寫入到目標檔案。

3.NameNode與DataNode的工作機制。
NameNode工作機制
1.第一次啟動:第一次啟動都需要格式化nameNode ,建立fsimage,edits. 第一次啟動只需要載入fsiamge。
2.如果不是第一次啟動: 直接載入edits ,fsimage映象檔案 ,合併成一個新的fsimage 檔案,再建立edits 檔案記錄新的操作行為。
啟動的過程中,會存在30秒鐘等待時間 ,這個等待的時間就是安全模式。

DataNode工作機制
在這裡插入圖片描述
文字描述:
1.一個數據塊在datanode上是以檔案形式儲存在磁碟上的,包括了兩個檔案,一個數據本身,一個是元資料包 包括資料塊的長度,,資料塊的校驗和,由於HDFS上的資料是不允許被重複上傳的所以在上傳之前會對上傳的資料進行檢查 ,時間戳。
2.DataNode啟動後會向nameNode進行註冊,通過後,會週期性的向namenode上報自己的datanode上的塊資訊。
3.心跳報告,每3秒鐘向nameNode進行彙報,心跳的返回結果中帶有NameNode 帶給該datanode複製資料塊,移動資料塊的命令, 如果說超過了10分鐘datanode沒有響應 ,則就會認為這個datanode節點不可用,會選擇其他的機器。


2018.10.26
如果NameNode意外終止,secondaryNameNode的工作是什麼?它是如何工作的?
secondaryNameNode
1.並非NameNode的熱備;
2.輔助NameNode,分擔其工作量;
3.定期合併fsimage和edits,推送給NameNode;
4.在緊急情況下,可輔助恢復NameNode。


2018.10.28
HDFS安全模式
在系統的正常操作期間,namenode會在記憶體中保留所有塊位置的對映資訊。在安全模式下,各個datanode會向namenode傳送最新的塊列表資訊,namenode瞭解到足夠多的塊位置資訊之後,即可高效執行檔案系統。
如果滿足“最小副本條件”,namenode會在30秒鐘之後就退出安全模式。所謂的最小副本條件指的是在整個檔案系統中99.9%的塊滿足最小副本級別(預設值:dfs.replication.min=1)。在啟動一個剛剛格式化的HDFS叢集時,因為系統中還沒有任何塊,所以namenode不會進入安全模式。


2018.10.30
Writable序列化(Hadoop序列化)與java序列化的區別
1.java序列化的時候會儲存類的相關和依賴關係等類的基本資訊,但是hadoop序列化的時候不會儲存類的資訊只會儲存欄位值。
2.java反序列化相當於每次重新建立一個物件,而Hadoop反序列化的時候是重用物件的,會降低建立物件的資源消耗。
3.Hadoop序列化中定製序列化格式很容易,java比較困難。
4.Hadoop序列化後的資料量小,java序列化後的資料量大。
5.序列化/反序列化方式不同。


MapReduce工作流程(shuffle流程)
在這裡插入圖片描述


2018.11.05
job在yarn上提交流程
在這裡插入圖片描述


2018.11.07
zookeeper選舉(投票)機制
1.沒有資料
通過myid給自己投票,根據myid的大小決定票數(比如myid為1,就給自己投1票),誰的票數多,誰就是leader,其餘的為follower。半數以上的節點執行成功之後,才提供服務。
2.有資料
根據xid資料的更新版本號為標準,xid最大的為leader(因為follower要同步leader上的資料,所以要確保leader的資料為最新版本),如果xid一樣則判斷myid的票數。

HA 高可用原理
在這裡插入圖片描述
在這裡插入圖片描述
所謂HA(high available),即高可用(7*24小時不中斷服務)。實現高可用最關鍵的策略是消除單點故障。
Active standby 解決了namenode 單點故障。
存在的服務 : zookeeper(解決一致性問題) ; journalnode(解決edits同步問題); zkfc(解決切換問題,負責監測)。
同步: 元資料(edits ,fsimage ), journalnode 節點,同步edits 編輯日誌 。叢集中安全性得到了保證,但是一致性卻減弱了,為了解決一致性的問題,必須存在zookeeper 。
切換機制: 首先要監控到 namenode 掛了,才能進行切換。如何知道掛掉了: 通過ZKFC RPC 呼叫監控namenode ,一旦namenode掛掉了,zookeeper 就會通知另外一個namenode 的zkfc 程序啟動 standby切換為active,在切換之前會先殺掉之前的active(通過執行一個ssh遠端呼叫)。


2018.11.12
hive的4種排序方式
1.order by全域性排序。全部資料劃分到一個reduce上。與sql中的order by類似,不同的是,hive中的order by在嚴格模式下,必須跟limit。

2.sort by 每個mapreduce內部排序。

3.distributed by分割槽排序,與sql中的group by類似,常與sort by組合使用,distributed by控制map的輸出在reduce中如何劃分,sort by控制reduce中的資料如何排序。hive要求distributed by語句出現在sort by語句之前。

4.cluster by,當distributed by與sort by欄位相同,可以用cluster by代替該組合,但cluster by 不能跟desc,asc。補充:可以這樣書寫select a.* from (select * from test cluster by id ) a order by a.id ;


2018.11.13
hive調優方式
1.Fetch抓取:把不需要MR任務計算的查詢語句設定成不執行MR任務。三個引數,none表示禁用Fetch,所有查詢都執行MR任務;more在進行select/filter/limit查詢時不會執行MR任務;minimal在select/limit的時候不會執行MR任務,但是filter會執行MR任務。
hive.fetch.task.conversion

2.本地模式:讓輸入的資料量特別小的任務直接在本地節點上進行處理,而不提交到叢集。本地模式通過判斷檔案的大小(預設128MB)和已輸入檔案的個數(預設4個)來判斷是否在本地執行。
set hive.exec.mode.local.auto=true; //開啟本地 mr
set hive.exec.mode.local.auto.inputbytes.max=50000000;
set hive.exec.mode.local.auto.input.files.max=10;

3.表的優化:優化手段有join、行列過濾、分割槽、分桶、動態分割槽等等。

4.避免資料傾斜:通過合理設定map和reduce數、小檔案合併等方式儘量保證負載均衡。或為了避免因為map或reduce任務卡死導致資料傾斜,通常也設定推測執行。

5.推測執行:為了避免因為程式的BUG/負載不均衡/資源分佈不均等原因導致同一作業中某一任務執行速度過慢,設定推測執行,為該任務啟動一個備份任務,同時執行,最先執行完成的計算結果作為最終結果。分為map端和reduce端的推測執行。
set mapreduce.map.speculative=true
set mapreduce.reduce.speculative=true

6.並行執行:把沒有依賴關係的MR任務設定為並行執行,提高多工執行時的效率。
set hive.exec.parallel=true ; // 開啟任務並行執行
set hive.exec.parallel.thread.number=8; //預設值為8個任務可以同時執行

7.嚴格模式:為了防止一些不正常的查詢語句的執行。
hive.mapred.mode= strict

8.JVM重用:當有很多小檔案的時候,每次執行MR任務都會開啟一個JVM程序,JVM頻繁的開啟關閉消耗大量的效能,所以在處理小檔案的時候,可以設定JVM重用,讓一個JVM處理多個任務後再關閉。
mapreduce.job.jvm.numtasks

9.壓縮:通過壓縮對專案進行優化。例如開啟 map 輸出階段壓縮可以減少 job 中 map 和 Reduce task 間資料傳輸量。

10.執行計劃:Hive中提供的可以檢視Hql語句的執行計劃,在執行計劃中會生成抽象語法樹,在語法樹中會顯示HQL語句之間的依賴關係以及執行過程。通過這些執行的過程和依賴可以對HQL語句進行優化。