Partitioner的使用以及原理和規避誤區(通俗易懂)

#Partitioner簡介
shuffle是通過分區partitioner 分配給Reduce的 一個Reducer對應一個記錄文件Partitioner是shuffle的一部分partitioner執行時機:在mapper執行完成,Reducer還沒有執行的時候,mapper的輸出就是partitioner的輸入 即<k2,v2>partitioner 分區主要是用來提高效率的 例如從全國基站的數據中查找北京基站的數據,如果計算時不分區全國的數據都放在一起,查詢的時候就相當於全表掃描 效率非常低,如果在第一次進行Mapreducer計算的時候按照省市進行分區,每個城市的基站數據都存儲在對應的每個文件,那麼下次再進行查詢的時候直接從北京分區裏直接查找 效率很高。分區的依據是具體業務需求,可以按照省市分區,時間進行分區等。如果不手動進行分區,Hadoop有一個默認的分區規則Partitioner是partitioner的基類,如果需要定製partitioner也需要繼承該類。HashPartitioner是mapreduce的默認partitioner。計算方法是which reducer=(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks,得到當前的目的reducer。
#Partitioner
在這裏插入圖片描述
以上流程省略了shuffle的過程DataNode在此處用於下載jarNodeManager用於運行Yarn 由YarnChild運行Mapper或Reducer當啓動一個Reducer時會分配一個分區號 默認是按數字分區Partitioner是Shuffle的一部分,當Partition的返回值是N時 會將shuffle的結果輸出給對應的分區號爲N的Reducer一個Reducer對應一個分區文件 Reducer計算完畢後就會按照分區號寫入對應的分區文件
#Partitioner創建流程
① 先分析一下具體的業務邏輯,確定大概有多少個分區
② 首先書寫一個類,它要繼承org.apache.hadoop.mapreduce.Partitioner這個類
③ 重寫public int getPartition這個方法,根據具體邏輯,讀數據庫或者配置返回相同的數字④ 在main方法中設置Partioner的類,job.setPartitionerClass(DataPartitioner.class);
⑤ 設置Reducer的數量,job.setNumReduceTasks(6);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章