2013-08-29 68 views
1

我開發了一個小型mapreduce程序。當我打開進程日誌時,我看到一個地圖和兩個減速器是由框架創建的。我只有一個文件用於輸入,並有兩個輸出文件。現在請告訴我MapReduce減速器之間的作業分配

1) Number of mapper and reducer are created by framework or it can be changed? 
2) Number of output files always equal to number of reducers? i.e. each reducer 
    creates its own output file? 
3) How one input file is distributed among mappers? And output of one mapper is 
    distributed among multiple reducers (this is done by framework or you can change)? 
4) How to manage when multiple input files are there i.e. A directory , 
    containing input files? 

請回答這些問題。我是MapReduce的初學者。

回答

4

讓我試着回答你的問題。請告訴我,無論你認爲哪裏不正確 -

1)映射器和減速器的數量是由框架創建或可以改變?

創建的映射任務總數取決於從HDFS塊中創建的邏輯拆分總數。因此,修復地圖任務的數量可能並不總是可能的,因爲不同的文件可能具有不同的大小和不同數量的總塊。因此,如果您使用的是TextInputFormat,則大致上每個邏輯分割都等於一個塊,並且不可能修復總映射任務的數量,因爲對於每個文件,可以創建不同數量的塊。

與映射器的數量不同,reducer可以修復。

2)輸出文件的數量總是等於減速器的數量?即每個減速器 創建它自己的輸出文件?

一定程度的肯定,但也有與它有可能從減速機創建多個輸出文件的方式。例如:MultipleOutputs

3)一個輸入文件如何在映射器之間分佈?並且一個映射器的輸出是在多個reducers中分配的(這是通過框架完成的,或者您可以更改)?

HDFS中的每個文件都由塊組成。這些塊被複制並可以保留在多個節點(機器)中。然後計劃地圖任務在這些塊上運行。 map任務可以運行的併發級別取決於每臺機器具有的處理器數量。 例如對於文件(如果計劃10,000個映射任務),取決於整個羣集中的處理器總數,每次只能同時運行100個映射任務。

默認的Hadoop使用HashPartitioner,其計算密鑰的哈希碼從映射器框架被髮送並將其轉換爲一個分區。

例如爲:

public int getPartition(K2 key, V2 value, 
          int numReduceTasks) { 
    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks; 
    } 

正如你可以看到上面,分區被選擇的是真實基於所述散列碼固定減速器的總數目。所以,如果你numReduceTask = 4,則返回值將是3 0〜

4)如何管理當多個輸入文件,即有一個目錄, 包含輸入文件?

的Hadoop支持由多個文件作爲輸入到一個工作目錄。

+0

@Fakhar,請打電話給我,如果事情還不清楚。 –

0

作爲由「SSaikia_JtheRocker」映射器任務解釋,按照其在HDFS塊中的邏輯分割的總數創建。 我想添加一些問題#3「怎麼一個輸入文件映射器中分配?和一個映射器的輸出多個減速之間的分佈(這是由框架完成,或者你可以改變)?」 例如,考慮其計算如下所示在一個文件中的單詞數我的字計數程序:

公共類WCMapper擴展映射{

@Override 
public void map(LongWritable key, Text value, Context context) // Context context is output 
     throws IOException, InterruptedException { 

    // value = "How Are You" 
    String line = value.toString(); // This is converting the Hadoop's "How Are you" to Java compatible "How Are You" 

    StringTokenizer tokenizer = new StringTokenizer (line); // StringTokenizer returns an array tokenizer = {"How", "Are", "You"} 

    while (tokenizer.hasMoreTokens()) // hasMoreTokens is a method in Java which returns boolean values 'True' or 'false' 
    { 
     value.set(tokenizer.nextToken()); // value's values are overwritten with "How" 
     context.write(value, new IntWritable(1)); // writing the current context to local disk 
     // How, 1 
     // Are, 1 
     // You, 1 
     // Mapper will run as many times as the number of lines 
    } 
} 

}

所以在上述方案中,行「你好」是的StringTokenizer分成3個字,並在while循環中使用這個時候,映射器被稱爲多次的單詞數,所以這裏3映射器調用。

,減速機,我們可以指定像我們多少減速要在使用中產生了輸出「job.setNumReduceTasks(5);」聲明。下面的代碼片段會給你一個想法。

公共類BooksMain {

public static void main(String[] args) throws Exception { 
    Configuration conf = new Configuration(); 
    // Use programArgs array to retrieve program arguments. 
    String[] programArgs = new GenericOptionsParser(conf, args) 
      .getRemainingArgs(); 
    Job job = new Job(conf); 
    job.setJarByClass(BooksMain.class); 
    job.setMapperClass(BookMapper.class); 
    job.setReducerClass(BookReducer.class); 
    job.setNumReduceTasks(5); 

// job.setCombinerClass(BookReducer.class);

job.setOutputKeyClass(Text.class); 
    job.setOutputValueClass(IntWritable.class); 

    // TODO: Update the input path for the location of the inputs of the map-reduce job. 
    FileInputFormat.addInputPath(job, new Path(programArgs[0])); 
    // TODO: Update the output path for the output directory of the map-reduce job. 
    FileOutputFormat.setOutputPath(job, new Path(programArgs[1])); 

    // Submit the job and wait for it to finish. 
    job.waitForCompletion(true); 
    // Submit and return immediately: 
    // job.submit(); 
} 

}