~~ 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.

Supported Operating Systems

  * Ambari currently supports:
  
    * RHEL/CentOS 5.*, 64-bit version

    * RHEL/CentOS 6.*, 64-bit version

Getting Ambari

  The source can be checked out anonymously from SVN with the following command:
  
+--
$ svn checkout http://svn.apache.org/repos/asf/incubator/ambari/branches/branch-0.9 ambari
+--

How to build Ambari

  You need to build Ambari RPMs from the source code that you checked out:

+--
$ yum install rpm-build
$ cd ambari/hmc/package/rpm
$ ./create_hmc_rpm.sh

$ cd ambari/mon_dashboard/package/rpm
$ ./create_dashboard_rpm.sh
+--

  When this succeeds, you will find following RPMs inside the ambari directory:

  1) ambari/hmc/package/rpm/build/rpmbuild/RPMS/noarch/ambari-0.9.0-1[.el6].noarch.rpm

  2) ambari/hmc/package/rpm/build/rpmbuild/RPMS/noarch/ambari-agent-0.9.0-1[.el6].noarch.rpm

  3) ambari/mon_dashboard/package/rpm/build/rpmbuild/RPMS/noarch/hdp_mon_dashboard-0.0.2.14-1.noarch.rpm


Installing Ambari
  
  We will refer to the node running the Ambari server as <Ambari master>
  and the nodes to which Hadoop services will be installed as <cluster nodes>.

  1) Set up password-less SSH for root on all your cluster nodes.

    * Copy root's SSH public key to all the cluster nodes in the .ssh/authorized_keys file.

    * Save the corresponding SSH private key file locally.  You will be prompted by Ambari UI to upload it during cluster installation.

  2) Install ambari-agent on each of the cluster nodes.

    * To install ambari-agent, point to the freely accessible HDP repo
that contains the required dependencies (e.g., Puppet).  Then use yum to install ambari-agent RPM and all of its dependencies.

    On RHEL/CentOS 5:

+--
$ sudo rpm -Uvh http://public-repo-1.hortonworks.com/HDP-1.0.1.14/repos/centos5/hdp-release-1.0.1.14-1.el5.noarch.rpm
$ sudo yum install epel-release
$ sudo yum install ambari-agent-0.9.0-1.noarch.rpm --nogpgcheck
+--

    On RHEL/CentOS 6:

+--
$ sudo rpm -Uvh http://public-repo-1.hortonworks.com/HDP-1.0.1.14/repos/centos6/hdp-release-1.0.1.14-1.el6.noarch.rpm
$ sudo yum install epel-release
$ sudo yum install ambari-agent-0.9.0-1.el6.noarch.rpm
+--

  3) Stop iptables on Ambari master:

    * Run the following command on the Ambari master:

+--
$ sudo service iptables stop
+--

  4) Install Ambari server on Ambari master:

    * To install Ambari server, point to the freely accessible HDP repo that contains the required dependencies (e.g., Puppet, PHP, Ruby, etc).  Then use yum to install Ambari RPMs and all of the dependencies.

    On RHEL/CentOS 5:

+--
$ sudo rpm -Uvh http://public-repo-1.hortonworks.com/HDP-1.0.1.14/repos/centos5/hdp-release-1.0.1.14-1.el5.noarch.rpm
$ sudo yum install epel-release
$ sudo yum install php-pecl-json
$ sudo yum install ambari-0.9.0-1.noarch.rpm --nogpgcheck
$ sudo yum install hdp_mon_dashboard-0.0.2.14-1.noarch.rpm --nogpgcheck
+--

    On RHEL/CentOS 6:

+--
$ sudo rpm -Uvh http://public-repo-1.hortonworks.com/HDP-1.0.1.14/repos/centos6/hdp-release-1.0.1.14-1.el6.noarch.rpm
$ sudo yum install epel-release
$ sudo yum install ambari-0.9.0-1.el6.noarch.rpm
$ sudo yum install hdp_mon_dashboard-0.0.2.14-1.noarch.rpm
+--

    * Hadoop requires JDK.  You can download following files from the Oracle website:
      {{{http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u26-download-400750.html} http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u26-download-400750.html}}
      After accepting the license and downloading the files, copy them to /var/run/hmc/downloads/ directory on the
      Ambari master (Note: Upon download, these files may have .sh extension, so make sure you remove the .sh extension
      from the filenames and also set the execute permission on them)

      1) jdk-6u26-linux-x64.bin

      2) jdk-6u26-linux-i586.bin


How to run Ambari

+--
$ sudo service ambari start
+--

  Now that Ambari server is installed and started, you can start installing Apache Hadoop and its ecosystem components on your cluster nodes by visiting:

  http://AMBARIMASTER/hmc/html/
  
  from your browser.  


Notes for Developers

  If you have made any changes to Nagios or Ganglia addons code (mon_dashboard/src/addOns/[ganglia|nagios]), you will also have to install 
  hdp_mon_ganglia_addons-0.0.2.14-1.noarch.rpm and hdp_mon_nagios_addons-0.0.2.14-1.noarch.rpm on the hosts running
  Ganglia and Nagios server, respectively, to make your changes effective.
  After your Hadoop cluster is installed using Ambari, go to the host(s) running Nagios and Ganglia server, 
  remove these pre-installed addon RPMs for Nagios and Ganglia, and install the new ones built from the source.
  To build these RPMs from the source, run:

+--
$ cd mon_dashboard/package/rpm
$ ./create_ganglia_addon_rpm.sh
$ ./create_nagios_addon_rpm.sh
+--
  
  Running the above creates the following two RPMs:

   * mon_dashboard/package/rpm/build/rpmbuild/RPMS/noarch/hdp_mon_ganglia_addons-0.0.2.14-1.noarch.rpm
   
   * mon_dashboard/package/rpm/build/rpmbuild/RPMS/noarch/hdp_mon_nagios_addons-0.0.2.14-1.noarch.rpm
  
