目錄
Hadoop
1. 下列哪項通常是集羣的最主要瓶頸
A. CPU
B. 網絡
C. 磁盤IO
D. 內存
答案:C
2. 請列出正常工作的Hadoop集羣中Hadoop都分別需要啓動哪些進程,它們的作用分別是什麼?
- NameNode
- Hadoop的主服務器,管理文件系統的命名空間
- 管理數據塊的映射信息(文件 --> BLOCK),(BLOCK --> DataNodes)
- 處理客戶端的讀寫請求
- SecondaryNameNode
- 週期性備份fsimage
- 輔助NameNode 合併 editslog
- DataNode
- 用於實際存儲數據塊
- 執行數據塊的讀寫操作
3. HDFS讀寫流程
-
HDFS寫流程
- 發起請求 Client調用方法,對NameNode發起RPC請求
- 切割文件 Client將待上傳文件分塊(64M,128M)
- 異常檢查 NameNode檢查文件是否存在,Client是否有寫入權限
- 獲取DataNode信息 NameNode 將最近的DataNode節點信息返回給Client
- 建立寫入通道 Client與DataNode A通信,DataNode A 再一級一級給DataNode B,DataNode C。DataNode C會響應DataNode B,一級級返回響應。若均響應成功,則寫入通道確立
- 寫入HDFS Client將文件以Packet形式寫入到DataNode A,同時DataNode A也會將數據寫入到DataNode B,DataNode C做備份
- 重複寫入BLOCK 重複以上流程,將BLOCK全部寫入DataNode
- 寫入完畢 DataNode 寫入完畢後,回傳消息給 Client
- 定期更新元數據 DataNode會定期將BLOCK信息更新給NameNode,更新元數據
-
HDFS讀流程
- 發起請求 Client調用方法,對NameNode發起RPC請求
- 異常檢查 檢查文件是否存在
- 獲取元數據 NameNode回傳該文件對應元數據:1. 文件對應的BLOCK列表,2. 每個BLOCK對應的DataNode地址
- 建立讀取通道 Client請求DataNode建立讀取通道
- 讀取HDFS 以Packet形式回傳數據到Client
Spark
1. 對於Spark存在的數據傾斜問題你有什麼好的解決方法嗎?
- 調整並行度分散Key(一般是增大並行度)
- 自定義Partitioner(默認HashPartitioner)
- 處理Key,如增加隨機的前綴
2. 簡述你所理解的 Spark 的 shuffle 過程
Shuffle產生於寬依賴處理時,Spark根據Key值分發到不同的Partition中進行處理(類似,根據撲克牌的點數分成多個牌堆)
3. Spark中的算子分爲哪兩類?
答:分爲Transformation,Action兩類算子。個人理解,Transformation類算子:map, filter, union等算子,會對RDD有類似變形,轉換的作用,但不產生輸出。 Action類算子:show, count, collect 將產生真正的結果輸出。一般情況下需要儘量避免Shuffle,因爲洗牌,發牌等流程將耗費較大的系統資源。儘量避免使用reduceByKey,Join等可能產生Shuffle的算子。