<?xml version="1.0"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" "http://forrest.apache.org/dtd/document-v20.dtd">

<document>
  
  <header>
    <title>MapReduce Tutorial</title>
  </header>
  
  <body>

    <section>
      <title>Purpose</title>
      
      <p>This document comprehensively describes all user-facing facets of the 
      Hadoop MapReduce framework and serves as a tutorial.
      </p>
    </section>
    
    <section>
      <title>Prerequisites</title>
      
      <p>Make sure Hadoop is installed, configured and running. See these guides:
      </p> 
      <ul>
        <li>
          <a href="ext:single-node-setup">Single Node Setup</a> for first-time users.
        </li>
        <li>
          <a href="ext:cluster-setup">Cluster Setup</a> for large, distributed clusters.
        </li>
      </ul>
    </section>
    
    <section>
      <title>Overview</title>
      
      <p>Hadoop MapReduce is a software framework for easily writing 
      applications which process vast amounts of data (multi-terabyte data-sets) 
      in-parallel on large clusters (thousands of nodes) of commodity 
      hardware in a reliable, fault-tolerant manner.</p>
      
      <p>A MapReduce <em>job</em> usually splits the input data-set into 
      independent chunks which are processed by the <em>map tasks</em> in a
      completely parallel manner. The framework sorts the outputs of the maps, 
      which are then input to the <em>reduce tasks</em>. Typically both the 
      input and the output of the job are stored in a file-system. The framework 
      takes care of scheduling tasks, monitoring them and re-executes the failed
      tasks.</p>
      
      <p>Typically the compute nodes and the storage nodes are the same, that is, 
      the MapReduce framework and the 
      <a href="http://hadoop.apache.org/hdfs/docs/current/index.html">Hadoop
        Distributed File System</a> (HDFS) 
      are running on the same set of nodes. This configuration
      allows the framework to effectively schedule tasks on the nodes where data 
      is already present, resulting in very high aggregate bandwidth across the 
      cluster.</p>
      
      <p>The MapReduce framework consists of a single master 
      <code>JobTracker</code> and one slave <code>TaskTracker</code> per 
      cluster-node. The master is responsible for scheduling the jobs' component 
      tasks on the slaves, monitoring them and re-executing the failed tasks. The 
      slaves execute the tasks as directed by the master.</p>
      
      <p>Minimally, applications specify the input/output locations and supply
      <em>map</em> and <em>reduce</em> functions via implementations of
      appropriate interfaces and/or abstract-classes. These, and other job 
      parameters, comprise the <em>job configuration</em>. The Hadoop 
      <em>job client</em> then submits the job (jar/executable etc.) and 
      configuration to the <code>JobTracker</code> which then assumes the 
      responsibility of distributing the software/configuration to the slaves, 
      scheduling tasks and monitoring them, providing status and diagnostic 
      information to the job-client.</p>
      
      <p>Although the Hadoop framework is implemented in Java<sup>TM</sup>, 
      MapReduce applications need not be written in Java.</p>
      <ul>
        <li>
          <a href="ext:api/org/apache/hadoop/streaming/package-summary">
          Hadoop Streaming</a> is a utility which allows users to create and run 
          jobs with any executables (e.g. shell utilities) as the mapper and/or 
          the reducer.
        </li>
        <li>
          <a href="ext:api/org/apache/hadoop/mapred/pipes/package-summary">
          Hadoop Pipes</a> is a <a href="http://www.swig.org/">SWIG</a>-
          compatible <em>C++ API</em> to implement MapReduce applications (non 
          JNI<sup>TM</sup> based).
        </li>
      </ul>
    </section>
    
    <section>
      <title>Inputs and Outputs</title>

      <p>The MapReduce framework operates exclusively on 
      <code>&lt;key, value&gt;</code> pairs, that is, the framework views the 
      input to the job as a set of <code>&lt;key, value&gt;</code> pairs and 
      produces a set of <code>&lt;key, value&gt;</code> pairs as the output of 
      the job, conceivably of different types.</p> 
      
      <p>The <code>key</code> and <code>value</code> classes have to be 
        serializable by the framework. Several serialization systems exists; the
        default serialization mechanism requires keys and values to implement
        the
      <a href="ext:api/org/apache/hadoop/io/writable">Writable</a> interface.
      Additionally, the <code>key</code> classes must facilitate sorting by the
      framework; a straightforward means to do so is for them to implement the
      <a href="ext:api/org/apache/hadoop/io/writablecomparable">
        WritableComparable</a> interface.
      </p>

      <p>Input and Output types of a MapReduce job:</p>
      <p>
        (input) <code>&lt;k1, v1&gt;</code> 
        -&gt; 
        <strong>map</strong> 
        -&gt; 
        <code>&lt;k2, v2&gt;</code> 
        -&gt; 
        <strong>combine*</strong> 
        -&gt; 
        <code>&lt;k2, v2&gt;</code> 
        -&gt; 
        <strong>reduce</strong> 
        -&gt; 
        <code>&lt;k3, v3&gt;</code> (output)
      </p>
      <p>Note that the combine phase may run zero or more times in this
        process.</p>
    </section>
    
    <section>
      <title>Example: WordCount v1.0</title>
      
      <p>Before we jump into the details, lets walk through an example MapReduce 
      application to get a flavour for how they work.</p>
      
      <p><code>WordCount</code> is a simple application that counts the number of
      occurences of each word in a given input set.</p>
      
      <p>This example works with a 
      pseudo-distributed (<a href="ext:single-node-setup">Single Node Setup</a>) 
     or fully-distributed (<a href="ext:cluster-setup">Cluster Setup</a>) 
      Hadoop installation.</p>   
      
      <section>
        <title>Source Code</title>

        <table>
          <tr>
            <th></th>
            <th>WordCount.java</th>
          </tr>
