poolikujm123 寫:
我有三台虛擬機,
其中我的程式的演算法需要跑四次的map reduce,
我想問假設我有三個文件,如何分配給三台虛擬機,第一台執行第一個文件,第二台執行第二個文件,以此類推,分別能夠讓每台對映執行一個文件!
當中的key值要怎麼設才好,在程式方面要如何寫才好
我有嘗試在演算法的四次mapreduce分別設job.setNumReduceTasks(3),但是輸出結果會出現資料累積重覆的情形
不太懂 setNumReduceTask(3) 的用意,如果四次 mapreduce 都設為 3 個 reducer 意思變成
3 個文件 -> 第一次 mapreduce -> 產生 3 個輸出文件 -> 第二次 mapreduce -> 產生 3 個輸出文件 -> 依此類推
理論上不會出現資料重複的問題(因為 shuffle by key, 所以每個 reducer 拿到的 key 是不同的, 除非又用到特殊的 Partitioner)
由於 Hadoop 預設是根據 Block 所在位置進行工作分配,加上 DataNode 有 Short-circuit 機制。
如果真的要作到這種機制,要作以下調整才能遵循 Hadoop MapReduce 與 HDFS 原理,又可以達成分配的目的。
以下是用 MapReduce v1 (JobTracker + TaskTracker) 的原理,若是用 YARN 變因就又更多了。
1. 將 mapper 預設 slot 個數改為 1 -- 修改於 mapred-site.xml
代碼:
<property>
<name>mapred.tasktracker.map.tasks.maximum</name>
<value>1</value>
<property>
2. 修改副本個數 -- 設為 1 或 2 -- 修改於 hdfs-site.xml
代碼:
<property>
<name>dfs.replication</name>
<value>1</value>
</property>
3. 於第一台 VM 執行 hadoop fs -put 輸入1 輸入1
於第二台 VM 執行 hadoop fs -put 輸入2 輸入2
於第三台 VM 執行 hadoop fs -put 輸入3 輸入3
這樣會強迫三台 VM 使用自己唯一的 mapper slot 去讀取本機 DataNode 的 Block
- Jazz