題1、Namenode掛了怎么辦?
方法一:將SecondaryNameNode中數據拷貝到namenode存儲數據的目錄。
方法二:使用importCheckpoint選項啟動namenode守護進程,從而將SecondaryNameNode中數據拷貝到namenode目錄中。
題2、Hadoop 的namenode 宕機怎么解決?
先分析宕機后的損失,宕機后直接導致client無法訪問,內存中的元數據丟失,但是硬盤中的元數據應該還存在,如果只是節點掛了,重啟即可,如果是機器掛了,重啟機器后看節點是否能重啟,不能重啟就要找到原因修復了。但是最終的解決方案應該是在設計集群的初期就考慮到這個問題 ,做namenode的HA。
題3、談談Hadoop序列化和反序列化及自定義bean對象實現序列化?
(1)序列化和反序列化
序列化就是把內存中的對象,轉換成字節序列(或其他數據傳輸協議)以便于存儲(持久化)和網絡傳輸。反序列化就是將收到字節序列(或其他數據傳輸協議)或者是硬盤的持久化數據,轉換成內存中的對象。 Java的序列化是一個重量級序列化框架(Serializable),一個對象被序列化后 ,會附帶很多額外的信息(各種校驗信息,header,繼承體系等),不便于在網絡中高效傳輸。所以,hadoop自己開發了一套序列化機制(Writable),精簡、高效。
(2)自定義bean對象要想序列化傳輸步驟及注意事項
(1)必須實現Writable接口
(2)反序列化時,需要反射調用空參構造函數,所以必須有空參構造
(3)重寫序列化方法
(4)重寫反序列化方法
(5)注意反序列化的順序和序列化的順序完全一致
(6)要想把結果顯示在文件中,需要重寫toString(),且用”\t”分開,方便后續用
(7)如果需要將自定義的bean放在key中傳輸,則還需要實現comparable接口,因為mapreduce框中的shuffle過程一定會對key進行排序
題4、FileInputFormat切片機制
(1)簡單地按照文件的內容長度進行切片
(2)切片大小,默認等于block大小
(3)切片時不考慮數據集整體,而是逐個針對每一個文件單獨切片
題5、自定義InputFormat流程
(1)自定義一個類繼承FileInputFormat
(2)改寫RecordReader,實現一次讀取一個完整文件封裝為KV
題6、如何決定一個job的map和reduce的數量?
(1)map數量
splitSize=max{minSize,min{maxSize,blockSize}}
map數量由處理的數據分成的block數量決定default_num = total_size/split_size;
(2)reduce數量
reduce的數量job.setNumReduceTasks(x),x為reduce的數量。不設置的話默認為1。