Hadoop 面試題(一)

自己收集整理面試題以及答案,鑑於沒有什麼標準的答案,如有異議之處還請賜教。

一、內部表和外部表的區別

1.在創建表的時候,導入數據到外部表,數據並沒有移動到自己的數據倉庫下,而在自己創建表指定的路徑下,而對應於內部表數據是移動到自己的數據倉庫下的。
2.在刪除表的時候,hive 會將內部表的元數據和數據全部刪除,而外部表僅僅只是刪除元數據,數據並沒有刪除。

二、Hbase的行健怎樣創建比較好?列族怎樣創建比較好?

Hbase中行健用來檢索表中的記錄:通過以下三種方式:
1.	通過單個的行健訪問
2.	通過行健的範圍進行scan
3.	全表掃描:掃描整張表中的所有行

行健是按照字典順序存儲的,創建行健的時候應對應這個排序特點,經常讀取的數據放在一起,最近可能被訪問的數據放在一起。
	列族:不要在一張表中定義太多的列族,當某個列族flush的時候,臨近的列族也會因關聯效應而被觸發flush。

三、三個datanode當中有一個datanode出錯會怎樣?

訪問數據失敗則去其他備份的機器去讀取,並將這個數據塊再進行復制一次到達備份標準


四、MapReduce的調度模式:

先按照作業的優先級高低,而後按照作業到達時間的先後進行處理。
	計算能力調度
		支持多個隊列,每個隊列採用FIFO調度策略,計算每個隊列中正在運行的任務數和其分得的計算資源的比值,選擇比值最小的隊列,之後採用FIFO策略。
	公平調度
		同一個隊列中的作業共享資源。
	異構集羣調度
	實時調度

五、Hadoop的壓縮算法:


1.用一些包含了壓縮並且支持splittable的文件格式,比如Sequence File,RCFile或者Avro文件,這些文件格式我們之後都會講到。如果爲了快速壓縮可以使用lzo,lz4或者snappy壓縮格式。
2.使用提供splittable的壓縮格式,比如,bzip2和索引後可以支持splittable的lzo。
3.提前把文件分成幾個塊,每個塊單獨壓縮,這樣就無需考慮splittable的問題了。


六、Mapreduce怎麼處理數據傾斜的問題?

數據傾斜:在執行mapreduce的時候,reduce節點大部分都已經執行完畢,但是總是存在着一個或者幾個節點運行較慢,導致整個程序處理時間較長,只是因爲某一條key的條數比其他的多很多,所以處理這個條數的節點時間較長,導致某幾個節點遲遲運行不完。
解決:
	設置一個hash份數N,用來打散key值。
	對有重複的key,將1~N添加到key的後面,形成新的key值。
	對於key值平均分發到不同的reduce節點,如果需要和其他數據相關聯,		爲了保證每個reduce節點上都有相關聯的key,對另一個key也進行上述處理。 
採用調度策略處理數據傾斜問題。
基於抽樣分區解決數據傾斜問題(一篇碩士論文)

七、Hadoop框架中怎麼來優化?

Hadoop 框架存在着一些問題:
	namenode、jobtracker單點故障,HDFS小文件,jobtracker同時負責監控和調度,負載過大,數據處理的性能。
	框架調優:
(1)	應用程序調優:書寫程序優化
1.	避免不必要的reduce任務
2.	外部文件引入:對於一些外部文件,如字典,配置文件等需要在task之間共享,可以放到分佈式緩存裏面DistributedCache
3.	爲job添加一個combiner:可以減少shuffle階段從map task遠程拷貝到reduce task的開銷
4.	根據數據特徵選擇使用Writable,也可以根據自己的實際情況書寫Writable
5.	重用Writable類型
6.	使用StringBuffer而不是String:SringBuffer是可修改的,String是隻讀的,如果需要修改,會產生臨時對象,StringBuffer不會產生臨時對象。
(2)	對hadoop參數調優
(3)	系統實現角度調優:根據系統實現的要求,可能會修改源碼等方面。

八、shuffle階段:

