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

A. Building & Installing Falcon
===============================

0. Prerequisites
------------------

You would need the following installed:

* JDK 1.6
* Maven 3.x


1. Building Falcon
------------------

a. Building falcon from the source release
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* tar -xzvf falcon-${project.version}-source.tar.gz
* cd falcon-sources-${project.version}

* export MAVEN_OPTS="-Xmx1024m -XX:MaxPermSize=256m" && mvn clean install

[optionally -Dhadoop.version=<<hadoop.version>> can be appended to build for a specific version of hadoop]


b. Building falcon from the source repository
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

* git clone https://git-wip-us.apache.org/repos/asf/incubator-falcon.git falcon
* cd falcon
* export MAVEN_OPTS="-Xmx1024m -XX:MaxPermSize=256m" && mvn clean install

[optionally -Dhadoop.version=<<hadoop.version>> can be appended to build for a specific version of hadoop]


2. Deploying Falcon
-------------------

Once the build successfully completes, artifacts can be packaged for deployment.
By default the falcon is built for embedded mode.

* mvn clean assembly:assembly -DskipTests

Tar can be found in {project dir}/target/falcon-${project.version}-bin.tar.gz

Tar is structured as follows

|- bin
   |- falcon
   |- falcon-start
   |- falcon-stop
   |- falcon-config.sh
   |- service-start.sh
   |- service-stop.sh
|- conf
   |- startup.properties
   |- runtime.properties
   |- client.properties
   |- log4j.xml
   |- falcon-env.sh
|- docs
|- client
   |- lib (client support libs)
|- server
   |- webapp
      |- falcon.war
|- hadooplibs
|- README
|- NOTICE.txt
|- LICENSE.txt
|- DISCLAIMER.txt
|- CHANGES.txt


3. Installing & running Falcon
------------------------------

a. Installing falcon
~~~~~~~~~~~~~~~~~~~~

* tar -xzvf falcon-${project.version}-bin.tar.gz
* cd falcon-${project.version}

b. Starting Falcon Server
~~~~~~~~~~~~~~~~~~~~~~~~~

* bin/falcon-start

c. Using Falcon
~~~~~~~~~~~~~~~

* bin/falcon admin -version
  Falcon server build version: {Version:"0.3-SNAPSHOT-rd7e2be9afa2a5dc96acd1ec9e325f39c6b2f17f7",Mode:"embedded"}

* bin/falcon help
  (for more details about falcon cli usage)

d. Stopping Falcon Server
~~~~~~~~~~~~~~~~~~~~~~~~~

* bin/falcon-stop

4. Preparing oozie bundle for use with Falcon
---------------------------------------------

* cd <<project home>>
* src/bin/pacakge.sh <<hadoop-version>>
  >> ex. src/bin/pacakge.sh 1.1.2 or src/bin/pacakge.sh 0.20.2-cdh3u5
  >> oozie bundle available in target/package/oozie-4.0.0/distro/target/oozie-4.0.0-distro.tar.gz
