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

  Apache Ambari is a web-based tool for provisioning, managing, and monitoring Apache Hadoop clusters. The set of
  Hadoop components that are currently supported by Ambari includes:

  * {{{http://hadoop.apache.org/docs/hdfs} Apache Hadoop - HDFS}}

  * {{{http://hadoop.apache.org/docs/mapreduce} Apache Hadoop - MapReduce}}

  * {{{http://hive.apache.org} Apache Hive}}

  * {{{http://incubator.apache.org/hcatalog} Apache HCatalog}}

  * {{{http://hbase.apache.org} Apache HBase}}

  * {{{http://zookeeper.apache.org} Apache Zookeeper}}

  * {{{http://incubator.apache.org/oozie/} Apache Oozie}}

  * {{{http://pig.apache.org} Apache Pig}}

  * {{{http://sqoop.apache.org} Apache Sqoop}}

  []

  Ambari enables System Administrators to:

  * Provision a Hadoop Cluster
  
    * Ambari provides an easy-to-use, step-by-step wizard for installing Hadoop services across any number of hosts.
    
    * Ambari handles configuration of Hadoop services for the cluster.

  []

  * Manage a Hadoop Cluster
  
    * Ambari provides central management for starting, stopping, and reconfiguring Hadoop services across the entire cluster.

  []

  * Monitor a Hadoop Cluster
  
    * Ambari provides a dashboard for monitoring health and status of the Hadoop cluster.

    * Ambari leverages {{{http://ganglia.sourceforge.net/} Ganglia}} for metrics collection.

    * Ambari leverages {{{http://www.nagios.org/} Nagios}} for system alerting and will send emails when your attention is needed (e.g., a node goes down, remaining disk space is low, etc).
  
  []

Ambari Source

  Follow the  {{{./1.2.0/installing-hadoop-using-ambari/content/index.html} installation guide for 1.2.0 (stable)}} or check out the work going on in {{{./whats-new.html} trunk}} for the upcoming 1.2.1 release.

Roadmap

  * Support for additional Operating Systems

    * Ambari currently supports 64-bit RHEL/CentOS 5 + 6 and SLES 11

  []

  * RESTful API for integration
  
    * Ambari will expose a unified, RESTful API to enable third-party applications to integrate
      Hadoop cluster management and monitoring capabilities (1.2.0)

  []

  * Granular configurations

      * Ambari currently applies service configurations at the cluster-level. For more
        flexibility, Ambari will allow for configurations in a more granular manner, such as
        applying a set of configurations to a specific group of hosts.

  []

  * Security

      * Installation of secure Hadoop clusters (Kerberos-based)

      * Role-based user authentication, authorization, and auditing

      * Support for LDAP and Active Directory (1.2.0)

  []

  * Visualization

      * Interactive visualization of the current state of the cluster for a number of key metrics (1.2.0)

      * Interactive visualization of historical states of the cluster for a number of key metrics

      * Interactive visualization of Pig, Hive, and MapReduce jobs (1.2.0)

  []
