我知道,可以通過將mapred.min.split.size設置爲dfs.block.size來基於我的dfs分割大小設置映射器的數量。如何根據我的映射器輸出大小動態設置reducer的數量?
similary如何根據我的映射器輸出大小設置減速器的數量?
PS:我知道下面的選項可以用來操縱reducer的數量。 mapred.tasktracker.reduce.tasks.maximum mapred.reduce.tasks
我知道,可以通過將mapred.min.split.size設置爲dfs.block.size來基於我的dfs分割大小設置映射器的數量。如何根據我的映射器輸出大小動態設置reducer的數量?
similary如何根據我的映射器輸出大小設置減速器的數量?
PS:我知道下面的選項可以用來操縱reducer的數量。 mapred.tasktracker.reduce.tasks.maximum mapred.reduce.tasks
如果你想通過設置動態的命令行:: 你可以用下面的選項映射器和減速器的數量:
-D mapred.map.tasks = 5 -D mapred.reduce.tasks = 5
我們還可以設置映射器和減速器的驅動程序代碼的數目: job.setNumMapTasks(); job.setNumReduceTasks();
我不認爲你可以在地圖縮小作業開始後動態地改變縮減器的數量。就我所知,在作業正在運行期間不會有任何提供值的人機交互。它應該被預先配置。 Map Reduce作業是一個批處理過程(運行很長時間),所以用戶很難知道它何時會詢問用戶減速器的數量,並且在此過程中它不會被設計爲交互式的!希望你有答案!
要設置動態減速器任務的數目:
地圖的數量通常是由DFS塊在輸入文件的數量驅動的。儘管這會導致人們調整自己的DFS塊大小來調整地圖的數量。
因此,在下面的代碼中,讓我們動態調整reducer任務的數量,以便在運行時調整map任務的數量。
在Java代碼:
long defaultBlockSize = 0;
int NumOfReduce = 10; // you can set anything
long inputFileLength = 0;
try {
FileSystem fileSystem = FileSystem.get(this.getConf()); // hdfs file
// system
inputFileLength = fileSystem.getContentSummary(
new Path(PROP_HDFS_INPUT_LOCATION)).getLength();// input
// file or
// files
// stored in
// hdfs
defaultBlockSize = fileSystem.getDefaultBlockSize(new Path(
hdfsFilePath.concat("PROP_HDFS_INPUT_LOCATION")));// getting
// default
// block
// size
if (inputFileLength > 0 && defaultBlockSize > 0) {
NumOfReduce = (int) (((inputFileLength/defaultBlockSize) + 1) * 2);// calculating
// no.
// of
// blocks
}
System.out.println("NumOfReduce : " + NumOfReduce);
} catch (Exception e) {
LOGGER.error(" Exception{} ", e);
}
job.setNumReduceTasks(NumOfReduce);
這不是問題的答案 – dpolaczanski
沒有減速機能夠作業提交後未設置。 用這種方式思考 - 在映射器輸出上調用分區器,並且它需要知道分區的減速器數量。
@Merla:謝謝你的迴應。但是,如果處理數據時出現卷的差異,這些建議不會提供在作業運行期間動態更改它們的選項。 – Makubex
我不認爲在地圖縮減作業開始後,您可以動態更改縮減器的數量。據我所知,在作業正在運行期間不會有任何提供值的人機交互。應該預先配置它。 Map Reduce作業是一個批處理過程(運行很長時間),所以用戶很難知道它何時會詢問用戶減速器的數量,並且在此過程中它不會被設計爲交互式的!希望你有答案! –