hadoop相關試題總結
1.MapTask並行機度是由什麼決定的?
由切片數量決定的。
2.MR是幹什麼的?
MR將使用者編寫的業務邏輯程式碼和自帶的預設元件結合起來組成一個完整的分散式應用程式放到hadoop叢集上執行。
3.combiner和partition的作用:
combiner的意義就是對每一個maptask的輸出進行區域性彙總,以減小網路傳輸量 partition的預設實現是hashpartition,是map端將資料按照reduce個數取餘,進行分割槽,不同的reduce來copy自己的資料。 partition的作用是將資料分到不同的reduce進行計算,加快計算效果。
4,什麼是shuffle
map階段處理的資料如何傳遞給reduce階段,是mapreduce框架中最關鍵的一個流程,這個流程就叫shuffle; shuffle: 洗牌、發牌——(核心機制:資料分割槽,排序,快取,分組); 具體來說:就是將maptask輸出的處理結果資料,分發給reducetask,並在分發的過程中,對資料按key進行了分割槽和排序,分組;
5.MapReduce原理
InputFormat來讀取資料,按行讀取,返回KV值傳到map方法中, context.write方法將處理後資料輸出到outputCollector中, 當outputCollector中的資料累計到一定數量後再將資料傳到記憶體的環形緩衝區做處理, 當環形緩衝區中的資料累積到一定數量後再將資料通過Splier多次溢位到本地磁碟的多個檔案中,期間會對各個溢位的資料進行分割槽、排序 然後對多個檔案進行merge(歸併排序)形成一個輸出結果大檔案 ruduceTask根據自己的分割槽號去各個mapTask機器上取輸出結果檔案 將得到的各個結果檔案進行merge,然後進入reduce階段, context.write將最終結果輸出到outPutformat上,進而輸出到本地檔案中。
6.什麼是yarn?
Yarn是一個資源排程平臺,負責為運算程式提供伺服器運算資源,相當於一個分散式的作業系統平臺,而mapreduce等運算程式則相當於運行於作業系統之上的應用程式。
7.namenode的safemode是怎麼回事?如何才能退出safemode?
namenode在剛啟動的時候元資料只有檔案塊資訊,沒有檔案所在datanode的資訊,需要datanode自己向namenode彙報。如果namenode發現datanode彙報的檔案塊資訊沒有達到namenode記憶體中所有檔案塊的總閾值的一個百分比,namenode就會處於safemode。 只有達到這個閾值,namenode才會推出safemode。也可手動強制退出。
8.secondarynamenode的主要職責是什麼?簡述其工作機制
sn的主要職責是執行checkpoint操作 每隔一段時間,會由secondary namenode將namenode上積累的所有edits和一個最新的fsimage下載到本地,並載入到記憶體進行merge(這個過程稱為checkpoint)
9.一個datanode 宕機,怎麼一個流程恢復?
Datanode宕機了後,如果是短暫的宕機,可以實現寫好指令碼監控,將它啟動起來。如果是長時間宕機了,那麼datanode上的資料應該已經被備份到其他機器了, 那這臺datanode就是一臺新的datanode了,刪除他的所有資料檔案和狀態檔案,重新啟動 。
10.hadoop 的 namenode 宕機,怎麼解決?
先分析宕機後的損失,宕機後直接導致client無法訪問,記憶體中的元資料丟失,但是硬碟中的元資料應該還存在,如果只是節點掛了, 重啟即可,如果是機器掛了,重啟機器後看節點是否能重啟,不能重啟就要找到原因修復了。 但是最終的解決方案應該是在設計叢集的初期就考慮到這個問題,做namenode的HA。
11.簡述hadoop安裝?
改IP,修改Host檔案;
裝JDK配置環境變數;
裝Hadoop配置環境變數;
修改hadoop的配置檔案如core-site、marp-site、yarn-site、dfs-site等;
namenode進行格式化;
start-all;
12.請列出hadoop正常工作時要啟動那些程序,並寫出各自的作用。
namenode:管理叢集並記錄datanode的元資料,相應客戶端的請求。
seconder namenode:對namenode一定範圍內的資料做一份快照性備份。
datanode:儲存資料。
jobTracker:管理客戶端提交的任務,並將任務分配給TaskTracker。
TaskTracker:執行各個Task。
13.用mapreduce怎麼處理資料傾斜問題?
資料傾斜:map /reduce程式執行時,reduce節點大部分執行完畢,但是有一個或者幾個reduce節點執行很慢,導致整個程式的處理時間很長, 這是因為某一個key的條數比其他key多很多(有時是百倍或者千倍之多),這條key所在的reduce節點所處理的資料量比其他節點就大很多, 從而導致某幾個節點遲遲執行不完,此稱之為資料傾斜。
解決:自己實現partition類,用key和value相加取hash值。
資料的傾斜主要是兩個的資料相差的數量不在一個級別上,在只想任務時就造成了資料的傾斜,可以通過分割槽的方法減少reduce資料傾斜效能的方法,例如;抽樣和範圍的分割槽、自定義分割槽、資料大小傾斜的自定義側咯
13.Mapreduce 的 map 數量 和 reduce 數量 怎麼確定 ,怎麼配置?
map數量由處理資料分成的block數量決定。default_num = total_size / split_size;
reduce的數量由job.setNumReduceTasks(x),x為設定的reduce數量。不設定的話預設為1
14.hdfs的體系結構
hdfs有namenode、secondraynamenode、datanode組成。
namenode負責管理
datanode和記錄元資料
secondraynamenode負責合併日誌
datanode負責儲存資料
15.說下對hadoop 的一些理解,包括哪些元件
詳談hadoop的應用,包括的元件分為三類,分別說明hdfs,yarn,mapreduce。
16.一些傳統的hadoop 問題,mapreduce 他就問shuffle 階段,你怎麼理解的 ?
Shuffle意義在於將不同map處理後的資料進行合理分配,讓reduce處理,從而產生了排序、分割槽、分組。
17.NameNode 負責管理 metadata,client 端每次讀寫請求,它都會從磁碟中讀取或則會寫入 metadata資訊並反饋client 端。(錯誤)
解析:NameNode 不需要從磁碟讀取 metadata,所有資料都在記憶體中,硬碟上的只是序列化的結果,只有每次 namenode 啟動的時候才會讀取。
18.怎樣判斷檔案時候存在?
這是linux上的知識,只需要在IF[ -f ] 括號中加上-f引數即可判斷檔案是否存在
19.hdfs中的block預設儲存幾份?
不管是hadoop1.x 還是hadoop2.x 都是預設的儲存三份,可以通過引數dfs.replication就行修改,副本的數目要根據機器的個數來確定。
20.列舉幾個配置檔案優化?
Core-site.xml 檔案的優化
fs.trash.interval
預設值: 0
說明: 這個是開啟hdfs檔案刪除自動轉移到垃圾箱的選項,值為垃圾箱檔案清除時間。一般開啟這個會比較好,以防錯誤刪除重要檔案。單位是分鐘。
dfs.namenode.handler.count
預設值:10
說明:hadoop系統裡啟動的任務執行緒數,這裡改為40,同樣可以嘗試該值大小對效率的影響變化進行最合適的值的設定。
mapreduce.tasktracker.http.threads
預設值:40
說明:map和reduce是通過http進行資料傳輸的,這個是設定傳輸的並行執行緒數。
21。怎樣快速的殺死一個job?
1、執行hadoop job -list 拿到job-id
2、Hadoop job kill hadoop-id
22。新增一個節點時怎樣快速的啟動?
Hadoop-daemon.sh start datano
23.hdfs 的資料壓縮演算法?
Hadoop 的壓縮演算法有很多,其中比較常用的就是gzip演算法與bzip2演算法,都可以可通過CompressionCodec來實現
24.hadoop的排程?
Hadoop 的排程有三種其中fifo的排程hadoop的預設的,這種方式是按照作業的優先順序的高低與到達時間的先後執行的,還有公平排程器:名字見起意就是分配使用者的公平獲取共享叢集唄!容量排程器:讓程式都能貨到執行的能力,在佇列中獲得資源。
25.datanode 在什麼情況下不會備份?
Hadoop儲存的三個副本如果不算備份的話,那就是在正常執行的情況下不會備份,也是就是在設定副本為1的時候不會備份,說白了就是單臺機器唄!!還有datanode 在強制關閉或者非正常斷電不會備份。
26.hadoop flush 的過程?
Flush 就是把資料落到磁碟,把資料儲存起來唄!
27.三個 datanode,當有一個 datanode 出現錯誤會怎樣?
第一不會給儲存帶來影響,因為有其他的副本儲存著,不過建議儘快修復,第二會影響運算的效率,機器少了,reduce在儲存資料時選擇就少了,一個數據的塊就大了所以就會慢。
28.檔案大小預設為 64M,改為 128M 有啥影響?
增加檔案塊大小,需要增加磁碟的傳輸速率
29.datanode 首次加入 cluster 的時候,如果 log 報告不相容檔案版本,那需要namenode 執行格式化操作,這樣處理的原因是?
這樣處理是不合理的,因為 namenode 格式化操作,是對檔案系統進行格式
化,namenode 格式化時清空 dfs/name 下空兩個目錄下的所有檔案,之後,會在目
錄 dfs.name.dir 下建立檔案。
文字不相容,有可能時 namenode 與 datanode 的 資料裡的 namespaceID、
clusterID 不一致,找到兩個 ID 位置,修改為一樣即可解決。
30.MapReduce 中排序發生在哪幾個階段?這些排序是否可以避免?為什麼?
一個 MapReduce 作業由 Map 階段和 Reduce 階段兩部分組成,這兩階段會對數
據排序,從這個意義上說,MapReduce 框架本質就是一個 Distributed Sort。在 Map
階段,在 Map 階段,Map Task 會在本地磁碟輸出一個按照 key 排序(採用的是快速
排序)的檔案(中間可能產生多個檔案,但最終會合併成一個),在 Reduce 階段,每
個 Reduce Task 會對收到的資料排序,這樣,資料便按照 Key 分成了若干組,之後以
組為單位交給 reduce()處理。很多人的誤解在 Map 階段,如果不使用 Combiner
便不會排序,這是錯誤的,不管你用不用 Combiner,Map Task 均會對產生的資料排
序(如果沒有 Reduce Task,則不會排序,實際上 Map 階段的排序就是為了減輕 Reduce
端排序負載)。由於這些排序是 MapReduce 自動完成的,使用者無法控制,因此,在
hadoop 1.x 中無法避免,也不可以關閉,但 hadoop2.x 是可以關閉的。
31.簡單概述一下hadoop1與hadoop2的區別?
Hadoop2與hadoop1最大的區別在於HDFS的架構與mapreduce的很大的區別,而且速度上有很大的提升,hadoop2最主要的兩個變化是:namenode可以叢集的部署了,hadoop2中的mapreduce中的jobTracker中的資源排程器與生命週期管理拆分成兩個獨立的元件,並命名為YARN 。
32.YARN的新特性?
YARN是hadoop2.x之後才出的,主要是hadoop的HA(也就是叢集),磁碟的容錯,資源排程器 。
33.hadoop join的原理?
實現兩個表的join首先在map端需要把表標示一下,把其中的一個表打標籤,到reduce端再進行笛卡爾積的運算,就是reduce進行的實際的連結操作。
33.hadoop的二次排序?
Hadoop預設的是HashPartitioner排序,當map端一個檔案非常大另外一個檔案非常小時就會產生資源的分配不均勻,既可以使用setPartitionerClass來設定分割槽,即形成了二次分割槽。
34.hadoop的mapreduce的排序發生在幾個階段?
發生在兩個階段即使map與reduce階段
35.使用mr,spark ,spark sql編寫word count程式?
36.有可能使hadoop任務輸出到多個目錄中麼?如果可以,怎麼做?
答案:在1.X版本後使用MultipleOutputs.java類實現 原始碼:
MultipleOutputs.addNamedOutput(conf,"text2",TextOutputFormat.class,Long.class,String.class); MultipleOutputs.addNamedOutput(conf, "text3", TextOutputFormat.class, Long.class, String.class);
Multiple['m?lt?pl]--》許多的
37.Hadoop中job和Tasks之間的區別是什麼?
job是工作的入口,負責控制、追蹤、管理任務,也是一個程序 包含map task和reduce task
Tasks是map和reduce裡面的步驟,主要用於完成任務,也是執行緒.
38.Hadoop中的RecordReader的作用是什麼?
屬於split和mapper之間的一個過程 將inputsplit輸出的行為一個轉換記錄,成為key-value的記錄形式提供給mapper 。
39.Map階段結束後,Hadoop框架會處理:Partitioning ,shuffle 和sort,在這個階段都會發生了什麼?
MR一共有四個階段,split map shuff reduce 在執行完map之後,可以對map的輸出結果進行分割槽, 分割槽:這塊分片確定到哪個reduce去計算(彙總) 排序:在每個分割槽中進行排序,預設是按照字典順序。 Group:在排序之後進行分組 。
40.mapreduce的優化方法?
資料輸入
map階段
reduce階段
IO傳輸
資料傾斜問題
常用的調優引數
41.如果沒有定義的partitioner,那麼資料在被送達reducer前是如何被分割槽?
如果沒有自定義的 partitioning,則預設的 partition 演算法,即根據每一條資料的 key
的 hashcode 值摸運算(%)reduce 的數量,得到的數字就是“分割槽號“。
42. MapReduce 怎麼實現 TopN?
可以自定義groupingcomparator,對結果進行最大值排序,然後再reduce輸出時,控制只輸出前n個數。就達到了topn輸出的目的。
43.HDFS的儲存機制?
HDFS儲存機制,包括HDFS的寫入過程和讀取過程兩個部分
寫資料過程:
1)客戶端向namenode請求上傳檔案,namenode檢查目標檔案是否已存在,父目錄是否存在。
2)namenode返回是否可以上傳。
3)客戶端請求第一個 block上傳到哪幾個datanode伺服器上。
4)namenode返回3個datanode節點,分別為dn1、dn2、dn3。
5)客戶端請求dn1上傳資料,dn1收到請求會繼續呼叫dn2,然後dn2呼叫dn3,將這個通訊管道建立完成
6)dn1、dn2、dn3逐級應答客戶端
7)客戶端開始往dn1上傳第一個block(先從磁碟讀取資料放到一個本地記憶體快取),以packet為單位,dn1收到一個packet就會傳給dn2,dn2傳給dn3;dn1每傳一個packet會放入一個應答佇列等待應答
8)當一個block傳輸完成之後,客戶端再次請求namenode上傳第二個block的伺服器。(重複執行3-7步)
讀資料過程:
1)客戶端向namenode請求下載檔案,namenode通過查詢元資料,找到檔案塊所在的datanode地址。
2)挑選一臺datanode(就近原則,然後隨機)伺服器,請求讀取資料。
3)datanode開始傳輸資料給客戶端(從磁盤裡面讀取資料放入流,以packet為單位來做校驗)。
4)客戶端以packet為單位接收,先在本地快取,然後寫入目標檔案。
未完待續。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。