shuffle階段:將map的輸出作爲reduce的輸入的過程就是shuffle了,這個是mapreduce優化的重點地方。這裏我不講怎麼優化shuffle階段,講講shuffle階段的原理,因爲大部分的書籍裏都沒講清楚shuffle階段。Shuffle一開始就是map階段做輸出操作,一般mapreduce計算的都是海量數據,map輸出時候不可能把所有文件都放到內存操作,因此map寫入磁盤的過程十分的複雜,更何況map輸出時候要對結果進行排序,內存開銷是很大的,map在做輸出時候會在內存裏開啓一個環形內存緩衝區,這個緩衝區專門用來輸出的,默認大小是100mb,並且在配置文件裏爲這個緩衝區設定了一個閥值,默認是0.80(這個大小和閥值都是可以在配置文件裏進行配置的),同時map還會爲輸出操作啓動一個守護線程,如果緩衝區的內存達到了閥值的80%時候,這個守護線程就會把內容寫到磁盤上,這個過程叫spill,另外的20%內存可以繼續寫入要寫進磁盤的數據,寫入磁盤和寫入內存操作是互不干擾的,如果緩存區被撐滿了,那麼map就會阻塞寫入內存的操作,讓寫入磁盤操作完成後再繼續執行寫入內存操作,前面我講到寫入磁盤前會有個排序操作,這個是在寫入磁盤操作時候進行,不是在寫入內存時候進行的,如果我們定義了combiner函數,那麼排序前還會執行combiner操作。每次spill操作也就是寫入磁盤操作時候就會寫一個溢出文件,也就是說在做map輸出有幾次spill就會產生多少個溢出文件,等map輸出全部做完後,map會合並這些輸出文件。這個過程裏還會有一個Partitioner操作,對於這個操作很多人都很迷糊,其實Partitioner操作和map階段的輸入分片(Input split)很像,一個Partitioner對應一個reduce作業,如果我們mapreduce操作只有一個reduce操作,那麼Partitioner就只有一個,如果我們有多個reduce操作,那麼Partitioner對應的就會有多個,Partitioner因此就是reduce的輸入分片,這個程序員可以編程控制,主要是根據實際key和value的值,根據實際業務類型或者爲了更好的reduce負載均衡要求進行,這是提高reduce效率的一個關鍵所在。到了reduce階段就是合併map輸出文件了,Partitioner會找到對應的map輸出文件,然後進行復制操作,複製操作時reduce會開啓幾個複製線程,這些線程默認個數是5個,程序員也可以在配置文件更改複製線程的個數,這個複製過程和map寫入磁盤過程類似,也有閥值和內存大小,閥值一樣可以在配置文件裏配置,而內存大小是直接使用reduce的tasktracker的內存大小,複製時候reduce還會進行排序操作和合並文件操作,這些操作完了就會進行reduce計算了。

九、sqoop在導入mysql時,如何讓數據不重複導入?

使用--參數進行不重複導入:
sqoop import --connect jdbc:mysql://localhost:3306/hive  --username root 
	--password hadoop --table TBLS --fields-terminated-by '\t'  
	--null-string '**'  -m 1 --append  --hive-import  
	--check-column 'TBL_ID' --incremental append --last-value 6(不重複導入 檢查列參數 增量導入)

	sqoop簡單的操作
1.把數據從mysql導入到hdfs(默認是/user/<username>)中
  sqoop import --connect jdbc:mysql://localhost:3306/hive  --username root 
	--password hadoop --table TBLS --fields-terminated-by '\t'  --null-string '**'  
	-m 1 --append  --hive-import 

2.把數據從hdfs導出到mysql中  
  sqoop export --connect jdbc:mysql://localhost:3306/hive  --username root
	--password hadoop --table id(自己先創建表) --fields-terminated-by '\t' 
	--export-dir '/id' (將id文件傳到hdfs上)

3.設置爲作業,運行作業
  sqoop job --create myjob -- import --connect jdbc:mysql://localhost:3306/hive 
	--username root --password hadoop --table TBLS --fields-terminated-by '\t' 
	--null-string '**'  -m 1 --append  --hive-import  

4. 查看作業,運行作業,刪除作業
  sqoop --list
  sqoop --exec myjob
  sqoop --delete myjob

5. 導入導出的事務是以Mapper任務爲單位,有幾個Mapper就有幾個事物。




發佈了102 篇原創文章 · 獲贊 16 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章