~~ Licensed 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. See accompanying LICENSE file.

  ---
  Hadoop MapReduce Next Generation ${project.version} - Setting up a Single Node Cluster.
  ---
  ---
  ${maven.build.timestamp}

Hadoop MapReduce Next Generation - Setting up a Single Node Cluster.

  \[ {{{./index.html}Go Back}} \]

%{toc|section=1|fromDepth=0}

* Mapreduce Tarball

  You should be able to obtain the MapReduce tarball from the release.
  If not, you should be able to create a tarball from the source.

+---+
$ mvn clean install -DskipTests
$ cd hadoop-mapreduce-project
$ mvn clean install assembly:assembly -Pnative
+---+
  <<NOTE:>> You will need protoc installed of version 2.4.1 or greater.

  To ignore the native builds in mapreduce you can omit the <<<-Pnative>>> argument
  for maven. The tarball should be available in <<<target/>>> directory. 

  
* Setting up the environment.

  Assuming you have installed hadoop-common/hadoop-hdfs and exported
  <<$HADOOP_COMMON_HOME>>/<<$HADOOP_HDFS_HOME>>, untar hadoop mapreduce 
  tarball and set environment variable <<$HADOOP_MAPRED_HOME>> to the 
  untarred directory. Set <<$HADOOP_YARN_HOME>> the same as <<$HADOOP_MAPRED_HOME>>. 
 
  <<NOTE:>> The following instructions assume you have hdfs running.

* Setting up Configuration.

  To start the ResourceManager and NodeManager, you will have to update the configs.
  Assuming your $HADOOP_CONF_DIR is the configuration directory and has the installed
  configs for HDFS and <<<core-site.xml>>>. There are 2 config files you will have to setup
  <<<mapred-site.xml>>> and <<<yarn-site.xml>>>.

** Setting up <<<mapred-site.xml>>>

  Add the following configs to your <<<mapred-site.xml>>>.

+---+
  <property>
    <name>mapreduce.cluster.temp.dir</name>
    <value></value>
    <description>No description</description>
    <final>true</final>
  </property>

  <property>
    <name>mapreduce.cluster.local.dir</name>
    <value></value>
    <description>No description</description>
    <final>true</final>
  </property>
+---+

** Setting up <<<yarn-site.xml>>>

Add the following configs to your <<<yarn-site.xml>>>

+---+
  <property>
    <name>yarn.resourcemanager.resource-tracker.address</name>
    <value>host:port</value>
    <description>host is the hostname of the resource manager and 
    port is the port on which the NodeManagers contact the Resource Manager.
    </description>
  </property>

  <property>
    <name>yarn.resourcemanager.scheduler.address</name>
    <value>host:port</value>
    <description>host is the hostname of the resourcemanager and port is the port
    on which the Applications in the cluster talk to the Resource Manager.
    </description>
  </property>

  <property>
    <name>yarn.resourcemanager.scheduler.class</name>
    <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler</value>
    <description>In case you do not want to use the default scheduler</description>
  </property>

  <property>
    <name>yarn.resourcemanager.address</name>
    <value>host:port</value>
    <description>the host is the hostname of the ResourceManager and the port is the port on
    which the clients can talk to the Resource Manager. </description>
  </property>

  <property>
    <name>yarn.nodemanager.local-dirs</name>
    <value></value>
    <description>the local directories used by the nodemanager</description>
  </property>

  <property>
    <name>yarn.nodemanager.address</name>
    <value>0.0.0.0:port</value>
    <description>the nodemanagers bind to this port</description>
  </property>  

  <property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>10240</value>
    <description>the amount of memory on the NodeManager in GB</description>
  </property>
 
  <property>
    <name>yarn.nodemanager.remote-app-log-dir</name>
    <value>/app-logs</value>
    <description>directory on hdfs where the application logs are moved to </description>
  </property>

   <property>
    <name>yarn.nodemanager.log-dirs</name>
    <value></value>
    <description>the directories used by Nodemanagers as log directories</description>
  </property>

  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce.shuffle</value>
    <description>shuffle service that needs to be set for Map Reduce to run </description>
  </property>
+---+

* Setting up <<<capacity-scheduler.xml>>>

   Make sure you populate the root queues in <<<capacity-scheduler.xml>>>.

+---+
  <property>
    <name>yarn.scheduler.capacity.root.queues</name>
    <value>unfunded,default</value>
  </property>
  
  <property>
    <name>yarn.scheduler.capacity.root.capacity</name>
    <value>100</value>
  </property>
  
  <property>
    <name>yarn.scheduler.capacity.root.unfunded.capacity</name>
    <value>50</value>
  </property>
  
  <property>
    <name>yarn.scheduler.capacity.root.default.capacity</name>
    <value>50</value>
  </property>
+---+

* Running daemons.

  Assuming that the environment variables <<$HADOOP_COMMON_HOME>>, <<$HADOOP_HDFS_HOME>>, <<$HADOO_MAPRED_HOME>>,
  <<$HADOOP_YARN_HOME>>, <<$JAVA_HOME>> and <<$HADOOP_CONF_DIR>> have been set appropriately.
  Set $<<$YARN_CONF_DIR>> the same as $<<HADOOP_CONF_DIR>>
 
  Run ResourceManager and NodeManager as:
  
+---+
$ cd $HADOOP_MAPRED_HOME
$ sbin/yarn-daemon.sh start resourcemanager
$ sbin/yarn-daemon.sh start nodemanager
+---+

  You should be up and running. You can run randomwriter as:

+---+
$ $HADOOP_COMMON_HOME/bin/hadoop jar hadoop-examples.jar randomwriter out
+---+

Good luck.
