1. 程式人生 > >hadoop面試題整理

hadoop面試題整理

1. 描述下Shuffle過程中分割槽?

2.簡單描述MapReduce不合適對哪些場景的使用?

3. 簡述Combiner 和partition的作用
(1).combine分為map端和reduce端,作用是把同一個key的鍵值對合並在一起,可以自定義的。
combine函式把一個map函式產生的<key,value>對(多個key,value)合併成一個新的<key2,value2>.
將新的<key2,value2>作為輸入到reduce函式中這個value2亦可稱之為values,因為有多個。這個合併的目的是為了減少網路傳輸。
(2).partition是分割map每個節點的結果,按照key分別對映給不同的reduce,也是可以自定義的。這裡其實可以理解歸類。"


4.什麼是檔案切分?
答:將檔案拆分成splits,由於測試用的檔案較小,所以每個檔案為一個split,並將檔案按行分割形成<key,value>對。這一步由MapReduce框架自動完成,其中偏移量包括了回車所佔的字元數。將分割好的<key,value>對交給使用者定義的map方法進行處理,生成新的<key,value>對。得到map方法輸出的<key,value>對後,Mapper會將它們按照key值進行排序,並執行Combine過程,將key至相同value值累加,得到Mapper的最終輸出結果。Reducer先對從Mapper接收的資料進行排序,再交由使用者自定義的reduce方法進行處理,得到新的<key,value>對,並作為任務的輸出結果。"


5.什麼是mapreduce壓縮?
答:MapReduce應用使用非壓縮的資料來讀取和寫入,我們也可以受益於壓縮map階段的中間輸出。因為map作業的輸出會被寫入磁碟並通過網路傳輸到reducer節點,所以若使用LZO之類的快速壓縮,能得到更好的效能,因為傳輸的資料量大大減少了"w'w'w


6.編寫mapreduce的大致流程都有哪些?
答:主要分為八個步驟
(1).對檔案進行切片規劃
(2).啟動相應數量的maptask程序.
(3).呼叫FileInputFormat中的RecordReader,讀一行資料並封裝為<k1,v1>
(4).呼叫自定義的map函式,並將k1v1傳給map.
(5).收集map的輸出,進行分割槽和排序.
(6).reduce task任務啟動,並從map端拉取資料.
(7).reduce task呼叫自定義的reduce函式進行處理.
(8).呼叫outputformat的recordwriter將結果資料輸出。


7.簡單描述Shuffle過程環形緩衝區的作用?
資料從map()輸出,經過Partitioner分割槽操作,在進入環形緩衝區。
預設情況下,環形緩衝區大小值為100MB。當map輸入的資料進入環形
緩衝區的量達到80MB以上是,那麼開始執行溢寫過程。最終經過合併、
排序後落入本地磁碟。


8. Client端讀取HDFS資料過程分析


9. Client端上傳資料到HDFS過程分析


10.題目:某公司員工早上開始上班發現Hadoop環境被關閉,於是打算啟動Hadoop叢集,
啟動叢集了之後就馬上傳檔案到hdfs系統:
hadoop fs -put ./install.log.syslog /
發現上傳失敗。提示資訊為:
put: Cannot create file/install.log.syslog.COPYING_. Name node is in safe mode
1.該員工看不到這個錯誤提示是什麼意思,請你簡單的解釋一下?

2.簡單描述你對Hadoop叢集SafeMode模式的理解?

當namenode發現叢集中的block丟失數量達到一個閥值時,namenode就進入安全模式狀態,
不再接受客戶端的資料更新請求


在正常情況下,namenode也有可能進入安全模式:
叢集啟動時(namenode啟動時)必定會進入安全模式,然後過一段時間會自動退出
安全模式(原因是datanode彙報的過程有一段持續時間)

也確實有異常情況下導致的安全模式
原因:block確實有缺失
措施:可以手動讓namenode退出安全模式,bin/hdfs dfsadmin -safemode leave
 或者:調整safemode門限值:  dfs.safemode.threshold.pct=0.999f
 
進入安全模式:
hdfs dfsadmin -safemode enter


退出安全模式:
hdfs dfsadmin -safemode leave
 
檢視叢集的報告:
 hadoop dfsadmin -report
  
hdfs指令碼和hadoo執行指令碼的區別;
hadoop fs -put ./xxxx /
=
hdfs dfs -put ./xxxx /



11.無論hdfs還是mapreduce,對於小檔案都有損效率,實踐中,
又難免面臨處理大量小檔案的場景,此時,就需要有相應解決方案
小檔案的優化無非以下幾種方式:
(1)在資料採集的時候,就將小檔案或小批資料合成大檔案再上傳HDFS
(2)在業務處理之前,在HDFS上使用mapreduce程式對小檔案進行合併
(3)在mapreduce處理時,可採用combineInputFormat提高效率


12. mr資料傾斜問題如何處理?

13.HDFS冗餘資料塊的自動刪除