<tr><td>1.</td><td><code>package&nbsp;org.myorg;
</code></td></tr>
<tr><td>2.</td><td><code>
</code></td></tr>
<tr><td>3.</td><td><code>import&nbsp;java.io.IOException;
</code></td></tr>
<tr><td>4.</td><td><code>import&nbsp;java.util.*;
</code></td></tr>
<tr><td>5.</td><td><code>
</code></td></tr>
<tr><td>6.</td><td><code>import&nbsp;org.apache.hadoop.fs.Path;
</code></td></tr>
<tr><td>7.</td><td><code>import&nbsp;org.apache.hadoop.conf.*;
</code></td></tr>
<tr><td>8.</td><td><code>import&nbsp;org.apache.hadoop.io.*;
</code></td></tr>
<tr><td>9.</td><td><code>import&nbsp;org.apache.hadoop.mapreduce.*;
</code></td></tr>
<tr><td>10.</td><td><code>import&nbsp;org.apache.hadoop.mapreduce.lib.input.*;
</code></td></tr>
<tr><td>11.</td><td><code>import&nbsp;org.apache.hadoop.mapreduce.lib.output.*;
</code></td></tr>
<tr><td>12.</td><td><code>import&nbsp;org.apache.hadoop.util.*;
</code></td></tr>
<tr><td>13.</td><td><code>
</code></td></tr>
<tr><td>14.</td><td><code>public&nbsp;class&nbsp;WordCount&nbsp;extends&nbsp;Configured&nbsp;implements&nbsp;Tool&nbsp;{
</code></td></tr>
<tr><td>15.</td><td><code>
</code></td></tr>
<tr><td>16.</td><td><code>&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;class&nbsp;Map
</code></td></tr>
<tr><td>17.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extends&nbsp;Mapper&lt;LongWritable,&nbsp;Text,&nbsp;Text,&nbsp;IntWritable&gt;&nbsp;{
</code></td></tr>
<tr><td>18.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;static&nbsp;IntWritable&nbsp;one&nbsp;=&nbsp;new&nbsp;IntWritable(1);
</code></td></tr>
<tr><td>19.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Text&nbsp;word&nbsp;=&nbsp;new&nbsp;Text();
</code></td></tr>
<tr><td>20.</td><td><code>
</code></td></tr>
<tr><td>21.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;map(LongWritable&nbsp;key,&nbsp;Text&nbsp;value,&nbsp;Context&nbsp;context)
</code></td></tr>
<tr><td>22.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IOException,&nbsp;InterruptedException&nbsp;{
</code></td></tr>
<tr><td>23.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;line&nbsp;=&nbsp;value.toString();
</code></td></tr>
<tr><td>24.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringTokenizer&nbsp;tokenizer&nbsp;=&nbsp;new&nbsp;StringTokenizer(line);
</code></td></tr>
<tr><td>25.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(tokenizer.hasMoreTokens())&nbsp;{
</code></td></tr>
<tr><td>26.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;word.set(tokenizer.nextToken());
</code></td></tr>
<tr><td>27.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.write(word,&nbsp;one);
</code></td></tr>
<tr><td>28.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>29.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>30.</td><td><code>&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>31.</td><td><code>
</code></td></tr>
<tr><td>32.</td><td><code>&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;class&nbsp;Reduce
</code></td></tr>
<tr><td>33.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extends&nbsp;Reducer&lt;Text,&nbsp;IntWritable,&nbsp;Text,&nbsp;IntWritable&gt;&nbsp;{
</code></td></tr>
<tr><td>34.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;reduce(Text&nbsp;key,&nbsp;Iterable&lt;IntWritable&gt;&nbsp;values,
</code></td></tr>
<tr><td>35.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;context)&nbsp;throws&nbsp;IOException,&nbsp;InterruptedException&nbsp;{
</code></td></tr>
<tr><td>36.</td><td><code>
</code></td></tr>
<tr><td>37.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;sum&nbsp;=&nbsp;0;
</code></td></tr>
<tr><td>38.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(IntWritable&nbsp;val&nbsp;:&nbsp;values)&nbsp;{
</code></td></tr>
<tr><td>39.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;+=&nbsp;val.get();
</code></td></tr>
<tr><td>40.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>41.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.write(key,&nbsp;new&nbsp;IntWritable(sum));
</code></td></tr>
<tr><td>42.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>43.</td><td><code>&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>44.</td><td><code>
</code></td></tr>
<tr><td>45.</td><td><code>&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;run(String&nbsp;[]&nbsp;args)&nbsp;throws&nbsp;Exception&nbsp;{
</code></td></tr>
<tr><td>46.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Job&nbsp;job&nbsp;=&nbsp;new&nbsp;Job(getConf());
</code></td></tr>
<tr><td>47.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.setJarByClass(WordCount.class);
</code></td></tr>
<tr><td>48.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.setJobName(&quot;wordcount&quot;);
</code></td></tr>
<tr><td>49.</td><td><code>
</code></td></tr>
<tr><td>50.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.setOutputKeyClass(Text.class);
</code></td></tr>
<tr><td>51.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.setOutputValueClass(IntWritable.class);
</code></td></tr>
<tr><td>52.</td><td><code>
</code></td></tr>
<tr><td>53.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.setMapperClass(Map.class);
</code></td></tr>
<tr><td>54.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.setCombinerClass(Reduce.class);
</code></td></tr>
<tr><td>55.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.setReducerClass(Reduce.class);
</code></td></tr>
<tr><td>56.</td><td><code>
</code></td></tr>
<tr><td>57.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.setInputFormatClass(TextInputFormat.class);
</code></td></tr>
<tr><td>58.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.setOutputFormatClass(TextOutputFormat.class);
</code></td></tr>
<tr><td>59.</td><td><code>
</code></td></tr>
<tr><td>60.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInputFormat.setInputPaths(job,&nbsp;new&nbsp;Path(args[0]));
</code></td></tr>
<tr><td>61.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileOutputFormat.setOutputPath(job,&nbsp;new&nbsp;Path(args[1]));
</code></td></tr>
<tr><td>62.</td><td><code>
</code></td></tr>
<tr><td>63.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;success&nbsp;=&nbsp;job.waitForCompletion(true);
</code></td></tr>
<tr><td>64.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;success&nbsp;?&nbsp;0&nbsp;:&nbsp;1;
</code></td></tr>
<tr><td>65.</td><td><code>&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>66.</td><td><code>
</code></td></tr>
<tr><td>67.</td><td><code>&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;Exception&nbsp;{
</code></td></tr>
<tr><td>68.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ret&nbsp;=&nbsp;ToolRunner.run(new&nbsp;WordCount(),&nbsp;args);
</code></td></tr>
<tr><td>69.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(ret);
</code></td></tr>
<tr><td>70.</td><td><code>&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>71.</td><td><code>}
</code></td></tr>
<tr><td>72.</td><td><code>
</code></td></tr>
        </table>
      </section>
        
      <section>
        <title>Usage</title>
        
        <p>Assuming <code>HADOOP_HOME</code> is the root of the installation and 
        <code>HADOOP_VERSION</code> is the Hadoop version installed, compile 
        <code>WordCount.java</code> and create a jar:</p>
        <p>
          <code>$ mkdir wordcount_classes</code><br/>
          <code>
            $ javac -classpath
            ${HADOOP_HOME}/hadoop-core-${HADOOP_VERSION}.jar:${HADOOP_HOME}/hadoop-mapred-${HADOOP_VERSION}.jar:${HADOOP_HOME}/hadoop-hdfs-${HADOOP_VERSION}.jar
              -d wordcount_classes WordCount.java
          </code><br/>
          <code>$ jar -cvf /user/joe/wordcount.jar -C wordcount_classes/ .</code> 
        </p>
        
        <p>Assuming that:</p>
        <ul>
          <li>
            <code>/user/joe/wordcount/input</code>  - input directory in HDFS
          </li>
          <li>
            <code>/user/joe/wordcount/output</code> - output directory in HDFS
          </li>
        </ul>
        
        <p>Sample text-files as input:</p>
        <p>
          <code>$ bin/hadoop fs -ls /user/joe/wordcount/input/</code><br/>
          <code>/user/joe/wordcount/input/file01</code><br/>
          <code>/user/joe/wordcount/input/file02</code><br/>
          <br/>
          <code>$ bin/hadoop fs -cat /user/joe/wordcount/input/file01</code><br/>
          <code>Hello World Bye World</code><br/>
          <br/>
          <code>$ bin/hadoop fs -cat /user/joe/wordcount/input/file02</code><br/>
          <code>Hello Hadoop Goodbye Hadoop</code>
        </p>

        <p>Run the application:</p>
        <p>
          <code>
            $ bin/hadoop jar /user/joe/wordcount.jar org.myorg.WordCount 
              /user/joe/wordcount/input /user/joe/wordcount/output 
          </code>
        </p>

        <p>Output:</p>
        <p>
          <code>
            $ bin/hadoop fs -cat /user/joe/wordcount/output/part-r-00000
          </code>
          <br/>
          <code>Bye    1</code><br/>
          <code>Goodbye    1</code><br/>
          <code>Hadoop    2</code><br/>
          <code>Hello    2</code><br/>
          <code>World    2</code><br/>
        </p>

      </section>
      <section>
        <title>Bundling a data payload with your application</title>
        
        <p> Applications can specify a comma-separated list of paths which
        would be present in the current working directory of the task 
        using the option <code>-files</code>. The <code>-libjars</code>
        option allows applications to add jars to the classpaths of the maps
        and reduces. The option <code>-archives</code> allows them to pass 
        comma separated list of archives as arguments. These archives are 
        unarchived and a link with name of the archive is created in 
        the current working directory of tasks. The mechanism that
        provides this functionality is called the <em>distributed cache</em>.
        More details about the command line options surrounding job launching
        and control of the distributed cache are available at 
        <a href="ext:commands-manual"> Hadoop Commands Guide.</a></p>
        
        <p>Hadoop ships with some example code in a jar precompiled for you;
        one of these is (another) wordcount program. Here's an example
        invocation of the <code>wordcount</code> example with 
        <code>-libjars</code>, <code>-files</code> and <code>-archives</code>:
        <br/>
        <code> hadoop jar hadoop-examples.jar wordcount -files cachefile.txt 
        -libjars mylib.jar -archives myarchive.zip input output </code> 
         Here, myarchive.zip will be placed and unzipped into a directory 
         by the name "myarchive.zip"
        </p>
        
        <p> Users can specify a different symbolic name for 
        files and archives passed through -files and -archives option, using #.
        </p>
        
        <p> For example,
        <code> hadoop jar hadoop-examples.jar wordcount 
        -files dir1/dict.txt#dict1,dir2/dict.txt#dict2 
        -archives mytar.tgz#tgzdir input output </code>
        Here, the files dir1/dict.txt and dir2/dict.txt can be accessed by 
        tasks using the symbolic names dict1 and dict2 respectively.
        And the archive mytar.tgz will be placed and unarchived into a 
        directory by the name tgzdir.
        </p> 

        <p>The distributed cache is also described in greater detail further
        down in this tutorial.</p>
      </section>
      
      <section>
        <title>Walk-through</title>
        
        <p>This section describes the operation of the <code>WordCount</code>
        application shown earlier in this tutorial.</p> 
        
      <p>The <a href="ext:api/org/apache/hadoop/mapreduce/mapper"
          ><code>Mapper</code></a>
        implementation (lines 16-30), via the 
        <code>map</code> method (lines 21-29), processes one line at a time,
        as provided by the specified <a
          href="ext:api/org/apache/hadoop/mapreduce/lib/input/textinputformat"
          ><code>TextInputFormat</code></a> (line 57). 
        It then splits the line into tokens separated by whitespaces, via the 
        <code>StringTokenizer</code>, and emits a key-value pair of 
        <code>&lt; &lt;word&gt;, 1&gt;</code>.</p>
        
        <p>
          For the given sample input the first map emits:<br/>
          <code>&lt; Hello, 1&gt;</code><br/>
          <code>&lt; World, 1&gt;</code><br/>
          <code>&lt; Bye, 1&gt;</code><br/>
          <code>&lt; World, 1&gt;</code><br/>
        </p>
        
        <p>
          The second map emits:<br/>
          <code>&lt; Hello, 1&gt;</code><br/>
          <code>&lt; Hadoop, 1&gt;</code><br/>
          <code>&lt; Goodbye, 1&gt;</code><br/>
          <code>&lt; Hadoop, 1&gt;</code><br/>
        </p>
        
        <p>We'll learn more about the number of maps spawned for a given job, and
        how to control them in a fine-grained manner, a bit later in the 
        tutorial.</p>
        
        <p><code>WordCount</code> also specifies a <code>combiner</code> (line 
        54). Hence, the output of each map is passed through the local combiner 
        (which is same as the <a
          href="ext:api/org/apache/hadoop/mapreduce/reducer"
          ><code>Reducer</code></a>
        as per the job configuration) for local aggregation, after being
        sorted on the <em>key</em>s.</p>

        <p>
          The output of the first map:<br/>
          <code>&lt; Bye, 1&gt;</code><br/>
          <code>&lt; Hello, 1&gt;</code><br/>
          <code>&lt; World, 2&gt;</code><br/>
        </p>
        
        <p>
          The output of the second map:<br/>
          <code>&lt; Goodbye, 1&gt;</code><br/>
          <code>&lt; Hadoop, 2&gt;</code><br/>
          <code>&lt; Hello, 1&gt;</code><br/>
        </p>

        <p>The <a href="ext:api/org/apache/hadoop/mapreduce/reducer"
            ><code>Reducer</code></a>
        implementation (lines 32-43), via the
        <code>reduce</code> method (lines 34-42) just sums up the values,
        which are the occurence counts for each key (i.e. words in this
        example).
        </p>
        
        <p>
          Thus the output of the job is:<br/>
          <code>&lt; Bye, 1&gt;</code><br/>
          <code>&lt; Goodbye, 1&gt;</code><br/>
          <code>&lt; Hadoop, 2&gt;</code><br/>
          <code>&lt; Hello, 2&gt;</code><br/>
          <code>&lt; World, 2&gt;</code><br/>
        </p>
        
        <p>The <code>run</code> method specifies various facets of the job, such 
        as the input/output paths (passed via the command line), key/value 
        types, input/output formats etc., in the <a
        href="ext:api/org/apache/hadoop/mapreduce/job"><code>Job</code></a>.
        It then calls the <a
          href="ext:api/org/apache/hadoop/mapreduce/job/waitforcompletion"
          ><code>Job.waitForCompletion()</code></a> (line 63)
        to submit the job to Hadoop and monitor its progress.</p>

        <p>We'll learn more about <a
        href="ext:api/org/apache/hadoop/mapreduce/job"><code>Job</code></a>,
      <a href="ext:api/org/apache/hadoop/mapreduce/mapper"
        ><code>Mapper</code></a>,
        <a href="ext:api/org/apache/hadoop/util/tool"><code>Tool</code></a>
        and other interfaces and classes a bit later in the 
        tutorial.</p>
      </section>
    </section>
    
    <section>
      <title>MapReduce - User Interfaces</title>
      
      <p>This section provides a reasonable amount of detail on every
        user-facing aspect of the MapReduce framwork. This should help users
        implement, configure and tune their jobs in a fine-grained manner.
        However, please note that the javadoc for each class/interface remains
        the most comprehensive documentation available; this is only meant to
        be a tutorial.
      </p>
      
      <p>Let us first take the
        <a href="ext:api/org/apache/hadoop/mapreduce/mapper"
          ><code>Mapper</code></a> and
        <a href="ext:api/org/apache/hadoop/mapreduce/reducer"
          ><code>Reducer</code></a>
      classes. Applications typically extend them to provide the 
      <code>map</code> and <code>reduce</code> methods.</p>
      
      <p>We will then discuss other core classes including 
      <a href="ext:api/org/apache/hadoop/mapreduce/job"><code>Job</code></a>,
      <a href="ext:api/org/apache/hadoop/mapreduce/partitioner"
        ><code>Partitioner</code></a>,
      <a href="ext:api/org/apache/hadoop/mapreduce/mapcontext"
        ><code>Context</code></a>,
      <a href="ext:api/org/apache/hadoop/mapreduce/inputformat"
        ><code>InputFormat</code></a>,
      <a href="ext:api/org/apache/hadoop/mapreduce/outputformat"
        ><code>OutputFormat</code></a>,
      <a href="ext:api/org/apache/hadoop/mapreduce/outputcommitter"
        ><code>OutputCommitter</code></a>
      and others.</p>
      
      <p>Finally, we will wrap up by discussing some useful features of the
      framework such as the <code>DistributedCache</code>, 
      <code>IsolationRunner</code> etc.</p>

      <section>
        <title>Payload</title>
        
        <p>Applications typically extend the <code>Mapper</code> and
        <code>Reducer</code> classes to provide the <code>map</code> and 
        <code>reduce</code> methods. These form the core of the job.</p>
        
        <section>
          <title>Mapper</title>

          <p><a href="ext:api/org/apache/hadoop/mapreduce/mapper"
              ><code>Mapper</code></a>
          maps input key/value pairs to a set of
          intermediate key/value pairs.</p>
 
          <p>Maps are the individual tasks that transform input records into 
          intermediate records. The transformed intermediate records do not need
          to be of the same type as the input records. A given input pair may 
          map to zero or many output pairs.</p> 
 
          <p>The Hadoop MapReduce framework spawns one map task for each 
            <a href="ext:api/org/apache/hadoop/mapreduce/inputsplit"
              ><code>InputSplit</code></a>
          generated by the
          <a href="ext:api/org/apache/hadoop/mapreduce/inputformat"
            ><code>InputFormat</code></a>
          for the job. An <code>InputSplit</code> is a logical representation of
          a unit of input work for a map task; e.g., a filename and a byte
          range within that file to process. The <code>InputFormat</code> is
          responsible for enumerating the <code>InputSplits</code>, and
          producing a
          <a href="ext:api/org/apache/hadoop/mapreduce/recordreader"
            ><code>RecordReader</code></a>
          which will turn those
          logical work units into actual physical input records.</p>
          
          <p>Overall, <code>Mapper</code> implementations are specified in the
          <a href="ext:api/org/apache/hadoop/mapreduce/job"><code>Job</code></a>,
          a client-side class that describes the job's
          configuration and interfaces with the cluster on behalf of the
          client program. The <code>Mapper</code> itself then is instantiated
          in the running job, and is passed a <a
            href="ext:api/org/apache/hadoop/mapreduce/mapcontext"
            ><code>MapContext</code></a> object
          which it can use to configure itself. The <code>Mapper</code>
          contains a <code>run()</code> method which calls its
          <code>setup()</code>
          method once, its <code>map()</code> method for each input record,
          and finally its <code>cleanup()</code> method. All of these methods
          (including <code>run()</code> itself) can be overridden with
          your own code. If you do not override any methods (leaving even
          map as-is), it will act as the <em>identity function</em>, emitting
          each input record as a separate output.</p>

          <p>The <code>Context</code> object allows the mapper to interact
          with the rest of the Hadoop system. It includes configuration
          data for the job, as well as interfaces which allow it to emit
          output. The <code>getConfiguration()</code> method returns a
          <a href="ext:api/org/apache/hadoop/conf/configuration">
          <code>Configuration</code></a> which contains configuration data
          for your program. You can set arbitrary (key, value) pairs of
          configuration data in your <code>Job</code>, e.g. with
          <code>Job.getConfiguration().set("myKey", "myVal")</code>,
          and then retrieve this data in your mapper with
          <code>Context.getConfiguration().get("myKey")</code>. This sort of
          functionality is typically done in the Mapper's
          <a href="ext:api/org/apache/hadoop/mapreduce/mapper/setup"
            ><code>setup()</code></a>
          method.</p>

          <p>The
            <a href="ext:api/org/apache/hadoop/mapreduce/mapper/run"
              ><code>Mapper.run()</code></a>
          method then calls 
          <code>map(KeyInType, ValInType, Context)</code> for 
          each key/value pair in the <code>InputSplit</code> for that task.
          Note that in the WordCount program's map() method, we then emit
          our output data via the <code>Context</code> argument, using its
          <code>write()</code> method.
          </p>

          <p>Applications can then override the Mapper's
            <a href="ext:api/org/apache/hadoop/mapreduce/mapper/cleanup"
              ><code>cleanup()</code></a>
          method to perform any required teardown operations.</p>

          <p>Output pairs do not need to be of the same types as input pairs. A 
          given input pair may map to zero or many output pairs.  Output pairs 
          are collected with calls to
          <a href="ext:api/org/apache/hadoop/mapreduce/taskinputoutputcontext/write"
            ><code>Context.write(KeyOutType, ValOutType)</code></a>.</p>

          <p>Applications can also use the <code>Context</code> to report 
          progress, set application-level status messages and update 
          <code>Counters</code>, or just indicate that they are alive.</p>
 
          <p>All intermediate values associated with a given output key are 
          subsequently grouped by the framework, and passed to the
          <code>Reducer</code>(s) to  determine the final output. Users can 
          control the grouping by specifying a <code>Comparator</code> via 
          <a
            href="ext:api/org/apache/hadoop/mapreduce/job/setgroupingcomparatorclass"
            ><code>Job.setGroupingComparatorClass(Class)</code></a>.
          If a grouping comparator is not specified, then all values with the
          same key will be presented by an unordered <code>Iterable</code> to
          a call to the <code>Reducer.reduce()</code> method.</p>

          <p>The <code>Mapper</code> outputs are sorted and
          partitioned per <code>Reducer</code>. The total number of partitions is 
          the same as the number of reduce tasks for the job. Users can control 
          which keys (and hence records) go to which <code>Reducer</code> by 
          implementing a custom
          <a href="ext:api/org/apache/hadoop/mapreduce/partitioner"
            ><code>Partitioner</code></a>.</p>
 
          <p>Users can optionally specify a <code>combiner</code>, via 
          <a
            href="ext:api/org/apache/hadoop/mapreduce/job/setcombinerclass"
            ><code>Job.setCombinerClass(Class)</code></a>,
          to perform local aggregation of 
          the intermediate outputs, which helps to cut down the amount of data 
          transferred from the <code>Mapper</code> to the <code>Reducer</code>.
          </p>
 
          <p>The intermediate, sorted outputs are always stored in a simple 
          (key-len, key, value-len, value) format. 
          Applications can control if, and how, the 
          intermediate outputs are to be compressed and the 
          <a href="ext:api/org/apache/hadoop/io/compress/compressioncodec">
          CompressionCodec</a> to be used via the <code>Job</code>.
          </p>
          
          <section>
            <title>How Many Maps?</title>
             
            <p>The number of maps is usually driven by the total size of the 
            inputs, that is, the total number of blocks of the input files.</p>
  
            <p>The right level of parallelism for maps seems to be around 10-100 
            maps per-node, although it has been set up to 300 maps for very 
            cpu-light map tasks. Task setup takes awhile, so it is best if the 
            maps take at least a minute to execute.</p>
 
            <p>Thus, if you expect 10TB of input data and have a blocksize of 
              <code>128MB</code>, you'll end up with 82,000 maps, unless the
              <code>mapreduce.job.maps</code> parameter
            (which only provides a hint to the
            framework) is used to set it even higher. Ultimately, the number
            of tasks is controlled by the number of splits returned by the
            <a
              href="ext:api/org/apache/hadoop/mapreduce/inputformat/getsplits"
              ><code>InputFormat.getSplits()</code></a> method (which you can
            override).
            </p>
          </section>
        </section>
        
        <section>
          <title>Reducer</title>
          
          <p><a href="ext:api/org/apache/hadoop/mapreduce/reducer"
              ><code>Reducer</code></a>
          reduces a set of intermediate values which
          share a key to a (usually smaller) set of values.</p>
          
          <p>The number of reduces for the job is set by the user via <a
              href="ext:api/org/apache/hadoop/mapreduce/job/setnumreducetasks"
              ><code>Job.setNumReduceTasks(int)</code></a>.</p>
          
          <p>The API of <code>Reducer</code> is very similar to that of
          <code>Mapper</code>; there's a <a
            href="ext:api/org/apache/hadoop/mapreduce/reducer/run"
            ><code>run()</code></a> method that receives
          a <a href="ext:api/org/apache/hadoop/mapreduce/reducecontext"
            ><code>Context</code></a> containing the job's configuration as
          well as interfacing methods that return data from the reducer itself
          back to the framework. The <code>run()</code> method calls <a
            href="ext:api/org/apache/hadoop/mapreduce/reducer/setup"
            ><code>setup()</code></a> once,
          <a href="ext:api/org/apache/hadoop/mapreduce/reducer/reduce"
            ><code>reduce()</code></a> once for each key associated with the
          reduce task, and <a
            href="ext:api/org/apache/hadoop/mapreduce/reducer/cleanup"
            ><code>cleanup()</code></a>
          once at the end. Each of these methods
          can access the job's configuration data by using
          <code>Context.getConfiguration()</code>.</p>

          <p>As in <code>Mapper</code>, any or all of these methods can be
          overridden with custom implementations. If none of these methods are
          overridden, the default reducer operation is the identity function;
          values are passed through without further processing.</p>

          <p>The heart of <code>Reducer</code> is its <code>reduce()</code>
          method. This is called once per key; the second argument is an
          <code>Iterable</code> which returns all the values associated with
          that key. In the WordCount example, this is all of the 1's or other
          partial counts associated with a given word. The Reducer should
          emit its final output (key, value) pairs with the
          <code>Context.write()</code> method. It may emit 0, 1, or more
          (key, value) pairs for each input.</p>

          <p><code>Reducer</code> has 3 primary phases: shuffle, sort and reduce.
          </p>
          
          <section>
            <title>Shuffle</title>
   
            <p>Input to the <code>Reducer</code> is the sorted output of the
            mappers. In this phase the framework fetches the relevant partition 
            of the output of all the mappers, via HTTP.</p>
          </section>
   
          <section>
            <title>Sort</title>
   
            <p>The framework groups <code>Reducer</code> inputs by keys (since 
            different mappers may have output the same key) in this stage.</p>
   
            <p>The shuffle and sort phases occur simultaneously; while 
            map-outputs are being fetched they are merged.</p>
      
            <section>
              <title>Secondary Sort</title>
   
              <p>If equivalence rules for grouping the intermediate keys are 
              required to be different from those for grouping keys before 
              reduction, then one may specify a <code>Comparator</code> via 
              <a
                href="ext:api/org/apache/hadoop/mapreduce/job/setgroupingcomparatorclass"
                >Job.setGroupingComparatorClass(Class)</a>. Since this
              can be used to control how intermediate keys are grouped, these
              can be used in conjunction to simulate <em>secondary sort on
              values</em>.</p>
            </section>
          </section>
   
          <section>   
            <title>Reduce</title>
   
            <p>In this phase the 
              <a href="ext:api/org/apache/hadoop/mapreduce/reducer/reduce"
                ><code>reduce(MapOutKeyType,
            Iterable&lt;MapOutValType&gt;, Context)</code></a>
            method is called for each <code>&lt;key, (list of
            values)&gt;</code> pair in the grouped inputs.</p>

            <p>The output of the reduce task is typically written to the 
            <a href="ext:api/org/apache/hadoop/fs/filesystem">
            FileSystem</a> via 
            <code>Context.write(ReduceOutKeyType, ReduceOutValType)</code>.</p>
   
            <p>Applications can use the <code>Context</code> to report 
            progress, set application-level status messages and update 
            <a href="ext:api/org/apache/hadoop/mapreduce/counters"
              ><code>Counters</code></a>,
            or just indicate that they are alive.</p>
 
           <p>The output of the <code>Reducer</code> is <em>not sorted</em>.</p>
          </section>
          
          <section>
            <title>How Many Reduces?</title>
 
            <p>The right number of reduces seems to be <code>0.95</code> or 
            <code>1.75</code> multiplied by (&lt;<em>no. of nodes</em>&gt; * 
            <code>mapreduce.tasktracker.reduce.tasks.maximum</code>).</p>
 
            <p>With <code>0.95</code> all of the reduces can launch immediately 
            and start transfering map outputs as the maps finish. With 
            <code>1.75</code> the faster nodes will finish their first round of 
            reduces and launch a second wave of reduces doing a much better job 
            of load balancing.</p>
 
            <p>Increasing the number of reduces increases the framework
            overhead, but increases load balancing and lowers the cost of
            failures.</p>
 
            <p>The scaling factors above are slightly less than whole numbers to 
            reserve a few reduce slots in the framework for speculative-tasks
            and failed tasks.</p>
          </section>
          
          <section>
            <title>Reducer NONE</title>
            
            <p>It is legal to set the number of reduce-tasks to <em>zero</em> if 
            no reduction is desired.</p>
 
            <p>In this case the outputs of the map-tasks go directly to the
            <code>FileSystem</code>, into the output path set by 
            <a href="ext:api/org/apache/hadoop/mapreduce/lib/output/fileoutputformat/setoutputpath">
            setOutputPath(Path)</a>. The framework does not sort the 
            map-outputs before writing them out to the <code>FileSystem</code>.
            </p>
          </section>

          <section>
            <title>Mark-Reset</title>

            <p>While applications iterate through the values for a given key, it
              is possible to mark the current position and later reset the
              iterator to this position and continue the iteration process.
              The corresponding methods are <code>mark()</code> and
              <code>reset()</code>. 
            </p>

            <p><code>mark()</code> and <code>reset()</code> can be called any
            number of times during the iteration cycle. The <code>reset()</code>
            method will reset the iterator to the last record before a call to
            the previous <code>mark()</code>.
            </p>

            <p>This functionality is available only with the new context based
               reduce iterator.
            </p>

            <p> The following code snippet demonstrates the use of this 
                functionality.
            </p>
           
            <section>
            <title>Source Code</title>

            <table>
            <tr><td>
            <code>
              public void reduce(IntWritable key, 
                Iterable&lt;IntWritable&gt; values,
                Context context) throws IOException, InterruptedException {
            </code>
            </td></tr>

            <tr><td></td></tr>

            <tr><td>
            <code>
                &nbsp;&nbsp;
                MarkableIterator&lt;IntWritable&gt; mitr = 
                  new MarkableIterator&lt;IntWritable&gt;(values.iterator());
            </code>
            </td></tr>

            <tr><td></td></tr>

            <tr><td>
            <code>
                &nbsp;&nbsp;
                // Mark the position
            </code>
            </td></tr>

            <tr><td>
            <code>
                &nbsp;&nbsp;
                mitr.mark();
            </code>
            </td></tr>

            <tr><td></td></tr>

            <tr><td>
            <code>
                &nbsp;&nbsp;
                while (mitr.hasNext()) {
            </code>
            </td></tr>

            <tr><td>
            <code>
                  &nbsp;&nbsp;&nbsp;&nbsp;
                  i = mitr.next();
            </code>
            </td></tr>

            <tr><td>
            <code>
                  &nbsp;&nbsp;&nbsp;&nbsp;
                  // Do the necessary processing
            </code>
            </td></tr>

            <tr><td>
            <code>
                &nbsp;&nbsp;
                }
            </code>
            </td></tr>

            <tr><td></td></tr>

            <tr><td>
            <code>
                &nbsp;&nbsp;
                // Reset
            </code>
            </td></tr>

            <tr><td>
            <code>
                &nbsp;&nbsp;
                mitr.reset();
            </code>
            </td></tr>

            <tr><td></td></tr>

            <tr><td>
            <code>
                &nbsp;&nbsp;
                // Iterate all over again. Since mark was called before the first
            </code>
            </td></tr>

            <tr><td>
            <code>
                &nbsp;&nbsp;
                // call to mitr.next() in this example, we will iterate over all
            </code>
            </td></tr>

            <tr><td>
            <code>
                &nbsp;&nbsp;
                // the values now
            </code>
            </td></tr>

            <tr><td>
            <code>
                &nbsp;&nbsp;
                while (mitr.hasNext()) {
            </code>
            </td></tr>

            <tr><td>
            <code>
                  &nbsp;&nbsp;&nbsp;&nbsp;
                  i = mitr.next();
            </code>
            </td></tr>

            <tr><td>
            <code>
                  &nbsp;&nbsp;&nbsp;&nbsp;
                  // Do the necessary processing
            </code>
            </td></tr>

            <tr><td>
            <code>
                &nbsp;&nbsp;
                }
            </code>
            </td></tr>

            <tr><td></td></tr>

            <tr><td>
            <code>
              }
            </code>
            </td></tr>

            </table>
          </section>

          </section>
        </section>
        
        <section>
          <title>Partitioner</title>
          
          <p><a href="ext:api/org/apache/hadoop/mapreduce/partitioner"><code>
          Partitioner</code></a> partitions the key space.</p>

          <p>Partitioner controls the partitioning of the keys of the 
          intermediate map-outputs. The key (or a subset of the key) is used to 
          derive the partition, typically by a <em>hash function</em>. The total 
          number of partitions is the same as the number of reduce tasks for the 
          job. Hence this controls which of the <code>m</code> reduce tasks the 
          intermediate key (and hence the record) is sent to for reduction.</p>
          
          <p><a
          href="ext:api/org/apache/hadoop/mapreduce/lib/partition/hashpartitioner"
          ><code>HashPartitioner</code></a> is the default
          <code>Partitioner</code>.</p>
        </section>
        
        <section>
          <title>Reporting Progress</title>
        
          <p>Via the mapper or reducer's Context, MapReduce applications can
          report progress, set application-level status messages and update 
          <a href="ext:api/org/apache/hadoop/mapreduce/counters"
            ><code>Counters</code></a>.</p>
 
          <p><code>Mapper</code> and <code>Reducer</code> implementations can
          use the <code>Context</code> to report progress or just indicate 
          that they are alive. In scenarios where the application takes a
          significant amount of time to process individual key/value pairs, 
          this is crucial since the framework might assume that the task has 
          timed-out and kill that task. Another way to avoid this is to 
          set the configuration parameter <code>mapreduce.task.timeout</code>
          to a high-enough value (or even set it to <em>zero</em> for no
          time-outs).
          </p>

          <p>Applications can also update <code>Counters</code> using the 
          <code>Context</code>.</p>
        </section>
      
        <p>Hadoop MapReduce comes bundled with a 
        library of generally useful mappers, reducers, and partitioners
        in the <a
        href="ext:api/org/apache/hadoop/mapreduce/lib/package-summary"
        ><code>org.apache.hadoop.mapreduce.lib</code></a> package.</p>
      </section>
      
      <section>
        <title>Job Configuration</title>
        
        <p>The <code>Job</code> represents a MapReduce job configuration.
        The actual state for this object is written to an underlying instance of
        <a href="ext:api/org/apache/hadoop/conf/configuration"
        >Configuration</a>.</p>
 
        <p><a href="ext:api/org/apache/hadoop/mapreduce/job"
        ><code>Job</code></a> is the primary interface for a user to describe
        a MapReduce job to the Hadoop framework for execution. The framework 
        tries to faithfully execute the job as described by <code>Job</code>, 
        however:</p> 
        <ul>
          <li>
            Some configuration parameters may have been marked as 
            <a href="ext:api/org/apache/hadoop/conf/configuration/final_parameters">
            final</a> by administrators and hence cannot be altered.
          </li>
          <li>
            While some job parameters are straight-forward to set (e.g. 
            <code>setNumReduceTasks(int)</code>), other parameters interact
            subtly with  the rest of the framework and/or job configuration
            and are more complex to set (e.g. <code>mapreduce.job.maps</code>).
          </li>
        </ul>
 
        <p>The <code>Job</code> is typically used to specify the 
        <code>Mapper</code>, combiner (if any), <code>Partitioner</code>, 
        <code>Reducer</code>, <code>InputFormat</code>, 
        <code>OutputFormat</code> and <code>OutputCommitter</code> 
        implementations. <code>Job</code> also 
        indicates the set of input files 
        (<a href="ext:api/org/apache/hadoop/mapreduce/lib/input/fileinputformat/setinputpaths">setInputPaths(Job, Path...)</a>
        /<a href="ext:api/org/apache/hadoop/mapreduce/lib/input/fileinputformat/addinputpath">addInputPath(Job, Path)</a>)
        and (<a
        href="ext:api/org/apache/hadoop/mapreduce/lib/input/fileinputformat/setinputpathstring">setInputPaths(Job, String)</a>
        /<a
        href="ext:api/org/apache/hadoop/mapreduce/lib/input/fileinputformat/addinputpathstring">addInputPaths(Job, String)</a>)
        and where the output files should be written
        (<a href="ext:api/org/apache/hadoop/mapreduce/lib/output/fileoutputformat/setoutputpath">setOutputPath(Path)</a>).</p>

        <p>Optionally, <code>Job</code> is used to specify other advanced 
        facets of the job such as the <code>Comparator</code> to be used, files 
        to be put in the <code>DistributedCache</code>, whether intermediate 
        and/or job outputs are to be compressed (and how), debugging via 
        user-provided scripts,
        whether job tasks can be executed in a <em>speculative</em> manner 
        (<a
          href="ext:api/org/apache/hadoop/mapreduce/job/setmapspeculativeexecution"
          >setMapSpeculativeExecution(boolean)</a>)/(<a
          href="ext:api/org/apache/hadoop/mapreduce/job/setreducespeculativeexecution"
          >setReduceSpeculativeExecution(boolean)</a>)
        , maximum number of attempts per task
        (<a
          href="ext:api/org/apache/hadoop/mapreduce/job/setmaxmapattempts"
          >setMaxMapAttempts(int)</a>/<a
          href="ext:api/org/apache/hadoop/mapreduce/job/setmaxreduceattempts"
          >setMaxReduceAttempts(int)</a>) 
        , percentage of tasks failure which can be tolerated by the job
        (Job.getConfiguration().setInt(Job.MAP_FAILURES_MAX_PERCENT,
        int)/Job.getConfiguration().setInt(Job.REDUCE_FAILURES_MAX_PERCENT,
        int)), etc.</p>
        
        <p>Of course, users can use <code>Job.getConfiguration()</code> to get
        access to the underlying configuration state, and can then use
        <a href="ext:api/org/apache/hadoop/conf/configuration/set">set(String,
          String)</a>/<a href="ext:api/org/apache/hadoop/conf/configuration/get"
          >get(String, String)</a>
        to set/get arbitrary parameters needed by applications. However, use the 
        <code>DistributedCache</code> for large amounts of (read-only) data.</p>
      </section>

      <section>
        <title>Task Execution &amp; Environment</title>

        <p>The <code>TaskTracker</code> executes the <code>Mapper</code>/ 
        <code>Reducer</code>  <em>task</em> as a child process in a separate jvm.
        </p>
        
        <p>The child-task inherits the environment of the parent 
        <code>TaskTracker</code>. The user can specify additional options to the
        child-jvm via the <code>mapred.{map|reduce}.child.java.opts</code> 
        configuration parameter in the job configuration such as non-standard 
         paths for the run-time linker to search shared libraries via 
        <code>-Djava.library.path=&lt;&gt;</code> etc. If the 
        <code>mapred.{map|reduce}.child.java.opts</code> parameters contains the 
        symbol <em>@taskid@</em> it is interpolated with value of 
        <code>taskid</code> of the MapReduce task.</p>
        
        <p>Here is an example with multiple arguments and substitutions, 
        showing jvm GC logging, and start of a passwordless JVM JMX agent so that
        it can connect with jconsole and the likes to watch child memory, 
        threads and get thread dumps. It also sets the maximum heap-size of the 
        map and reduce child jvm to 512MB &amp; 1024MB respectively. It also 
        adds an additional path to the <code>java.library.path</code> of the 
        child-jvm.</p>

        <p>
          <code>&lt;property&gt;</code><br/>
          &nbsp;&nbsp;<code>&lt;name&gt;mapreduce.map.java.opts&lt;/name&gt;</code><br/>
          &nbsp;&nbsp;<code>&lt;value&gt;</code><br/>
          &nbsp;&nbsp;&nbsp;&nbsp;<code>
                    -Xmx512M -Djava.library.path=/home/mycompany/lib
                    -verbose:gc -Xloggc:/tmp/@taskid@.gc</code><br/>
          &nbsp;&nbsp;&nbsp;&nbsp;<code>
                    -Dcom.sun.management.jmxremote.authenticate=false 
                    -Dcom.sun.management.jmxremote.ssl=false</code><br/>
          &nbsp;&nbsp;<code>&lt;/value&gt;</code><br/>
          <code>&lt;/property&gt;</code>
        </p>
        
        <p>
          <code>&lt;property&gt;</code><br/>
          &nbsp;&nbsp;<code>&lt;name&gt;mapreduce.reduce.java.opts&lt;/name&gt;</code><br/>
          &nbsp;&nbsp;<code>&lt;value&gt;</code><br/>
          &nbsp;&nbsp;&nbsp;&nbsp;<code>
                    -Xmx1024M -Djava.library.path=/home/mycompany/lib
                    -verbose:gc -Xloggc:/tmp/@taskid@.gc</code><br/>
          &nbsp;&nbsp;&nbsp;&nbsp;<code>
                    -Dcom.sun.management.jmxremote.authenticate=false 
                    -Dcom.sun.management.jmxremote.ssl=false</code><br/>
          &nbsp;&nbsp;<code>&lt;/value&gt;</code><br/>
          <code>&lt;/property&gt;</code>
        </p>
        
        <section>
         <title>Configuring Memory Requirements For A Job</title>
         
         <p>
         MapReduce tasks are launched with some default memory limits
         that are provided by the system or by the cluster's administrators.
         Memory intensive jobs might need to use more than these default
         values. Hadoop has some configuration options that allow these to 
         be changed.
         Without such modifications, memory intensive jobs could fail due
         to <code>OutOfMemory</code> errors in tasks or could get killed
         when the limits are enforced by the system. This section describes
         the various options that can be used to configure specific
         memory requirements.
         </p>
          
         <ul>
         
           <li>
           <code>mapreduce.{map|reduce}.java.opts</code>: If the task
           requires more Java heap space, this option must be used. The
           value of this option should pass the desired heap using the JVM
           option -Xmx. For example, to use 1G of heap space, the option
           should be passed in as -Xmx1024m. Note that other JVM options
           are also passed using the same option. Hence, append the
           heap space option along with other options already configured.
           </li>
         
           <li>
           <code>mapreduce.{map|reduce}.ulimit</code>: The slaves where
           tasks are run could be configured with a ulimit value that
           applies a limit to every process that is launched on the slave.
           If the task, or any child that the task launches (like in
           streaming), requires more than the configured limit, this option
           must be used. The value is given in kilobytes. For example, to
           increase the ulimit to 1G, the option should be set to 1048576.
           Note that this value is a per process limit. Since it applies 
           to the JVM as well, the heap space given to the JVM through 
           the <code>mapreduce.{map|reduce}.java.opts</code> should be less
           than the value configured for the ulimit. Otherwise the JVM
           will not start.
           </li>
           
           <li>
           <code>mapreduce.{map|reduce}.memory.mb</code>: In some 
           environments, administrators might have configured a total limit
           on the virtual memory used by the entire process tree for a task, 
           including all processes launched recursively by the task or 
           its children, like in streaming. More details about this can be
           found in the section on 
           <a href="ext:cluster-setup/ConfiguringMemoryParameters">
           Monitoring Task Memory Usage</a> in the Cluster SetUp guide.
           If a task requires more virtual memory for its entire tree, 
           this option 
           must be used. The value is given in MB. For example, to set 
           the limit to 1G, the option should be set to 1024. Note that this 
           value does not automatically influence the per process ulimit or 
           heap space. Hence, you may need to set those parameters as well 
           (as described above) in order to give your tasks the right amount 
           of memory.
           </li>
          
           <li>
           <code>mapreduce.{map|reduce}.memory.physical.mb</code>: 
           This parameter is similar to 
           <code>mapreduce.{map|reduce}.memory.mb</code>, except it specifies
           how much physical memory is required by a task for its entire
           tree of processes. The parameter is applicable if administrators
           have configured a total limit on the physical memory used by
           all MapReduce tasks.
           </li>
 
         </ul>
         
         <p>
         As seen above, each of the options can be specified separately for
         map and reduce tasks. It is typically the case that the different
         types of tasks have different memory requirements. Hence different
         values can be set for the corresponding options.
         </p>
         
         <p>
         The memory available to some parts of the framework is also
         configurable. In map and reduce tasks, performance may be influenced
         by adjusting parameters influencing the concurrency of operations and
         the frequency with which data will hit disk. Monitoring the filesystem
         counters for a job- particularly relative to byte counts from the map
         and into the reduce- is invaluable to the tuning of these
         parameters.
         </p>
           
         <p>
         Note: The memory related configuration options described above 
         are used only for configuring the launched child tasks from the 
         tasktracker. Configuring the memory options for daemons is documented 
         under
         <a href="ext:cluster-setup/ConfiguringEnvironmentHadoopDaemons">
         Configuring the Environment of the Hadoop Daemons</a> (Cluster Setup).
         </p>
          
        </section>

        <section>
          <title>Map Parameters</title>

          <p>A record emitted from a map and its metadata will be serialized
          into a buffer. As described in the following options, when the record
          data exceed a threshold, the contents of this buffer will be sorted
          and written to disk in the background (a "spill") while the map
          continues to output records. If the remainder of the buffer fills
          during the spill, the map thread will block. When the map is
          finished, any buffered records are written to disk and all on-disk
          segments are merged into a single file. Minimizing the number of
          spills to disk <em>can</em> decrease map time, but a larger buffer
          also decreases the memory available to the mapper.</p>

          <table>
            <tr><th>Name</th><th>Type</th><th>Description</th></tr>
            <tr><td>mapreduce.task.io.sort.mb</td><td>int</td>
                <td>The cumulative size of the serialization and accounting
                buffers storing records emitted from the map, in megabytes.
                </td></tr>
            <tr><td>mapreduce.map.sort.spill.percent</td><td>float</td>
                <td>This is the threshold for the accounting and serialization
                buffer. When this percentage of the <code>io.sort.mb</code> has
                filled, its contents will be spilled to disk in the background.
                Note that a higher value may decrease the number of- or even
                eliminate- merges, but will also increase the probability of
                the map task getting blocked. The lowest average map times are
                usually obtained by accurately estimating the size of the map
                output and preventing multiple spills.</td></tr>
          </table>

          <p>Other notes</p>
          <ul>
            <li>If the spill threshold is exceeded while a spill is in
            progress, collection will continue until the spill is finished. For
            example, if <code>mapreduce.map.sort.spill.percent</code> is set to
            0.33, and the remainder of the buffer is filled while the spill
            runs, the next spill will include all the collected records, or
            0.66 of the buffer, and will not generate additional spills. In
            other words, the thresholds are defining triggers, not
            blocking.</li>
            <li>A record larger than the serialization buffer will first
            trigger a spill, then be spilled to a separate file. It is
            undefined whether or not this record will first pass through the
            combiner.</li>
          </ul>
        </section>

        <section>
          <title>Shuffle/Reduce Parameters</title>

          <p>As described previously, each reduce fetches the output assigned
          to it by the Partitioner via HTTP into memory and periodically
          merges these outputs to disk. If intermediate compression of map
          outputs is turned on, each output is decompressed into memory. The
          following options affect the frequency of these merges to disk prior
          to the reduce and the memory allocated to map output during the
          reduce.</p>

          <table>
            <tr><th>Name</th><th>Type</th><th>Description</th></tr>
            <tr><td>mapreduce.task.io.sort.factor</td><td>int</td>
                <td>Specifies the number of segments on disk to be merged at
                the same time. It limits the number of open files and
                compression codecs during the merge. If the number of files
                exceeds this limit, the merge will proceed in several passes.
                Though this limit also applies to the map, most jobs should be
                configured so that hitting this limit is unlikely
                there.</td></tr>
            <tr><td>mapreduce.reduce.merge.inmem.threshold</td><td>int</td>
                <td>The number of sorted map outputs fetched into memory
                before being merged to disk. Like the spill thresholds in the
                preceding note, this is not defining a unit of partition, but
                a trigger. In practice, this is usually set very high (1000)
                or disabled (0), since merging in-memory segments is often
                less expensive than merging from disk (see notes following
                this table). This threshold influences only the frequency of
                in-memory merges during the shuffle.</td></tr>
            <tr><td>mapreduce.reduce.shuffle.merge.percent</td><td>float</td>
                <td>The memory threshold for fetched map outputs before an
                in-memory merge is started, expressed as a percentage of
                memory allocated to storing map outputs in memory. Since map
                outputs that can't fit in memory can be stalled, setting this
                high may decrease parallelism between the fetch and merge.
                Conversely, values as high as 1.0 have been effective for
                reduces whose input can fit entirely in memory. This parameter
                influences only the frequency of in-memory merges during the
                shuffle.</td></tr>
            <tr><td>mapreduce.reduce.shuffle.input.buffer.percent</td><td>float</td>
                <td>The percentage of memory- relative to the maximum heapsize
                as typically specified in <code>mapreduce.reduce.java.opts</code>-
                that can be allocated to storing map outputs during the
                shuffle. Though some memory should be set aside for the
                framework, in general it is advantageous to set this high
                enough to store large and numerous map outputs.</td></tr>
            <tr><td>mapreduce.reduce.input.buffer.percent</td><td>float</td>
                <td>The percentage of memory relative to the maximum heapsize
                in which map outputs may be retained during the reduce. When
                the reduce begins, map outputs will be merged to disk until
                those that remain are under the resource limit this defines.
                By default, all map outputs are merged to disk before the
                reduce begins to maximize the memory available to the reduce.
                For less memory-intensive reduces, this should be increased to
                avoid trips to disk.</td></tr>
          </table>

          <p>Other notes</p>
          <ul>
            <li>If a map output is larger than 25 percent of the memory
            allocated to copying map outputs, it will be written directly to
            disk without first staging through memory.</li>
            <li>When running with a combiner, the reasoning about high merge
            thresholds and large buffers may not hold. For merges started
            before all map outputs have been fetched, the combiner is run
            while spilling to disk. In some cases, one can obtain better
            reduce times by spending resources combining map outputs- making
            disk spills small and parallelizing spilling and fetching- rather
            than aggressively increasing buffer sizes.</li>
            <li>When merging in-memory map outputs to disk to begin the
            reduce, if an intermediate merge is necessary because there are
            segments to spill and at least 
            <code>mapreduce.task.io.sort.factor</code>
            segments already on disk, the in-memory map outputs will be part
            of the intermediate merge.</li>
          </ul>

        </section>

        <section>
        <title> Directory Structure </title>
        <p>The task tracker has local directory,
        <code> ${mapreduce.cluster.local.dir}/taskTracker/</code> to create
        localized cache and localized job. It can define multiple local
        directories (spanning multiple disks) and then each filename is assigned
        to a semi-random local directory. When the job starts, task tracker 
        creates a localized job directory relative to the local directory
        specified in the configuration. Thus the task tracker directory 
        structure looks as following: </p>
        <ul>
        <li><code>${mapreduce.cluster.local.dir}/taskTracker/distcache/</code> :
        The public distributed cache for the jobs of all users. This directory
        holds the localized public distributed cache. Thus localized public
        distributed cache is shared among all the tasks and jobs of all users.
        </li>
        <li><code>${mapreduce.cluster.local.dir}/taskTracker/$user/distcache/
        </code> :
        The private distributed cache for the jobs of the specific user. This
        directory holds the localized private distributed cache. Thus localized
        private distributed cache is shared among all the tasks and jobs of the
        specific user only. It is not accessible to jobs of other users.
        </li>
        <li><code>
        ${mapreduce.cluster.local.dir}/taskTracker/$user/jobcache/$jobid/
        </code> : The localized job directory
        <ul>
        <li><code>
        ${mapreduce.cluster.local.dir}/taskTracker/$user/jobcache/$jobid/work/
        </code>
        : The job-specific shared directory. The tasks can use this space as 
        scratch space and share files among them. This directory is exposed
        to the users through the configuration property  
        <code>mapreduce.job.local.dir</code>. It is available as System property
        also. So, users (streaming etc.) can call 
        <code>System.getProperty("mapreduce.job.local.dir")</code> to access the 
        directory.</li>
        <li><code>
        ${mapreduce.cluster.local.dir}/taskTracker/$user/jobcache/$jobid/jars/
        </code>
        : The jars directory, which has the job jar file and expanded jar.
        The <code>job.jar</code> is the application's jar file that is
        automatically distributed to each machine. Any library jars that are
        dependencies of the application code may be packaged inside this jar in
        a <code>lib/</code> directory.
        This directory is extracted from <code>job.jar</code> and its contents
        are automatically added to the classpath for each task.
        The job.jar location is accessible to the application through the API
        <a href="ext:api/org/apache/hadoop/mapreduce/task/jobcontextimpl/getjar"> 
        Job.getJar() </a>. To access the unjarred directory,
        Job.getJar().getParent() can be called.</li>
        <li><code>
        ${mapreduce.cluster.local.dir}/taskTracker/$user/jobcache/$jobid/job.xml
        </code>
        : The job.xml file, the generic job configuration, localized for 
        the job. </li>
        <li><code>
        ${mapreduce.cluster.local.dir}/taskTracker/$user/jobcache/$jobid/$taskid
        </code>
        : The task directory for each task attempt. Each task directory
        again has the following structure :
        <ul>
        <li><code>
        ${mapreduce.cluster.local.dir}/taskTracker/$user/jobcache/$jobid/$taskid/job.xml
        </code>
        : A job.xml file, task localized job configuration, Task localization
        means that properties have been set that are specific to
        this particular task within the job. The properties localized for 
        each task are described below.</li>
        <li><code>
        ${mapreduce.cluster.local.dir}/taskTracker/$user/jobcache/$jobid/$taskid/output
        </code>
        : A directory for intermediate output files. This contains the
        temporary map reduce data generated by the framework
        such as map output files etc. </li>
        <li><code>
        ${mapreduce.cluster.local.dir}/taskTracker/$user/jobcache/$jobid/$taskid/work
        </code>
        : The curernt working directory of the task. 
        With <a href="#Task+JVM+Reuse">jvm reuse</a> enabled for tasks, this 
        directory will be the directory on which the jvm has started</li>
        <li><code>
        ${mapreduce.cluster.local.dir}/taskTracker/$user/jobcache/$jobid/$taskid/work/tmp
        </code>
        : The temporary directory for the task. 
        (User can specify the property <code>mapreduce.task.tmp.dir</code> to set
        the value of temporary directory for map and reduce tasks. This 
        defaults to <code>./tmp</code>. If the value is not an absolute path,
        it is prepended with task's working directory. Otherwise, it is
        directly assigned. The directory will be created if it doesn't exist.
        Then, the child java tasks are executed with option
        <code>-Djava.io.tmpdir='the absolute path of the tmp dir'</code>.
        Pipes and streaming are set with environment variable,
        <code>TMPDIR='the absolute path of the tmp dir'</code>). This 
        directory is created, if <code>mapreduce.task.tmp.dir</code> has the value
        <code>./tmp</code> </li>
        </ul>
        </li>
        </ul>
        </li>
        </ul>
        </section>
        
        <section>
        <title>Task JVM Reuse</title>
        <p>Jobs can enable task JVMs to be reused by specifying the job 
        configuration <code>mapreduce.job.jvm.numtasks</code>. If the
        value is 1 (the default), then JVMs are not reused 
        (i.e. 1 task per JVM). If it is -1, there is no limit to the number
        of tasks a JVM can run (of the same job). One can also specify some
        value greater than 1 using the api 
        <code>Job.getConfiguration().setInt(Job.JVM_NUM_TASKS_TO_RUN, int)</code>.</p>
        </section>

        <section>
                <title>Configured Parameters</title>
        <p>The following properties are localized in the job configuration 
         for each task's execution: </p>
        <table>
          <tr><th>Name</th><th>Type</th><th>Description</th></tr>
          <tr><td>mapreduce.job.id</td><td>String</td><td>The job id</td></tr>
          <tr><td>mapreduce.job.jar</td><td>String</td>
              <td>job.jar location in job directory</td></tr>
          <tr><td>mapreduce.job.local.dir</td><td> String</td>
              <td> The job specific shared scratch space</td></tr>
          <tr><td>mapreduce.task.id</td><td> String</td>
              <td> The task id</td></tr>
          <tr><td>mapreduce.task.attempt.id</td><td> String</td>
              <td> The task attempt id</td></tr>
          <tr><td>mapreduce.task.ismap</td><td> boolean </td>
              <td>Is this a map task</td></tr>
          <tr><td>mapreduce.task.partition</td><td> int </td>
              <td>The id of the task within the job</td></tr>
          <tr><td>mapreduce.map.input.file</td><td> String</td>
              <td> The filename that the map is reading from</td></tr>
          <tr><td>mapreduce.map.input.start</td><td> long</td>
              <td> The offset of the start of the map input split</td></tr>
          <tr><td>mapreduce.map.input.length </td><td>long </td>
              <td>The number of bytes in the map input split</td></tr>
          <tr><td>mapreduce.task.output.dir</td><td> String </td>
              <td>The task's temporary output directory</td></tr>
        </table>

        <p>
        <strong>Note:</strong>
        During the execution of a streaming job, the names of the "mapred" parameters are transformed. 
        The dots ( . ) become underscores ( _ ).
        For example, mapreduce.job.id becomes mapreduce.job.id and mapreduce.job.jar becomes mapreduce.job.jar. 
        To get the values in a streaming job's mapper/reducer use the parameter names with the underscores.
        </p>
        </section>

        <section>
                <title>Task Logs</title>
        <p>The standard output (stdout) and error (stderr) streams of the task 
        are read by the TaskTracker and logged to 
        <code>${HADOOP_LOG_DIR}/userlogs</code></p>
         </section>

         <section>
                <title>Distributing Libraries</title>
        <p>The <a href="#DistributedCache">DistributedCache</a> can also be used
        to distribute both jars and native libraries for use in the map 
        and/or reduce tasks. The child-jvm always has its 
        <em>current working directory</em> added to the
        <code>java.library.path</code> and <code>LD_LIBRARY_PATH</code>. 
        And hence the cached libraries can be loaded via 
        <a href="http://java.sun.com/javase/6/docs/api/java/lang/System.html#loadLibrary(java.lang.String)">
        System.loadLibrary</a> or 
        <a href="http://java.sun.com/javase/6/docs/api/java/lang/System.html#load(java.lang.String)">
        System.load</a>. More details on how to load shared libraries through 
        distributed cache are documented under 
        <a href="http://hadoop.apache.org/common/docs/current/native_libraries.html#Loading+Native+Libraries+Through+DistributedCache">
        Building Native Hadoop Libraries</a>.</p>
        </section>
        <section>
          <title>Job Credentials</title>
          <p>In a secure cluster, the user is authenticated via Kerberos'
             kinit command. Because of scalability concerns, we don't push
             the client's Kerberos' tickets in MapReduce jobs. Instead, we
             acquire delegation tokens from each HDFS NameNode that the job
             will use and store them in the job as part of job submission.
             The delegation tokens are automatically obtained
             for the HDFS that holds the staging directories, where the
             job files are written, and any HDFS systems referenced by
             FileInputFormats, FileOutputFormats, DistCp, and the
             distributed cache.
             Other applications require to set the configuration
             "mapreduce.job.hdfs-servers" for all NameNodes that tasks might 
             need to talk during the job execution. This is a comma separated
             list of file system names, such as "hdfs://nn1/,hdfs://nn2/".
             These tokens are passed to the JobTracker
             as part of the job submission as <a href="http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/security/Credentials.html">Credentials</a>. </p> 

          <p>Similar to HDFS delegation tokens, we also have MapReduce delegation tokens. The
             MapReduce tokens are provided so that tasks can spawn jobs if they wish to. The tasks authenticate
             to the JobTracker via the MapReduce delegation tokens. The delegation token can
             be obtained via the API in <a href="api/org/apache/hadoop/mapred/jobclient/getdelegationtoken">
             JobClient.getDelegationToken</a>. The obtained token must then be pushed onto the
             credentials that is there in the JobConf used for job submission. The API  
             <a href="http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/security/Credentials.html#addToken(org.apache.hadoop.io.Text, org.apache.hadoop.security.token.Token)">Credentials.addToken</a>
             can be used for this. </p>

          <p>The credentials are sent to the JobTracker as part of the job submission process.
             The JobTracker persists the tokens and secrets in its filesystem (typically HDFS) 
             in a file within mapred.system.dir/JOBID. The TaskTracker localizes the file as part
             job localization. Tasks see an environment variable called
             HADOOP_TOKEN_FILE_LOCATION and the framework sets this to point to the
             localized file. In order to launch jobs from tasks or for doing any HDFS operation,
             tasks must set the configuration "mapreduce.job.credentials.binary" to point to
             this token file.</p> 

          <p>The HDFS delegation tokens passed to the JobTracker during job submission are
             are cancelled by the JobTracker when the job completes. This is the default behavior
             unless mapreduce.job.complete.cancel.delegation.tokens is set to false in the 
             JobConf. For jobs whose tasks in turn spawns jobs, this should be set to false.
             Applications sharing JobConf objects between multiple jobs on the JobClient side 
             should look at setting mapreduce.job.complete.cancel.delegation.tokens to false. 
             This is because the Credentials object within the JobConf will then be shared. 
             All jobs will end up sharing the same tokens, and hence the tokens should not be 
             canceled when the jobs in the sequence finish.</p>

          <p>Apart from the HDFS delegation tokens, arbitrary secrets can also be 
             passed during the job submission for tasks to access other third party services.
             The APIs 
             <a href="ext:api/org/apache/hadoop/mapred/jobconf/getcredentials">
             JobConf.getCredentials</a> or <a href="ext:api/org/apache/
              hadoop/mapreduce/jobcontext/getcredentials">JobContext.getCredentials()</a>
             should be used to get the credentials object and then
             <a href="http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/security/Credentials.html#addSecretKey(org.apache.hadoop.io.Text, byte[])">
             Credentials.addSecretKey</a> should be used to add secrets.</p>

          <p>For applications written using the old MapReduce API, the Mapper/Reducer classes 
             need to implement <a href="api/org/apache/hadoop/mapred/jobconfigurable">
             JobConfigurable</a> in order to get access to the credentials in the tasks.
             A reference to the JobConf passed in the 
             <a href="api/org/apache/hadoop/mapred/jobconfigurable/configure">
             JobConfigurable.configure</a> should be stored. In the new MapReduce API, 
             a similar thing can be done in the 
             <a href="api/org/apache/hadoop/mapreduce/mapper/setup">Mapper.setup</a>
             method.
             The api <a href="ext:api/org/apache/hadoop/mapred/jobconf/getcredentials">
              JobConf.getCredentials()</a> or the api <a href="ext:api/org/apache/
              hadoop/mapreduce/jobcontext/getcredentials">JobContext.getCredentials()</a>
              should be used to get the credentials reference (depending
              on whether the new MapReduce API or the old MapReduce API is used). 
              Tasks can access the secrets using the APIs in <a href="http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/security/Credentials.html">Credentials</a> </p>

             
        </section>
      </section>
      
      <section>
        <title>Job Submission and Monitoring</title>
        
        <p>The <code>Job</code>
        is the primary interface by which user-job interacts
        with the <code>JobTracker</code>.</p>
 
        <p><code>Job</code> provides facilities to submit jobs, track their 
        progress, access component-tasks' reports and logs, get the MapReduce 
        cluster's status information and so on.</p>
 
        <p>The job submission process involves:</p>
        <ol>
          <li>Checking the input and output specifications of the job.</li>
          <li>Computing the <code>InputSplit</code> values for the job.</li>
          <li>
            Setting up the requisite accounting information for the 
            <code>DistributedCache</code> of the job, if necessary.
          </li>
          <li>
            Copying the job's jar and configuration to the MapReduce system 
            directory on the <code>FileSystem</code>.
          </li>
          <li>
            Submitting the job to the <code>JobTracker</code> and optionally 
            monitoring it's status.
          </li>
        </ol>

        <p> User can view the history log summary for a given history file
        using the following command <br/>
        <code>$ bin/hadoop job -history history-file</code><br/> 
        This command will print job details, failed and killed tip
        details. <br/>
        More details about the job such as successful tasks and 
        task attempts made for each task can be viewed using the  
        following command <br/>
       <code>$ bin/hadoop job -history all history-file</code><br/></p> 
            
        <p> User can use 
        <a href="ext:api/org/apache/hadoop/mapred/outputlogfilter">OutputLogFilter</a>
        to filter log files from the output directory listing. </p>
        
        <p>Normally the user creates the application, describes various facets 
        of the job via <code>Job</code>, and then uses the 
        <code>waitForCompletion()</code> method to submit the job and monitor its progress.</p>

        <section>
          <title>Job Control</title>
 
          <p>Users may need to chain MapReduce jobs to accomplish complex
          tasks which cannot be done via a single MapReduce job. This is fairly
          easy since the output of the job typically goes to distributed 
          file-system, and the output, in turn, can be used as the input for the 
          next job.</p>
 
          <p>However, this also means that the onus on ensuring jobs are 
          complete (success/failure) lies squarely on the clients. In such 
          cases, the various job-control options are:</p>
          <ul>
            <li><a
            href="ext:api/org/apache/hadoop/mapreduce/job/waitforcompletion"><code>Job.waitForCompletion()</code></a> :
              Submits the job and returns only after the 
              job has completed.
            </li>
            <li>
              <a href="ext:api/org/apache/hadoop/mapreduce/job/submit"><code>Job.submit()</code></a> : Only submits the job;, then poll the
              other methods of <code>Job</code> such as <code>isComplete()</code>,
              <code>isSuccessful()</code>, etc.
              to query status and make scheduling decisions.
            </li>
            <li>
              <code>Job.getConfiguration().set(Job.END_NOTIFICATION_URL, String)</code>
              : Sets up a notification upon job-completion, thus avoiding polling.
            </li>
          </ul>
        </section>
        
        <section>
          <title>Job Authorization</title>
          <p>Job level authorization and queue level authorization are enabled
          on the cluster, if the configuration
          <code>mapreduce.cluster.acls.enabled</code> is set to
          true. When enabled, access control checks are done by (a) the
          JobTracker before allowing users to submit jobs to queues and
          administering these jobs and (b) by the JobTracker and the TaskTracker
          before allowing users to view job details or to modify a job using
          MapReduce APIs, CLI or web user interfaces.</p>
         
          <p>A job submitter can specify access control lists for viewing or
          modifying a job via the configuration properties
          <code>mapreduce.job.acl-view-job</code> and
          <code>mapreduce.job.acl-modify-job</code> respectively. By default, 
          nobody is given access in these properties.</p> 
          
          <p>However, irrespective of the job ACLs configured, a job's owner,
          the user who started the cluster and members of an admin configured
          supergroup (<code>mapreduce.cluster.permissions.supergroup</code>)
          and queue administrators of the queue to which the job was submitted
          to (<code>acl-administer-jobs</code>) always have access to view and
          modify a job.</p>

          <p> A job view ACL authorizes users against the configured 
          <code>mapreduce.job.acl-view-job</code> before returning possibly 
          sensitive information about a job, like: </p>
          <ul>
            <li> job level counters </li>
            <li> task level counters </li>
            <li> tasks's diagnostic information </li>
            <li> task logs displayed on the TaskTracker web UI </li>
            <li> job.xml showed by the JobTracker's web UI </li>
          </ul>
          <p>Other information about a job, like its status and its profile, 
          is accessible to all users, without requiring authorization.</p>
          
          <p> A job modification ACL authorizes users against the configured
          <code>mapreduce.job.acl-modify-job</code> before allowing
          modifications to jobs, like: </p>
          <ul>
            <li> killing a job </li>
            <li> killing/failing a task of a job </li>
            <li> setting the priority of a job </li>
          </ul>
          <p>These view and modify operations on jobs are also permitted by
          the queue level ACL, "acl-administer-jobs", configured via
          mapred-queue-acls.xml. The caller will be able to do the operation
          if he/she is part of either queue admins ACL or job modification ACL
          or the user who started the cluster or a member of an admin configured
          supergroup (<code>mapreduce.cluster.permissions.supergroup</code>).
          </p>
          
          <p>The format of a job level ACL is the same as the format for a
          queue level ACL as defined in the
          <a href ="ext:cluster-setup/ConfiguringHadoopDaemons">
          Cluster Setup</a> documentation.
          </p>
          
        </section>
      </section>

      <section>
        <title>Job Input</title>
        
        <p><a href="ext:api/org/apache/hadoop/mapreduce/inputformat">
        InputFormat</a> describes the input-specification for a MapReduce job.
        </p> 
 
        <p>The MapReduce framework relies on the <code>InputFormat</code> of 
        the job to:</p>
        <ol>
          <li>Validate the input-specification of the job.</li>
          <li>
            Split-up the input file(s) into logical <code>InputSplit</code> 
            instances, each of which is then assigned to an individual 
            <code>Mapper</code>.
          </li>
          <li>
            Provide the <code>RecordReader</code> implementation used to
            glean input records from the logical <code>InputSplit</code> for 
            processing by the <code>Mapper</code>.
          </li>
        </ol>
 
        <p>The default behavior of file-based <code>InputFormat</code>
        implementations, typically sub-classes of 
        <a href="ext:api/org/apache/hadoop/mapreduce/lib/input/fileinputformat">
        FileInputFormat</a>, is to split the input into <em>logical</em> 
        <code>InputSplit</code> instances based on the total size, in bytes, of 
        the input files. However, the <code>FileSystem</code> blocksize of the 
        input files is treated as an upper bound for input splits. A lower bound
        on the split size can be set via <code>mapreduce.input.fileinputformat.split.minsize</code>.</p>
 
        <p>Clearly, logical splits based on input-size is insufficient for many
        applications since record boundaries must be respected. In such cases, 
        the application should implement a <code>RecordReader</code>, who is 
        responsible for respecting record-boundaries and presents a 
        record-oriented view of the logical <code>InputSplit</code> to the 
        individual task.</p>

        <p><a href="ext:api/org/apache/hadoop/mapreduce/lib/input/textinputformat">
        TextInputFormat</a> is the default <code>InputFormat</code>.</p>
        
        <p>If <code>TextInputFormat</code> is the <code>InputFormat</code> for a 
        given job, the framework detects input-files with the <em>.gz</em>
        extensions and automatically decompresses them using the 
        appropriate <code>CompressionCodec</code>. However, it must be noted that
        compressed files with the above extensions cannot be <em>split</em> and 
        each compressed file is processed in its entirety by a single mapper.</p>
        
        <section>
          <title>InputSplit</title>
          
          <p><a href="ext:api/org/apache/hadoop/mapreduce/inputsplit">
          InputSplit</a> represents the data to be processed by an individual 
          <code>Mapper</code>.</p>

          <p>Typically <code>InputSplit</code> presents a byte-oriented view of
          the input, and it is the responsibility of <code>RecordReader</code>
          to process and present a record-oriented view.</p>
          
          <p><a href="ext:api/org/apache/hadoop/mapreduce/lib/input/filesplit">
          FileSplit</a> is the default <code>InputSplit</code>. It sets 
          <code>mapreduce.map.input.file</code> to the path of the input file for the
          logical split.</p>
        </section>
        
        <section>
          <title>RecordReader</title>
          
          <p><a href="ext:api/org/apache/hadoop/mapreduce/recordreader">
          RecordReader</a> reads <code>&lt;key, value&gt;</code> pairs from an 
          <code>InputSplit</code>.</p>

          <p>Typically the <code>RecordReader</code> converts the byte-oriented 
          view of the input, provided by the <code>InputSplit</code>, and 
          presents a record-oriented to the <code>Mapper</code> implementations 
          for processing. <code>RecordReader</code> thus assumes the 
          responsibility of processing record boundaries and presents the tasks 
          with keys and values.</p>
        </section>
      </section>

      <section>
        <title>Job Output</title>
        
        <p><a href="ext:api/org/apache/hadoop/mapreduce/outputformat">
        OutputFormat</a> describes the output-specification for a MapReduce 
        job.</p>

        <p>The MapReduce framework relies on the <code>OutputFormat</code> of 
        the job to:</p>
        <ol>
          <li>
            Validate the output-specification of the job; for example, check that 
            the output directory doesn't already exist.
          </li>
          <li>
            Provide the <code>RecordWriter</code> implementation used to 
            write the output files of the job. Output files are stored in a 
            <code>FileSystem</code>.
          </li>
        </ol>
 
        <p><code>TextOutputFormat</code> is the default 
        <code>OutputFormat</code>.</p>

        <section>
        <title>Lazy Output Creation</title>
        <p>It is possible to delay creation of output until the first write attempt 
           by using <a href="ext:api/org/apache/hadoop/mapreduce/lib/output/lazyoutputformat">
           LazyOutputFormat</a>. This is particularly useful in preventing the 
           creation of zero byte files when there is no call to output.collect 
           (or Context.write). This is achieved by calling the static method 
           <code>setOutputFormatClass</code> of <code>LazyOutputFormat</code> 
           with the intended <code>OutputFormat</code> as the argument. The following example 
           shows how to delay creation of files when using the <code>TextOutputFormat</code>
        </p>

        <p>
        <code>import org.apache.hadoop.mapreduce.lib.output.LazyOutputFormat;</code> <br/>
        <code>LazyOutputFormat.setOutputFormatClass(job, TextOutputFormat.class);</code>
        </p>
         
        </section>

        <section>
        <title>OutputCommitter</title>
        
        <p><a href="ext:api/org/apache/hadoop/mapreduce/outputcommitter">
        OutputCommitter</a> describes the commit of task output for a 
        MapReduce job.</p>

        <p>The MapReduce framework relies on the <code>OutputCommitter</code>
        of the job to:</p>
        <ol>
          <li>
            Setup the job during initialization. For example, create
            the temporary output directory for the job during the
            initialization of the job. 
            Job setup is done by a separate task when the job is
            in PREP state and after initializing tasks. Once the setup task
            completes, the job will be moved to RUNNING state.
          </li>
          <li>
            Cleanup the job after the job completion. For example, remove the
            temporary output directory after the job completion.
            Job cleanup is done by a separate task at the end of the job.
            Job is declared SUCCEDED/FAILED/KILLED after the cleanup
            task completes.
          </li>
          <li>
            Setup the task temporary output.
            Task setup is done as part of the same task, during task initialization.
          </li> 
          <li>
            Check whether a task needs a commit. This is to avoid the commit
            procedure if a task does not need commit.
          </li>
          <li>
            Commit of the task output. 
            Once task is done, the task will commit it's output if required.  
          </li> 
          <li>
            Discard the task commit.
            If the task has been failed/killed, the output will be cleaned-up. 
            If task could not cleanup (in exception block), a separate task 
            will be launched with same attempt-id to do the cleanup.
          </li>
        </ol>
        <p><a
        href="ext:api/org/apache/hadoop/mapreduce/lib/output/fileoutputcommitter"
        ><code>FileOutputCommitter</code></a>
        is the default 
        <code>OutputCommitter</code>. Job setup/cleanup tasks occupy 
        map or reduce slots, whichever is free on the TaskTracker. And
        JobCleanup task, TaskCleanup tasks and JobSetup task have the highest
        priority, and in that order.</p>
        </section>
 
        <section>
          <title>Task Side-Effect Files</title>
 
          <p>In some applications, component tasks need to create and/or write to
          side-files, which differ from the actual job-output files.</p>
 
          <p>In such cases there could be issues with two instances of the same 
          <code>Mapper</code> or <code>Reducer</code> running simultaneously (for
          example, speculative tasks) trying to open and/or write to the same 
          file (path) on the <code>FileSystem</code>. Hence the 
          application-writer will have to pick unique names per task-attempt 
          (using the attemptid, say <code>attempt_200709221812_0001_m_000000_0</code>), 
          not just per task.</p> 
 
          <p>To avoid these issues the MapReduce framework, when the 
          <code>OutputCommitter</code> is <code>FileOutputCommitter</code>, 
          maintains a special 
          <code>${mapreduce.output.fileoutputformat.outputdir}/_temporary/_${taskid}</code>
          sub-directory
          accessible via <code>${mapreduce.task.output.dir}</code>
          for each task-attempt on the <code>FileSystem</code> where the output
          of the task-attempt is stored. On successful completion of the 
          task-attempt, the files in the 
          <code>${mapreduce.output.fileoutputformat.outputdir}/_temporary/_${taskid}</code>
          (only) are <em>promoted</em> to
          <code>${mapreduce.output.fileoutputformat.outputdir}</code>. Of course, 
          the framework discards the sub-directory of unsuccessful task-attempts. 
          This process is completely transparent to the application.</p>
 
          <p>The application-writer can take advantage of this feature by 
          creating any side-files required in <code>${mapreduce.task.output.dir}</code>
          during execution of a task via 
          <a href="ext:api/org/apache/hadoop/mapreduce/lib/output/fileoutputformat/getworkoutputpath">
          FileOutputFormat.getWorkOutputPath()</a>, and the framework will promote them 
          similarly for succesful task-attempts, thus eliminating the need to 
          pick unique paths per task-attempt.</p>
          
          <p>Note: The value of <code>${mapreduce.task.output.dir}</code> during 
          execution of a particular task-attempt is actually 
          <code>${mapreduce.output.fileoutputformat.outputdir}/_temporary/_{$taskid}</code>, and this value is 
          set by the MapReduce framework. So, just create any side-files in the 
          path  returned by
          <a href="ext:api/org/apache/hadoop/mapreduce/lib/output/fileoutputformat/getworkoutputpath">
          FileOutputFormat.getWorkOutputPath() </a>from MapReduce 
          task to take advantage of this feature.</p>
          
          <p>The entire discussion holds true for maps of jobs with 
           reducer=NONE (i.e. 0 reduces) since output of the map, in that case, 
           goes directly to HDFS.</p> 
        </section>
        
        <section>
          <title>RecordWriter</title>
          
          <p><a href="ext:api/org/apache/hadoop/mapreduce/recordwriter">
          RecordWriter</a> writes the output <code>&lt;key, value&gt;</code> 
          pairs to an output file.</p>

          <p>RecordWriter implementations write the job outputs to the 
          <code>FileSystem</code>.</p>
        </section>
      </section>
      
      <section>
        <title>Other Useful Features</title>
 
        <section>
          <title>Submitting Jobs to Queues</title>
          <p>Users submit jobs to Queues. Queues, as collection of jobs, 
          allow the system to provide specific functionality. For example, 
          queues use ACLs to control which users 
          who can submit jobs to them. Queues are expected to be primarily 
          used by Hadoop Schedulers. </p> 

          <p>Hadoop comes configured with a single mandatory queue, called 
          'default'. Queue names are defined in the 
          <code>mapred.queue.names</code> property of the Hadoop site
          configuration. Some job schedulers, such as the 
          <a href="capacity_scheduler.html">Capacity Scheduler</a>, 
          support multiple queues.</p>
          
          <p>A job defines the queue it needs to be submitted to through the
          <code>mapreduce.job.queuename</code> property.
          Setting the queue name is optional. If a job is submitted 
          without an associated queue name, it is submitted to the 'default' 
          queue.</p> 
        </section>
        <section>
          <title>Counters</title>
          
          <p><a href="ext:api/org/apache/hadoop/mapreduce/counters"
          ><code>Counters</code></a> represent global counters, defined either by 
          the MapReduce framework or applications. Each <a
            href="ext:api/org/apache/hadoop/mapreduce/counter"
            ><code>Counter</code></a> can 
          be of any <code>Enum</code> type. Counters of a particular 
          <code>Enum</code> are bunched into groups of type 
          <code>Counters.Group</code>.</p>
          
          <p>Applications can define arbitrary <code>Counters</code> (of type 
          <code>Enum</code>); get a <code>Counter</code> object from the task's
          Context with the <a
            href="ext:api/org/apache/hadoop/mapreduce/taskinputoutputcontext/getcounter"
            ><code>getCounter()</code></a> method, and then call
          the <a
            href="ext:api/org/apache/hadoop/mapreduce/counter/increment"
            ><code>Counter.increment(long)</code></a> method to increment its
          value locally. These counters are then globally aggregated by the framework.</p>
        </section>       
        
        <section>
          <title>DistributedCache</title>
          
          <p><a href="ext:api/org/apache/hadoop/filecache/distributedcache">
          DistributedCache</a> distributes application-specific, large, read-only 
          files efficiently.</p>
 
          <p><code>DistributedCache</code> is a facility provided by the 
          MapReduce framework to cache files (text, archives, jars and so on) 
          needed by applications.</p>
 
          <p>Applications specify the files to be cached via urls (hdfs://)
          in the <code>Job</code>. The <code>DistributedCache</code> 
          assumes that the files specified via hdfs:// urls are already present 
          on the <code>FileSystem</code>.</p>

          <p>The framework will copy the necessary files to the slave node 
          before any tasks for the job are executed on that node. Its 
          efficiency stems from the fact that the files are only copied once 
          per job and the ability to cache archives which are un-archived on 
          the slaves.</p> 
          
          <p><code>DistributedCache</code> tracks the modification timestamps of 
          the cached files. Clearly the cache files should not be modified by 
          the application or externally while the job is executing.</p>

          <p><code>DistributedCache</code> can be used to distribute simple, 
          read-only data/text files and more complex types such as archives and
          jars. Archives (zip, tar, tgz and tar.gz files) are 
          <em>un-archived</em> at the slave nodes. Files 
          have <em>execution permissions</em> set. </p>
          
          <p>The files/archives can be distributed by setting the property
          <code>mapred.cache.{files|archives}</code>. If more than one 
          file/archive has to be distributed, they can be added as comma
          separated paths. The properties can also be set by APIs 
          <a href="ext:api/org/apache/hadoop/filecache/distributedcache/addcachefile">
          DistributedCache.addCacheFile(URI,conf)</a>/ 
          <a href="ext:api/org/apache/hadoop/filecache/distributedcache/addcachearchive">
          DistributedCache.addCacheArchive(URI,conf)</a> and
          <a href="ext:api/org/apache/hadoop/filecache/distributedcache/setcachefiles">
          DistributedCache.setCacheFiles(URIs,conf)</a>/
          <a href="ext:api/org/apache/hadoop/filecache/distributedcache/setcachearchives">
          DistributedCache.setCacheArchives(URIs,conf)</a> 
          where URI is of the form
          <code>hdfs://host:port/absolute-path#link-name</code>.
          In Streaming, the files can be distributed through command line
          option <code>-cacheFile/-cacheArchive</code>.</p>
          
          <p>Optionally users can also direct the <code>DistributedCache</code>
          to <em>symlink</em> the cached file(s) into the <code>current working 
          directory</code> of the task via the 
          <a href="ext:api/org/apache/hadoop/filecache/distributedcache/createsymlink">
          DistributedCache.createSymlink(Configuration)</a> api. Or by setting
          the configuration property <code>mapreduce.job.cache.symlink.create</code>
          as <code>yes</code>. The DistributedCache will use the 
          <code>fragment</code> of the URI as the name of the symlink. 
          For example, the URI 
          <code>hdfs://namenode:port/lib.so.1#lib.so</code>
          will have the symlink name as <code>lib.so</code> in task's cwd
          for the file <code>lib.so.1</code> in distributed cache.</p>
         
          <p>The <code>DistributedCache</code> can also be used as a 
          rudimentary software distribution mechanism for use in the
          map and/or reduce tasks. It can be used to distribute both
          jars and native libraries. The 
          <a href="ext:api/org/apache/hadoop/filecache/distributedcache/addarchivetoclasspath">
          DistributedCache.addArchiveToClassPath(Path, Configuration)</a> or 
          <a href="ext:api/org/apache/hadoop/filecache/distributedcache/addfiletoclasspath">
          DistributedCache.addFileToClassPath(Path, Configuration)</a> api 
          can be used to cache files/jars and also add them to the 
          <em>classpath</em> of child-jvm. The same can be done by setting
          the configuration properties 
          <code>mapreduce.job.classpath.{files|archives}</code>. Similarly the
          cached files that are symlinked into the working directory of the
          task can be used to distribute native libraries and load them.</p>
          
          <section>
            <title>Private and Public DistributedCache Files</title>
            <p>DistributedCache files can be private or public, that
               determines how they can be shared on the slave nodes.</p>
            <ul>
              <li>"Private" DistributedCache files are cached in a local
              directory private to the user whose jobs need these
              files. These files are shared by all
              tasks and jobs of the specific user only and cannot be accessed by
              jobs of other users on the slaves. A DistributedCache file becomes
              private by virtue of its permissions on the file system where the
              files are uploaded, typically HDFS. If the file has no
              world readable access, or if the directory path leading to the
              file has no world executable access for lookup, then the file
              becomes private.
              </li>
              <li>"Public" DistributedCache files are cached in a global
              directory and the file access is setup such that they are
              publicly visible to all users. These files can be shared by
              tasks and jobs of all users on the slaves.
              A DistributedCache file becomes public by virtue of its permissions
              on the file system where the files are uploaded, typically HDFS.
              If the file has world readable access, AND if the directory
              path leading to the file has world executable access for lookup,
              then the file becomes public. In other words, if the user intends
              to make a file publicly available to all users, the file permissions
              must be set to be world readable, and the directory permissions
              on the path leading to the file must be world executable.
            </li>
            </ul>
          </section>
          <p>The <code>DistributedCache</code> tracks modification timestamps 
          of the cache files/archives. Clearly the cache files/archives should
          not be modified by the application or externally 
          while the job is executing.</p>
          
          <p>Here is an illustrative example on how to use the 
          <code>DistributedCache</code>:<br/>
           // Setting up the cache for the application
           1. Copy the requisite files to the <code>FileSystem</code>:<br/>
            <code>$ bin/hadoop fs -copyFromLocal lookup.dat /myapp/lookup.dat</code><br/>  
            <code>$ bin/hadoop fs -copyFromLocal map.zip /myapp/map.zip </code><br/> 
            <code>$ bin/hadoop fs -copyFromLocal mylib.jar /myapp/mylib.jar</code><br/>
            <code>$ bin/hadoop fs -copyFromLocal mytar.tar /myapp/mytar.tar</code><br/>
            <code>$ bin/hadoop fs -copyFromLocal mytgz.tgz /myapp/mytgz.tgz</code><br/>
            <code>$ bin/hadoop fs -copyFromLocal mytargz.tar.gz /myapp/mytargz.tar.gz</code><br/>
           2. Setup the job<br/>
            <code>Job job = new Job(conf);</code><br/>
            <code>job.addCacheFile(new URI("/myapp/lookup.dat#lookup.dat"));</code><br/>
            <code>job.addCacheArchive(new URI("/myapp/map.zip"));</code><br/>
            <code>job.addFileToClassPath(new Path("/myapp/mylib.jar"));</code><br/>
            <code>job.addCacheArchive(new URI("/myapp/mytar.tar"));</code><br/>
            <code>job.addCacheArchive(new URI("/myapp/mytgz.tgz"));</code><br/>
            <code>job.addCacheArchive(new URI("/myapp/mytargz.tar.gz"));</code><br/>
      
           3. Use the cached files in the 
              <code>{@link org.apache.hadoop.mapreduce.Mapper}
              or {@link org.apache.hadoop.mapreduce.Reducer}:</code><br/>
      
              <code>public static class MapClass extends Mapper&lt;K, V, K, V&gt; {</code><br/>
                <code>&nbsp;&nbsp;private Path[] localArchives;</code><br/>
                <code>&nbsp;&nbsp;private Path[] localFiles;</code><br/>
                <code>&nbsp;&nbsp;public void setup(Context context) {</code><br/>
                 <code>&nbsp;&nbsp;&nbsp;&nbsp;// Get the cached archives/files</code><br/>
                 <code>&nbsp;&nbsp;&nbsp;&nbsp;localArchives = context.getLocalCacheArchives();</code><br/>
                 <code>&nbsp;&nbsp;&nbsp;&nbsp;localFiles = context.getLocalCacheFiles();</code><br/>
              <code>&nbsp;&nbsp;}</code><br/>
        
              <code>&nbsp;&nbsp;public void map(K key, V value, 
                  Context context) throws IOException {</code><br/>
                <code>&nbsp;&nbsp;&nbsp;&nbsp;// Use data from the cached archives/files here</code><br/>
                <code>&nbsp;&nbsp;&nbsp;&nbsp;// ...</code><br/>
                <code>&nbsp;&nbsp;&nbsp;&nbsp;// ...</code><br/>
                <code>&nbsp;&nbsp;&nbsp;&nbsp;context.write(k, v);</code><br/>
              <code>&nbsp;&nbsp;}</code><br/>
            <code>}</code></p>
          
        </section>
        
        <section>
          <title>Tool</title>
          
          <p>The <a href="ext:api/org/apache/hadoop/util/tool">Tool</a> 
          interface supports the handling of generic Hadoop command-line options.
          </p>
          
          <p><code>Tool</code> is the standard for any MapReduce tool or 
          application. The application should delegate the handling of 
          standard command-line options to 
          <a href="ext:api/org/apache/hadoop/util/genericoptionsparser">
          GenericOptionsParser</a> via          
          <a href="ext:api/org/apache/hadoop/util/toolrunner/run">
          ToolRunner.run(Tool, String[])</a> and only handle its custom 
          arguments.</p>
          
          <p>
            The generic Hadoop command-line options are:<br/>
            <code>
              -conf &lt;configuration file&gt;
            </code>
            <br/>
            <code>
              -D &lt;property=value&gt;
            </code>
            <br/>
            <code>
              -fs &lt;local|namenode:port&gt;
            </code>
            <br/>
            <code>
              -jt &lt;local|jobtracker:port&gt;
            </code>
          </p>
        </section>
        
        <section>
          <title>IsolationRunner</title>
          
          <p><a href="ext:api/org/apache/hadoop/mapred/isolationrunner">
          IsolationRunner</a> is a utility to help debug MapReduce programs.</p>
          
          <p>To use the <code>IsolationRunner</code>, first set 
          <code>keep.failed.tasks.files</code> to <code>true</code> 
          (also see <code>keep.tasks.files.pattern</code>).</p>
          
          <p>
            Next, go to the node on which the failed task ran and go to the 
            <code>TaskTracker</code>'s local directory and run the 
            <code>IsolationRunner</code>:<br/>
            <code>$ cd &lt;local path&gt;
            /taskTracker/$user/jobcache/$jobid/${taskid}/work</code><br/>
            <code>
              $ bin/hadoop org.apache.hadoop.mapred.IsolationRunner ../job.xml
            </code>
          </p>
          
          <p><code>IsolationRunner</code> will run the failed task in a single 
          jvm, which can be in the debugger, over precisely the same input.</p>
        </section>

        <section>
          <title>Profiling</title>
          <p>Profiling is a utility to get a representative (2 or 3) sample
          of built-in java profiler for a sample of maps and reduces. </p>
          
          <p>User can specify whether the system should collect profiler
          information for some of the tasks in the job by setting the
          configuration property <code>mapreduce.task.profile</code>. The
          value can be set using the api 
          <a href="ext:api/org/apache/hadoop/mapreduce/job/setprofileenabled">
          Job.setProfileEnabled(boolean)</a>. If the value is set 
          <code>true</code>, the task profiling is enabled. The profiler
          information is stored in the user log directory. By default, 
          profiling is not enabled for the job.  </p>
          
          <p>Once user configures that profiling is needed, she/he can use
          the configuration property 
          <code>mapreduce.task.profile.{maps|reduces}</code> to set the ranges
          of MapReduce tasks to profile. The value can be set using the api 
          <a href="ext:api/org/apache/hadoop/mapreduce/job/setprofiletaskrange">
          Job.setProfileTaskRange(boolean,String)</a>.
          By default, the specified range is <code>0-2</code>.</p>
          
          <p>User can also specify the profiler configuration arguments by 
          setting the configuration property 
          <code>mapreduce.task.profile.params</code>. The value can be specified 
          using the api
          <a href="ext:api/org/apache/hadoop/mapreduce/job/setprofileparams">
          Job.setProfileParams(String)</a>. If the string contains a 
          <code>%s</code>, it will be replaced with the name of the profiling
          output file when the task runs. These parameters are passed to the
          task child JVM on the command line. The default value for 
          the profiling parameters is 
          <code>-agentlib:hprof=cpu=samples,heap=sites,force=n,thread=y,verbose=n,file=%s</code>
          </p>
        </section>
        
        <section>
          <title>Debugging</title>
          <p>The MapReduce framework provides a facility to run user-provided 
          scripts for debugging. When a MapReduce task fails, a user can run 
          a debug script, to process task logs for example. The script is 
          given access to the task's stdout and stderr outputs, syslog and 
          jobconf. The output from the debug script's stdout and stderr is 
          displayed on the console diagnostics and also as part of the 
          job UI. </p>

          <p> In the following sections we discuss how to submit a debug script
          with a job. The script file needs to be distributed and submitted to 
          the framework.</p>
          <section>
          <title> How to distribute the script file: </title>
          <p>
          The user needs to use  
          <a href="mapred_tutorial.html#DistributedCache">DistributedCache</a>
          to <em>distribute</em> and <em>symlink</em> the script file.</p>
          </section>
          <section>
          <title> How to submit the script: </title>
          <p> A quick way to submit the debug script is to set values for the 
          properties <code>mapreduce.map.debug.script</code> and 
          <code>mapreduce.reduce.debug.script</code>, for debugging map and 
          reduce tasks respectively. These properties can also be set by using APIs 
          <code>Job.getConfiguration().set(Job.MAP_DEBUG_SCRIPT, String)</code>
          and <code>Job.getConfiguration().set(Job.REDUCE_DEBUG_SCRIPT,
          String)</code>. In streaming mode, a debug 
          script can be submitted with the command-line options 
          <code>-mapdebug</code> and <code>-reducedebug</code>, for debugging 
          map and reduce tasks respectively.</p>
            
          <p>The arguments to the script are the task's stdout, stderr, 
          syslog and jobconf files. The debug command, run on the node where
          the MapReduce task failed, is: <br/>
          <code> $script $stdout $stderr $syslog $jobconf </code> </p> 

          <p> Pipes programs have the c++ program name as a fifth argument
          for the command. Thus for the pipes programs the command is <br/> 
          <code>$script $stdout $stderr $syslog $jobconf $program </code>  
          </p>
          </section>
          
          <section>
          <title> Default Behavior: </title>
          <p> For pipes, a default script is run to process core dumps under
          gdb, prints stack trace and gives info about running threads. </p>
          </section>
        </section>
        
        <section>
          <title>JobControl</title>
          
          <p><a href="ext:api/org/apache/hadoop/mapred/jobcontrol/package-summary">
          JobControl</a> is a utility which encapsulates a set of MapReduce jobs
          and their dependencies.</p>
        </section>
        
        <section>
          <title>Data Compression</title>
          
          <p>Hadoop MapReduce provides facilities for the application-writer to
          specify compression for both intermediate map-outputs and the
          job-outputs i.e. output of the reduces. It also comes bundled with
          <a href="ext:api/org/apache/hadoop/io/compress/compressioncodec">
          CompressionCodec</a> implementation for the 
          <a href="ext:zlib">zlib</a> compression 
          algorithm. The <a href="ext:gzip">gzip</a> file format is also
          supported.</p>
          
         <p>Hadoop also provides native implementations of the above compression
          codecs for reasons of both performance (zlib) and non-availability of
          Java libraries. For more information see the
          <a href="http://hadoop.apache.org/common/docs/current/native_libraries.html">Native Libraries Guide</a>.</p>
          
          
          <section>
            <title>Intermediate Outputs</title>
            
            <p>Applications can control compression of intermediate map-outputs
            via the <code>Job.getConfiguration().setBoolean(Job.MAP_OUTPUT_COMPRESS, bool)</code>
            api and the <code>CompressionCodec</code> to be used via the
            <code>Job.getConfiguration().setClass(Job.MAP_OUTPUT_COMPRESS_CODEC, Class,
            CompressionCodec.class)</code> api.</p>
          </section>
          
          <section>
            <title>Job Outputs</title>
            
            <p>Applications can control compression of job-outputs via the
            <a href="ext:api/org/apache/hadoop/mapreduce/lib/output/fileoutputformat/setcompressoutput">
            FileOutputFormat.setCompressOutput(Job, boolean)</a> api and the 
            <code>CompressionCodec</code> to be used can be specified via the
            <a href="ext:api/org/apache/hadoop/mapreduce/lib/output//fileoutputformat/setoutputcompressorclass">
            FileOutputFormat.setOutputCompressorClass(Job, Class)</a> api.</p>
            
            <p>If the job outputs are to be stored in the 
            <a href="ext:api/org/apache/hadoop/mapreduce/lib/output/sequencefileoutputformat">
            SequenceFileOutputFormat</a>, the required
            <code>SequenceFile.CompressionType</code> (i.e. <code>RECORD</code> / 
            <code>BLOCK</code> - defaults to <code>RECORD</code>) can be 
            specified via the 
            <a href="ext:api/org/apache/hadoop/mapreduce/lib/output//sequencefileoutputformat/setoutputcompressiontype">
            SequenceFileOutputFormat.setOutputCompressionType(Job, 
            SequenceFile.CompressionType)</a> api.</p>
          </section>
        </section>
        
        <section>
          <title>Skipping Bad Records</title>
          <p>Hadoop provides an option where a certain set of bad input 
          records can be skipped when processing map inputs. Applications 
          can control this feature through the  
          <a href="ext:api/org/apache/hadoop/mapred/skipbadrecords">
          SkipBadRecords</a> class.</p>
          
          <p>This feature can be used when map tasks crash deterministically 
          on certain input. This usually happens due to bugs in the 
          map function. Usually, the user would have to fix these bugs. 
          This is, however, not possible sometimes. The bug may be in third 
          party libraries, for example, for which the source code is not 
          available. In such cases, the task never completes successfully even
          after multiple attempts, and the job fails. With this feature, only 
          a small portion of data surrounding the 
          bad records is lost, which may be acceptable for some applications 
          (those performing statistical analysis on very large data, for 
          example). </p>

          <p>By default this feature is disabled. For enabling it, 
          refer to <a href="ext:api/org/apache/hadoop/mapred/skipbadrecords/setmappermaxskiprecords">
          SkipBadRecords.setMapperMaxSkipRecords(Configuration, long)</a> and 
          <a href="ext:api/org/apache/hadoop/mapred/skipbadrecords/setreducermaxskipgroups">
          SkipBadRecords.setReducerMaxSkipGroups(Configuration, long)</a>.
          </p>
 
          <p>With this feature enabled, the framework gets into 'skipping 
          mode' after a certain number of map failures. For more details, 
          see <a href="ext:api/org/apache/hadoop/mapred/skipbadrecords/setattemptsTostartskipping">
          SkipBadRecords.setAttemptsToStartSkipping(Configuration, int)</a>. 
          In 'skipping mode', map tasks maintain the range of records being 
          processed. To do this, the framework relies on the processed record 
          counter. See <a href="ext:api/org/apache/hadoop/mapred/skipbadrecords/counter_map_processed_records">
          SkipBadRecords.COUNTER_MAP_PROCESSED_RECORDS</a> and 
          <a href="ext:api/org/apache/hadoop/mapred/skipbadrecords/counter_reduce_processed_groups">
          SkipBadRecords.COUNTER_REDUCE_PROCESSED_GROUPS</a>. 
          This counter enables the framework to know how many records have 
          been processed successfully, and hence, what record range caused 
          a task to crash. On further attempts, this range of records is 
          skipped.</p>
     
          <p>The number of records skipped depends on how frequently the 
          processed record counter is incremented by the application. 
          It is recommended that this counter be incremented after every 
          record is processed. This may not be possible in some applications 
          that typically batch their processing. In such cases, the framework 
          may skip additional records surrounding the bad record. Users can 
          control the number of skipped records through 
          <a href="ext:api/org/apache/hadoop/mapred/skipbadrecords/setmappermaxskiprecords">
          SkipBadRecords.setMapperMaxSkipRecords(Configuration, long)</a> and 
          <a href="ext:api/org/apache/hadoop/mapred/skipbadrecords/setreducermaxskipgroups">
          SkipBadRecords.setReducerMaxSkipGroups(Configuration, long)</a>. 
          The framework tries to narrow the range of skipped records using a 
          binary search-like approach. The skipped range is divided into two 
          halves and only one half gets executed. On subsequent 
          failures, the framework figures out which half contains 
          bad records. A task will be re-executed till the
          acceptable skipped value is met or all task attempts are exhausted.
          To increase the number of task attempts, use
          <a href="ext:api/org/apache/hadoop/mapreduce/job/setmaxmapattempts">
          Job.setMaxMapAttempts(int)</a> and 
          <a href="ext:api/org/apache/hadoop/mapreduce/job/setmaxreduceattempts">
          Job.setMaxReduceAttempts(int)</a>.
          </p>
          
          <p>Skipped records are written to HDFS in the sequence file 
          format, for later analysis. The location can be changed through 
          <a href="ext:api/org/apache/hadoop/mapred/skipbadrecords/setskipoutputpath">
          SkipBadRecords.setSkipOutputPath(conf, Path)</a>.
          </p> 

        </section>
        
      </section>
    </section>

    <section>
      <title>Example: WordCount v2.0</title>
      
      <p>Here is a more complete <code>WordCount</code> which uses many of the
      features provided by the MapReduce framework we discussed so far.</p>
      
      <p>This example needs the HDFS to be up and running, especially for the 
      <code>DistributedCache</code>-related features. Hence it only works with a 
      pseudo-distributed (<a href="ext:single-node-setup">Single Node Setup</a>) 
     or fully-distributed (<a href="ext:cluster-setup/FullyDistributedOperation">Cluster Setup</a>) 
      Hadoop installation.</p>     
      
      <section>
        <title>Source Code</title>
        
        <table>
          <tr>
            <th></th>
            <th>WordCount2.java</th>
          </tr>
<tr><td>1.</td><td><code>package&nbsp;org.myorg;
</code></td></tr>
<tr><td>2.</td><td><code>
</code></td></tr>
<tr><td>3.</td><td><code>import&nbsp;java.io.*;
</code></td></tr>
<tr><td>4.</td><td><code>import&nbsp;java.util.*;
</code></td></tr>
<tr><td>5.</td><td><code>
</code></td></tr>
<tr><td>6.</td><td><code>import&nbsp;org.apache.hadoop.fs.Path;
</code></td></tr>
<tr><td>7.</td><td><code>import&nbsp;org.apache.hadoop.filecache.DistributedCache;
</code></td></tr>
<tr><td>8.</td><td><code>import&nbsp;org.apache.hadoop.conf.*;
</code></td></tr>
<tr><td>9.</td><td><code>import&nbsp;org.apache.hadoop.io.*;
</code></td></tr>
<tr><td>10.</td><td><code>import&nbsp;org.apache.hadoop.mapreduce.*;
</code></td></tr>
<tr><td>11.</td><td><code>import&nbsp;org.apache.hadoop.mapreduce.lib.input.*;
</code></td></tr>
<tr><td>12.</td><td><code>import&nbsp;org.apache.hadoop.mapreduce.lib.output.*;
</code></td></tr>
<tr><td>13.</td><td><code>import&nbsp;org.apache.hadoop.util.*;
</code></td></tr>
<tr><td>14.</td><td><code>
</code></td></tr>
<tr><td>15.</td><td><code>public&nbsp;class&nbsp;WordCount2&nbsp;extends&nbsp;Configured&nbsp;implements&nbsp;Tool&nbsp;{
</code></td></tr>
<tr><td>16.</td><td><code>
</code></td></tr>
<tr><td>17.</td><td><code>&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;class&nbsp;Map
</code></td></tr>
<tr><td>18.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extends&nbsp;Mapper&lt;LongWritable,&nbsp;Text,&nbsp;Text,&nbsp;IntWritable&gt;&nbsp;{
</code></td></tr>
<tr><td>19.</td><td><code>
</code></td></tr>
<tr><td>20.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;enum&nbsp;Counters&nbsp;{&nbsp;INPUT_WORDS&nbsp;}
</code></td></tr>
<tr><td>21.</td><td><code>
</code></td></tr>
<tr><td>22.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;static&nbsp;IntWritable&nbsp;one&nbsp;=&nbsp;new&nbsp;IntWritable(1);
</code></td></tr>
<tr><td>23.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Text&nbsp;word&nbsp;=&nbsp;new&nbsp;Text();
</code></td></tr>
<tr><td>24.</td><td><code>
</code></td></tr>
<tr><td>25.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;boolean&nbsp;caseSensitive&nbsp;=&nbsp;true;
</code></td></tr>
<tr><td>26.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;Set&lt;String&gt;&nbsp;patternsToSkip&nbsp;=&nbsp;new&nbsp;HashSet&lt;String&gt;();
</code></td></tr>
<tr><td>27.</td><td><code>
</code></td></tr>
<tr><td>28.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;long&nbsp;numRecords&nbsp;=&nbsp;0;
</code></td></tr>
<tr><td>29.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;String&nbsp;inputFile;
</code></td></tr>
<tr><td>30.</td><td><code>
</code></td></tr>
<tr><td>31.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setup(Context&nbsp;context)&nbsp;{
</code></td></tr>
<tr><td>32.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Configuration&nbsp;conf&nbsp;=&nbsp;context.getConfiguration();
</code></td></tr>
<tr><td>33.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;caseSensitive&nbsp;=&nbsp;conf.getBoolean(&quot;wordcount.case.sensitive&quot;,&nbsp;true);
</code></td></tr>
<tr><td>34.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inputFile&nbsp;=&nbsp;conf.get(&quot;mapreduce.map.input.file&quot;);
</code></td></tr>
<tr><td>35.</td><td><code>
</code></td></tr>
<tr><td>36.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(conf.getBoolean(&quot;wordcount.skip.patterns&quot;,&nbsp;false))&nbsp;{
</code></td></tr>
<tr><td>37.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path[]&nbsp;patternsFiles&nbsp;=&nbsp;new&nbsp;Path[0];
</code></td></tr>
<tr><td>38.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{
</code></td></tr>
<tr><td>39.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;patternsFiles&nbsp;=&nbsp;DistributedCache.getLocalCacheFiles(conf);
</code></td></tr>
<tr><td>40.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;ioe)&nbsp;{
</code></td></tr>
<tr><td>41.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(&quot;Caught&nbsp;exception&nbsp;while&nbsp;getting&nbsp;cached&nbsp;files:&nbsp;&quot;
</code></td></tr>
<tr><td>42.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;StringUtils.stringifyException(ioe));
</code></td></tr>
<tr><td>43.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>44.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(Path&nbsp;patternsFile&nbsp;:&nbsp;patternsFiles)&nbsp;{
</code></td></tr>
<tr><td>45.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parseSkipFile(patternsFile);
</code></td></tr>
<tr><td>46.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>47.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>48.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>49.</td><td><code>
</code></td></tr>
<tr><td>50.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;void&nbsp;parseSkipFile(Path&nbsp;patternsFile)&nbsp;{
</code></td></tr>
<tr><td>51.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{
</code></td></tr>
<tr><td>52.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;fis&nbsp;=&nbsp;new&nbsp;BufferedReader(new&nbsp;FileReader(
</code></td></tr>
<tr><td>53.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;patternsFile.toString()));
</code></td></tr>
<tr><td>54.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;pattern&nbsp;=&nbsp;null;
</code></td></tr>
<tr><td>55.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;((pattern&nbsp;=&nbsp;fis.readLine())&nbsp;!=&nbsp;null)&nbsp;{
</code></td></tr>
<tr><td>56.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;patternsToSkip.add(pattern);
</code></td></tr>
<tr><td>57.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>58.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;ioe)&nbsp;{
</code></td></tr>
<tr><td>59.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(&quot;Caught&nbsp;exception&nbsp;while&nbsp;parsing&nbsp;the&nbsp;cached&nbsp;file&nbsp;'&quot;
</code></td></tr>
<tr><td>60.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;patternsFile&nbsp;+&nbsp;&quot;'&nbsp;:&nbsp;&quot;&nbsp;+&nbsp;StringUtils.stringifyException(ioe));
</code></td></tr>
<tr><td>61.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>62.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>63.</td><td><code>
</code></td></tr>
<tr><td>64.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;map(LongWritable&nbsp;key,&nbsp;Text&nbsp;value,&nbsp;Context&nbsp;context)
</code></td></tr>
<tr><td>65.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;IOException,&nbsp;InterruptedException&nbsp;{
</code></td></tr>
<tr><td>66.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;line&nbsp;=&nbsp;(caseSensitive)&nbsp;?
</code></td></tr>
<tr><td>67.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value.toString()&nbsp;:&nbsp;value.toString().toLowerCase();
</code></td></tr>
<tr><td>68.</td><td><code>
</code></td></tr>
<tr><td>69.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(String&nbsp;pattern&nbsp;:&nbsp;patternsToSkip)&nbsp;{
</code></td></tr>
<tr><td>70.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;line&nbsp;=&nbsp;line.replaceAll(pattern,&nbsp;&quot;&quot;);
</code></td></tr>
<tr><td>71.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>72.</td><td><code>
</code></td></tr>
<tr><td>73.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringTokenizer&nbsp;tokenizer&nbsp;=&nbsp;new&nbsp;StringTokenizer(line);
</code></td></tr>
<tr><td>74.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(tokenizer.hasMoreTokens())&nbsp;{
</code></td></tr>
<tr><td>75.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;word.set(tokenizer.nextToken());
</code></td></tr>
<tr><td>76.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.write(word,&nbsp;one);
</code></td></tr>
<tr><td>77.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.getCounter(Counters.INPUT_WORDS).increment(1);
</code></td></tr>
<tr><td>78.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>79.</td><td><code>
</code></td></tr>
<tr><td>80.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((++numRecords&nbsp;%&nbsp;100)&nbsp;==&nbsp;0)&nbsp;{
</code></td></tr>
<tr><td>81.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.setStatus(&quot;Finished&nbsp;processing&nbsp;&quot;&nbsp;+&nbsp;numRecords
</code></td></tr>
<tr><td>82.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;&quot;&nbsp;records&nbsp;&quot;&nbsp;+&nbsp;&quot;from&nbsp;the&nbsp;input&nbsp;file:&nbsp;&quot;&nbsp;+&nbsp;inputFile);
</code></td></tr>
<tr><td>83.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>84.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>85.</td><td><code>&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>86.</td><td><code>
</code></td></tr>
<tr><td>87.</td><td><code>&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;class&nbsp;Reduce
</code></td></tr>
<tr><td>88.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extends&nbsp;Reducer&lt;Text,&nbsp;IntWritable,&nbsp;Text,&nbsp;IntWritable&gt;&nbsp;{
</code></td></tr>
<tr><td>89.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;reduce(Text&nbsp;key,&nbsp;Iterable&lt;IntWritable&gt;&nbsp;values,
</code></td></tr>
<tr><td>90.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context&nbsp;context)&nbsp;throws&nbsp;IOException,&nbsp;InterruptedException&nbsp;{
</code></td></tr>
<tr><td>91.</td><td><code>
</code></td></tr>
<tr><td>92.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;sum&nbsp;=&nbsp;0;
</code></td></tr>
<tr><td>93.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(IntWritable&nbsp;val&nbsp;:&nbsp;values)&nbsp;{
</code></td></tr>
<tr><td>94.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sum&nbsp;+=&nbsp;val.get();
</code></td></tr>
<tr><td>95.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>96.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.write(key,&nbsp;new&nbsp;IntWritable(sum));
</code></td></tr>
<tr><td>97.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>98.</td><td><code>&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>99.</td><td><code>
</code></td></tr>
<tr><td>100.</td><td><code>&nbsp;&nbsp;&nbsp;public&nbsp;int&nbsp;run(String[]&nbsp;args)&nbsp;throws&nbsp;Exception&nbsp;{
</code></td></tr>
<tr><td>101.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Job&nbsp;job&nbsp;=&nbsp;new&nbsp;Job(getConf());
</code></td></tr>
<tr><td>102.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.setJarByClass(WordCount2.class);
</code></td></tr>
<tr><td>103.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.setJobName(&quot;wordcount2.0&quot;);
</code></td></tr>
<tr><td>104.</td><td><code>
</code></td></tr>
<tr><td>105.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.setOutputKeyClass(Text.class);
</code></td></tr>
<tr><td>106.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.setOutputValueClass(IntWritable.class);
</code></td></tr>
<tr><td>107.</td><td><code>
</code></td></tr>
<tr><td>108.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.setMapperClass(Map.class);
</code></td></tr>
<tr><td>109.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.setCombinerClass(Reduce.class);
</code></td></tr>
<tr><td>110.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.setReducerClass(Reduce.class);
</code></td></tr>
<tr><td>111.</td><td><code>
</code></td></tr>
<tr><td>112.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Note&nbsp;that&nbsp;these&nbsp;are&nbsp;the&nbsp;default.
</code></td></tr>
<tr><td>113.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.setInputFormatClass(TextInputFormat.class);
</code></td></tr>
<tr><td>114.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.setOutputFormatClass(TextOutputFormat.class);
</code></td></tr>
<tr><td>115.</td><td><code>
</code></td></tr>
<tr><td>116.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;String&gt;&nbsp;other_args&nbsp;=&nbsp;new&nbsp;ArrayList&lt;String&gt;();
</code></td></tr>
<tr><td>117.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i=0;&nbsp;i&nbsp;&lt;&nbsp;args.length;&nbsp;++i)&nbsp;{
</code></td></tr>
<tr><td>118.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&quot;-skip&quot;.equals(args[i]))&nbsp;{
</code></td></tr>
<tr><td>119.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DistributedCache.addCacheFile(new&nbsp;Path(args[++i]).toUri(),
</code></td></tr>
<tr><td>120.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.getConfiguration());
</code></td></tr>
<tr><td>121.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;job.getConfiguration().setBoolean(&quot;wordcount.skip.patterns&quot;,&nbsp;true);
</code></td></tr>
<tr><td>122.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{
</code></td></tr>
<tr><td>123.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;other_args.add(args[i]);
</code></td></tr>
<tr><td>124.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>125.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>126.</td><td><code>
</code></td></tr>
<tr><td>127.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileInputFormat.setInputPaths(job,&nbsp;new&nbsp;Path(other_args.get(0)));
</code></td></tr>
<tr><td>128.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileOutputFormat.setOutputPath(job,&nbsp;new&nbsp;Path(other_args.get(1)));
</code></td></tr>
<tr><td>129.</td><td><code>
</code></td></tr>
<tr><td>130.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;success&nbsp;=&nbsp;job.waitForCompletion(true);
</code></td></tr>
<tr><td>131.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;success&nbsp;?&nbsp;0&nbsp;:&nbsp;1;
</code></td></tr>
<tr><td>132.</td><td><code>&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>133.</td><td><code>
</code></td></tr>
<tr><td>134.</td><td><code>&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;throws&nbsp;Exception&nbsp;{
</code></td></tr>
<tr><td>135.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;res&nbsp;=&nbsp;ToolRunner.run(new&nbsp;Configuration(),&nbsp;new&nbsp;WordCount2(),&nbsp;args);
</code></td></tr>
<tr><td>136.</td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(res);
</code></td></tr>
<tr><td>137.</td><td><code>&nbsp;&nbsp;&nbsp;}
</code></td></tr>
<tr><td>138.</td><td><code>}
</code></td></tr>
        </table>
      </section>
        
      <section>
        <title>Sample Runs</title>
        
        <p>Sample text-files as input:</p>
        <p>
          <code>$ bin/hadoop fs -ls /user/joe/wordcount/input/</code><br/>
          <code>/user/joe/wordcount/input/file01</code><br/>
          <code>/user/joe/wordcount/input/file02</code><br/>
          <br/>
          <code>$ bin/hadoop fs -cat /user/joe/wordcount/input/file01</code><br/>
          <code>Hello World, Bye World!</code><br/>
          <br/>
          <code>$ bin/hadoop fs -cat /user/joe/wordcount/input/file02</code><br/>
          <code>Hello Hadoop, Goodbye to hadoop.</code>
        </p>
        
        <p>Run the application:</p>
        <p>
          <code>
            $ bin/hadoop jar /user/joe/wordcount.jar org.myorg.WordCount2
              /user/joe/wordcount/input /user/joe/wordcount/output 
          </code>
        </p>

        <p>Output:</p>
        <p>
          <code>
            $ bin/hadoop fs -cat /user/joe/wordcount/output/part-r-00000
          </code>
          <br/>
          <code>Bye    1</code><br/>
          <code>Goodbye    1</code><br/>
          <code>Hadoop,    1</code><br/>
          <code>Hello    2</code><br/>
          <code>World!    1</code><br/>
          <code>World,    1</code><br/>
          <code>hadoop.    1</code><br/>
          <code>to    1</code><br/>
        </p>
        
        <p>Notice that the inputs differ from the first version we looked at, 
        and how they affect the outputs.</p>

        <p>Now, lets plug-in a pattern-file which lists the word-patterns to be 
        ignored, via the <code>DistributedCache</code>.</p>
        
        <p>
          <code>$ hadoop fs -cat /user/joe/wordcount/patterns.txt</code><br/>
          <code>\.</code><br/>
          <code>\,</code><br/>
          <code>\!</code><br/>
          <code>to</code><br/>
        </p>
        
        <p>Run it again, this time with more options:</p>
        <p>
          <code>
            $ bin/hadoop jar /user/joe/wordcount.jar org.myorg.WordCount2
              -Dwordcount.case.sensitive=true /user/joe/wordcount/input 
              /user/joe/wordcount/output -skip /user/joe/wordcount/patterns.txt
          </code>
        </p>
        
        <p>As expected, the output:</p>
        <p>
          <code>
            $ bin/hadoop fs -cat /user/joe/wordcount/output/part-r-00000
          </code>
          <br/>
          <code>Bye    1</code><br/>
          <code>Goodbye    1</code><br/>
          <code>Hadoop    1</code><br/>
          <code>Hello    2</code><br/>
          <code>World    2</code><br/>
          <code>hadoop    1</code><br/>
        </p>
        
        <p>Run it once more, this time switch-off case-sensitivity:</p>
        <p>
          <code>
            $ bin/hadoop jar /user/joe/wordcount.jar org.myorg.WordCount2
              -Dwordcount.case.sensitive=false /user/joe/wordcount/input 
              /user/joe/wordcount/output -skip /user/joe/wordcount/patterns.txt
          </code>
        </p>
        
        <p>Sure enough, the output:</p>
        <p>
          <code>
            $ bin/hadoop fs -cat /user/joe/wordcount/output/part-r-00000
          </code>
          <br/>
          <code>bye    1</code><br/>
          <code>goodbye    1</code><br/>
          <code>hadoop    2</code><br/>
          <code>hello    2</code><br/>
          <code>world    2</code><br/>
        </p>
      </section>
      
      <section>
        <title>Highlights</title>
        
        <p>The second version of <code>WordCount</code> improves upon the 
        previous one by using some features offered by the MapReduce framework:
        </p>
        <ul>
          <li>
            Demonstrates how applications can access configuration parameters
            in the <code>setup</code> method of the <code>Mapper</code> (and
            <code>Reducer</code>) implementations (lines 31-48).
          </li>
          <li>
            Demonstrates how the <code>DistributedCache</code> can be used to 
            distribute read-only data needed by the jobs. Here it allows the user 
            to specify word-patterns to skip while counting (line 119).
          </li>
          <li>
            Demonstrates the utility of the <code>Tool</code> interface and the
            <code>GenericOptionsParser</code> to handle generic Hadoop 
            command-line options (line 135).
          </li>
          <li>
            Demonstrates how applications can use <code>Counters</code> (line 77)
            and how they can set application-specific status information via 
            the <code>Context</code> instance passed to the <code>map</code> (and
            <code>reduce</code>) method (line 81).
          </li>
        </ul>
        
      </section>
    </section>

    <p>
      <em>Java and JNI are trademarks or registered trademarks of 
      Sun Microsystems, Inc. in the United States and other countries.</em>
    </p>
    
  </body>
  
</document>