在日常維護hadoop叢集的過程中發現這樣一種情況:
某個節點由於網路故障或者DataNode程序死亡,被NameNode判定為死亡,
HDFS馬上自動開始資料塊的容錯拷貝;當該節點重新新增到叢集中時,
由於該節點上的資料其實並沒有損壞,所以造成了HDFS上某些block的備
份數超過了設定的備份數。通過觀察發現,這些多餘的資料塊經過很長的
一段時間才會被完全刪除掉,那麼這個時間取決於什麼呢?
該時間的長短跟資料塊報告的間隔時間有關。Datanode會定期將當前該結
點上所有的BLOCK資訊報告給Namenode,引數dfs.blockreport.intervalMsec
就是控制這個報告間隔的引數。
hdfs-site.xml檔案中有一個引數:
<property>
<name>dfs.blockreport.intervalMsec</name>
<value>3600000</value>
<description>Determines block reporting interval in milliseconds.</description>
</property>
其中3600000為預設設定,3600000毫秒,即1個小時,也就是說,塊報告的時間間隔為1個小時,
所以經過了很長時間這些多餘的塊才被刪除掉。通過實際測試發現,當把該引數調整的稍小一
點的時候(60秒),多餘的資料塊確實很快就被刪除了

14.hadoop datanode節點超時時間設定


datanode程序死亡或者網路故障造成datanode無法與namenode通訊,
namenode不會立即把該節點判定為死亡,要經過一段時間,這段時
間暫稱作超時時長。HDFS預設的超時時長為10分鐘+30秒。如果定
義超時時間為timeout,則超時時長的計算公式為:
timeout  = 2 * heartbeat.recheck.interval + 10 * dfs.heartbeat.interval。
而預設的heartbeat.recheck.interval 大小為5分鐘,dfs.heartbeat.interval預設為3秒。
需要注意的是hdfs-site.xml 配置檔案中的heartbeat.recheck.interval的單位為毫秒,
dfs.heartbeat.interval的單位為秒。所以,舉個例子,如果heartbeat.recheck.interval
設定為5000(毫秒),dfs.heartbeat.interval設定為3(秒,預設),則總的超時時間為40秒。
hdfs-site.xml中的引數設定格式:


<property>
    <name>heartbeat.recheck.interval</name>
    <value>5000</value>
</property>
<property>
    <name>dfs.heartbeat.interval</name>
    <value>3</value>
</property

15.hadoop的日誌目錄(/home/hadoop/app/hadoop-2.6.4/logs)
1、hadoop啟動不正常
用瀏覽器訪問namenode的50070埠,不正常,需要診斷問題出在哪裡:
a、在伺服器的終端命令列使用jps檢視相關程序
(namenode1個節點   datanode3個節點   secondary namenode1個節點)
b、如果已經知道了啟動失敗的服務程序,進入到相關程序的日誌目錄下,檢視日誌,分析異常的原因
1)配置檔案出錯,saxparser  exception; ——找到錯誤提示中所指出的配置檔案檢查修改即可
2)unknown host——主機名不認識,配置/etc/hosts檔案即可,或者是配置檔案中所用主機名跟實際不一致
(注:在配置檔案中,統一使用主機名,而不要用ip地址)
3)directory 訪問異常—— 檢查namenode的工作目錄,看許可權是否正常

start-dfs.sh啟動後,發現有datanode啟動不正常
a)檢視datanode的日誌,看是否有異常,如果沒有異常,手動將datanode啟動起來
sbin/hadoop-daemon.sh start datanode
b)很有可能是slaves檔案中就沒有列出需要啟動的datanode
c)排除上述兩種情況後,基本上,能在日誌中看到異常資訊:
   1、配置檔案
   2、ssh免密登陸沒有配置好
   3、datanode的身份標識跟namenode的叢集身份標識不一致(刪掉datanode的工作目錄)

16.1.在HDFS系統中,一定要區分好什麼是主節點、從節點和客戶端。
2.NameNode、DataNode、HdfsClient之間的通訊
HdfsClientClient和namenode之間是通過rpc通訊;
Datanode和NameNode之間是通過rpc通訊;
HdfsClient和datanode之間是通過簡單的socket通訊;


datanode在MapReduce任務執行時,由於一行資料可能分佈在兩個資料塊上,
所以可能會從其他datanode進行讀取資料資訊,所以datanode之間有通訊,
通過rpc進行。
??????????????


3.Hadoop安裝時為什麼進行ssh配置?


Hadoop在執行諸如start-dfs.sh或者start-yarn.sh命令時,我們會從主節點
執行上述兩條命令,然後主節點會通過ssh通訊,登入到從節點執行相關的
hadoop-damen.sh start datanode之類的工作。所以,要進行ssh免密碼登入配置。
而之後namenode向datanode傳送資料塊以及datanode向namenode傳送心跳等一
系列問題都是通過rpc進行的,這跟ssh配置沒有關係。