You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@apex.apache.org by sa...@apache.org on 2016/03/18 23:13:44 UTC

[22/26] incubator-apex-site git commit: from 7a8804b25247fa64430f6e030a81bc7389b7daf4

http://git-wip-us.apache.org/repos/asf/incubator-apex-site/blob/e411d993/content/docs/apex/application_packages/index.html
----------------------------------------------------------------------
diff --git a/content/docs/apex/application_packages/index.html b/content/docs/apex/application_packages/index.html
new file mode 100644
index 0000000..41e9a29
--- /dev/null
+++ b/content/docs/apex/application_packages/index.html
@@ -0,0 +1,779 @@
+<!DOCTYPE html>
+<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  
+  
+  
+  <title>Packages - Apache Apex Documentation</title>
+  
+
+  <link rel="shortcut icon" href="../favicon.ico">
+  
+
+  
+  <link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
+
+  <link rel="stylesheet" href="../css/theme.css" type="text/css" />
+  <link rel="stylesheet" href="../css/theme_extra.css" type="text/css" />
+  <link rel="stylesheet" href="../css/highlight.css">
+
+  
+  <script>
+    // Current page data
+    var mkdocs_page_name = "Packages";
+    var mkdocs_page_input_path = "application_packages.md";
+    var mkdocs_page_url = "/application_packages/";
+  </script>
+  
+  <script src="../js/jquery-2.1.1.min.js"></script>
+  <script src="../js/modernizr-2.8.3.min.js"></script>
+  <script type="text/javascript" src="../js/highlight.pack.js"></script>
+  <script src="../js/theme.js"></script> 
+
+  
+</head>
+
+<body class="wy-body-for-nav" role="document">
+
+  <div class="wy-grid-for-nav">
+
+    
+    <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
+      <div class="wy-side-nav-search">
+        <a href=".." class="icon icon-home"> Apache Apex Documentation</a>
+        <div role="search">
+  <form id ="rtd-search-form" class="wy-form" action="../search.html" method="get">
+    <input type="text" name="q" placeholder="Search docs" />
+  </form>
+</div>
+      </div>
+
+      <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
+        <ul class="current">
+          
+            <li>
+    <li class="toctree-l1 ">
+        <a class="" href="..">Apache Apex</a>
+        
+    </li>
+<li>
+          
+            <li>
+    <ul class="subnav">
+    <li><span>Development</span></li>
+
+        
+            
+    <li class="toctree-l1 ">
+        <a class="" href="../apex_development_setup/">Development Setup</a>
+        
+    </li>
+
+        
+            
+    <li class="toctree-l1 ">
+        <a class="" href="../application_development/">Applications</a>
+        
+    </li>
+
+        
+            
+    <li class="toctree-l1 current">
+        <a class="current" href="./">Packages</a>
+        
+            <ul>
+            
+                <li class="toctree-l3"><a href="#apache-apex-packages">Apache Apex Packages</a></li>
+                
+            
+                <li class="toctree-l3"><a href="#application-packages">Application Packages</a></li>
+                
+                    <li><a class="toctree-l4" href="#requirements">Requirements</a></li>
+                
+                    <li><a class="toctree-l4" href="#creating-your-first-apex-app-package">Creating Your First Apex App Package</a></li>
+                
+                    <li><a class="toctree-l4" href="#writing-your-own-app-package">Writing Your Own App Package</a></li>
+                
+                    <li><a class="toctree-l4" href="#zip-structure-of-application-package">Zip Structure of Application Package</a></li>
+                
+                    <li><a class="toctree-l4" href="#examining-and-launching-application-packages-through-cli">Examining and Launching Application Packages Through CLI</a></li>
+                
+            
+                <li class="toctree-l3"><a href="#configuration-packages">Configuration Packages</a></li>
+                
+                    <li><a class="toctree-l4" href="#creating-configuration-packages">Creating Configuration Packages</a></li>
+                
+                    <li><a class="toctree-l4" href="#assembling-your-own-configuration-package">Assembling your own configuration package</a></li>
+                
+            
+            </ul>
+        
+    </li>
+
+        
+            
+    <li class="toctree-l1 ">
+        <a class="" href="../operator_development/">Operators</a>
+        
+    </li>
+
+        
+            
+    <li class="toctree-l1 ">
+        <a class="" href="../autometrics/">AutoMetric API</a>
+        
+    </li>
+
+        
+    </ul>
+<li>
+          
+            <li>
+    <ul class="subnav">
+    <li><span>Operations</span></li>
+
+        
+            
+    <li class="toctree-l1 ">
+        <a class="" href="../dtcli/">dtCli</a>
+        
+    </li>
+
+        
+    </ul>
+<li>
+          
+        </ul>
+      </div>
+      &nbsp;
+    </nav>
+
+    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
+
+      
+      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
+        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
+        <a href="..">Apache Apex Documentation</a>
+      </nav>
+
+      
+      <div class="wy-nav-content">
+        <div class="rst-content">
+          <div role="navigation" aria-label="breadcrumbs navigation">
+  <ul class="wy-breadcrumbs">
+    <li><a href="..">Docs</a> &raquo;</li>
+    
+      
+        
+          <li>Development &raquo;</li>
+        
+      
+    
+    <li>Packages</li>
+    <li class="wy-breadcrumbs-aside">
+      
+    </li>
+  </ul>
+  <hr/>
+</div>
+          <div role="main">
+            <div class="section">
+              
+                <h1 id="apache-apex-packages">Apache Apex Packages</h1>
+<h1 id="application-packages">Application Packages</h1>
+<p>An Apache Apex Application Package is a zip file that contains all the
+necessary files to launch an application in Apache Apex. It is the
+standard way for assembling and sharing an Apache Apex application.</p>
+<h2 id="requirements">Requirements</h2>
+<p>You will need have the following installed:</p>
+<ol>
+<li>Apache Maven 3.0 or later (for assembling the App Package)</li>
+<li>Apache Apex 3.2.0 or later (for launching the App Package in your cluster)</li>
+</ol>
+<h2 id="creating-your-first-apex-app-package">Creating Your First Apex App Package</h2>
+<p>You can create an Apex Application Package using your Linux command
+line, or using your favorite IDE.</p>
+<h3 id="using-command-line">Using Command Line</h3>
+<p>First, change to the directory where you put your projects, and create
+an Apex application project using Maven by running the following
+command.  Replace "com.example", "mydtapp" and "1.0-SNAPSHOT" with the
+appropriate values (make sure this is all on one line):</p>
+<pre><code>$ mvn archetype:generate \
+ -DarchetypeGroupId=org.apache.apex \
+ -DarchetypeArtifactId=apex-app-archetype -DarchetypeVersion=3.2.0-incubating \
+ -DgroupId=com.example -Dpackage=com.example.mydtapp -DartifactId=mydtapp \
+ -Dversion=1.0-SNAPSHOT
+</code></pre>
+<p>This creates a Maven project named "mydtapp". Open it with your favorite
+IDE (e.g. NetBeans, Eclipse, IntelliJ IDEA). In the project, there is a
+sample DAG that generates a number of tuples with a random number and
+prints out "hello world" and the random number in the tuples.  The code
+that builds the DAG is in
+src/main/java/com/example/mydtapp/Application.java, and the code that
+runs the unit test for the DAG is in
+src/test/java/com/example/mydtapp/ApplicationTest.java. Try it out by
+running the following command:</p>
+<pre><code>$cd mydtapp; mvn package
+</code></pre>
+<p>This builds the App Package runs the unit test of the DAG.  You should
+be getting test output similar to this:</p>
+<pre><code> -------------------------------------------------------
+  TESTS
+ -------------------------------------------------------
+
+ Running com.example.mydtapp.ApplicationTest
+ hello world: 0.8015370953286478
+ hello world: 0.9785359225545481
+ hello world: 0.6322611586644047
+ hello world: 0.8460953663451775
+ hello world: 0.5719372906929072
+ hello world: 0.6361174312337172
+ hello world: 0.14873007534816318
+ hello world: 0.8866986277418261
+ hello world: 0.6346526809866057
+ hello world: 0.48587295703904465
+ hello world: 0.6436832429676687
+
+ ...
+
+ Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 11.863
+ sec
+
+ Results :
+
+ Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
+</code></pre>
+
+<p>The "mvn package" command creates the App Package file in target
+directory as target/mydtapp-1.0-SNAPSHOT.apa. You will be able to use
+that App Package file to launch this sample application in your actual
+Apex installation.</p>
+<p>Alternatively you can perform the same steps within your IDE (IDEA IntelliJ, Eclipse, NetBeans all support it). Please check the IDE documentation for details.</p>
+<p>Group ID: org.apache.apex
+Artifact ID: apex-app-archetype
+Version: 3.2.0-incubating (or any later version)</p>
+<h2 id="writing-your-own-app-package">Writing Your Own App Package</h2>
+<p>Please refer to the <a href="http://docs.datatorrent.com/create/">Creating Apps</a> on the basics on how to write an Apache Apex application.  In your AppPackage project, you can add custom operators (refer to <a href="../operator_development/">Operator Development Guide</a>, project dependencies, default and required configuration properties, pre-set configurations and other metadata.</p>
+<h3 id="adding-and-removing-project-dependencies">Adding (and removing) project dependencies</h3>
+<p>Under the project, you can add project dependencies in pom.xml, or do it
+through your IDE.  Here’s the section that describes the dependencies in
+the default pom.xml:</p>
+<pre><code>  &lt;dependencies&gt;
+    &lt;!-- add your dependencies here --&gt;
+    &lt;dependency&gt;
+      &lt;groupId&gt;org.apache.apex&lt;/groupId&gt;
+      &lt;artifactId&gt;malhar-library&lt;/artifactId&gt;
+      &lt;version&gt;${apex.version}&lt;/version&gt;
+      &lt;!--
+           If you know your application do not need the transitive dependencies that are pulled in by malhar-library,
+           Uncomment the following to reduce the size of your app package.
+      --&gt;
+      &lt;!--
+      &lt;exclusions&gt;
+        &lt;exclusion&gt;
+          &lt;groupId&gt;*&lt;/groupId&gt;
+          &lt;artifactId&gt;*&lt;/artifactId&gt;
+        &lt;/exclusion&gt;
+      &lt;/exclusions&gt;
+      --&gt;
+    &lt;/dependency&gt;
+    &lt;dependency&gt;
+      &lt;groupId&gt;org.apache.apex&lt;/groupId&gt;
+      &lt;artifactId&gt;apex-engine&lt;/artifactId&gt;
+      &lt;version&gt;${apex.version}&lt;/version&gt;
+      &lt;scope&gt;provided&lt;/scope&gt;
+    &lt;/dependency&gt;
+    &lt;dependency&gt;
+      &lt;groupId&gt;junit&lt;/groupId&gt;
+      &lt;artifactId&gt;junit&lt;/artifactId&gt;
+      &lt;version&gt;4.10&lt;/version&gt;
+      &lt;scope&gt;test&lt;/scope&gt;
+    &lt;/dependency&gt;
+  &lt;/dependencies&gt;
+</code></pre>
+
+<p>By default, as shown above, the default dependencies include
+malhar-library in compile scope, dt-engine in provided scope, and junit
+in test scope.  Do not remove these three dependencies since they are
+necessary for any Apex application.  You can, however, exclude
+transitive dependencies from malhar-library to reduce the size of your
+App Package, provided that none of the operators in malhar-library that
+need the transitive dependencies will be used in your application.</p>
+<p>In the sample application, it is safe to remove the transitive
+dependencies from malhar-library, by uncommenting the "exclusions"
+section.  It will reduce the size of the sample App Package from 8MB to
+700KB.</p>
+<p>Note that if we exclude *, in some versions of Maven, you may get
+warnings similar to the following:</p>
+<pre><code>
+ [WARNING] 'dependencies.dependency.exclusions.exclusion.groupId' for
+ org.apache.apex:malhar-library:jar with value '*' does not match a
+ valid id pattern.
+
+ [WARNING]
+ [WARNING] It is highly recommended to fix these problems because they
+ threaten the stability of your build.
+ [WARNING]
+ [WARNING] For this reason, future Maven versions might no longer support
+ building such malformed projects.
+ [WARNING]
+
+</code></pre>
+
+<p>This is a bug in early versions of Maven 3.  The dependency exclusion is
+still valid and it is safe to ignore these warnings.</p>
+<h3 id="application-configuration">Application Configuration</h3>
+<p>A configuration file can be used to configure an application.  Different
+kinds of configuration parameters can be specified. They are application
+attributes, operator attributes and properties, port attributes, stream
+properties and application specific properties. They are all specified
+as name value pairs, in XML format, like the following.</p>
+<pre><code>&lt;?xml version=&quot;1.0&quot;?&gt;
+&lt;configuration&gt;
+  &lt;property&gt;
+    &lt;name&gt;some_name_1&lt;/name&gt;
+    &lt;value&gt;some_default_value&lt;/value&gt;
+  &lt;/property&gt;
+  &lt;property&gt;
+    &lt;name&gt;some_name_2&lt;/name&gt;
+    &lt;value&gt;some_default_value&lt;/value&gt;
+  &lt;/property&gt;
+&lt;/configuration&gt;
+</code></pre>
+
+<h3 id="application-attributes">Application attributes</h3>
+<p>Application attributes are used to specify the platform behavior for the
+application. They can be specified using the parameter
+<code>dt.attr.&lt;attribute&gt;</code>. The prefix “dt” is a constant, “attr” is a
+constant denoting an attribute is being specified and <code>&lt;attribute&gt;</code>
+specifies the name of the attribute. Below is an example snippet setting
+the streaming windows size of the application to be 1000 milliseconds.</p>
+<pre><code>  &lt;property&gt;
+     &lt;name&gt;dt.attr.STREAMING_WINDOW_SIZE_MILLIS&lt;/name&gt;
+     &lt;value&gt;1000&lt;/value&gt;
+  &lt;/property&gt;
+</code></pre>
+
+<p>The name tag specifies the attribute and value tag specifies the
+attribute value. The name of the attribute is a JAVA constant name
+identifying the attribute. The constants are defined in
+com.datatorrent.api.Context.DAGContext and the different attributes can
+be specified in the format described above.</p>
+<h3 id="operator-attributes">Operator attributes</h3>
+<p>Operator attributes are used to specify the platform behavior for the
+operator. They can be specified using the parameter
+<code>dt.operator.&lt;operator-name&gt;.attr.&lt;attribute&gt;</code>. The prefix “dt” is a
+constant, “operator” is a constant denoting that an operator is being
+specified, <code>&lt;operator-name&gt;</code> denotes the name of the operator, “attr” is
+the constant denoting that an attribute is being specified and
+<code>&lt;attribute&gt;</code> is the name of the attribute. The operator name is the
+same name that is specified when the operator is added to the DAG using
+the addOperator method. An example illustrating the specification is
+shown below. It specifies the number of streaming windows for one
+application window of an operator named “input” to be 10</p>
+<pre><code>&lt;property&gt;
+  &lt;name&gt;dt.operator.input.attr.APPLICATION_WINDOW_COUNT&lt;/name&gt;
+  &lt;value&gt;10&lt;/value&gt;
+&lt;/property&gt;
+</code></pre>
+
+<p>The name tag specifies the attribute and value tag specifies the
+attribute value. The name of the attribute is a JAVA constant name
+identifying the attribute. The constants are defined in
+com.datatorrent.api.Context.OperatorContext and the different attributes
+can be specified in the format described above.</p>
+<h3 id="operator-properties">Operator properties</h3>
+<p>Operators can be configured using operator specific properties. The
+properties can be specified using the parameter
+<code>dt.operator.&lt;operator-name&gt;.prop.&lt;property-name&gt;</code>. The difference
+between this and the operator attribute specification described above is
+that the keyword “prop” is used to denote that it is a property and
+<code>&lt;property-name&gt;</code> specifies the property name.  An example illustrating
+this is specified below. It specifies the property “hostname” of the
+redis server for a “redis” output operator.</p>
+<pre><code>  &lt;property&gt;
+    &lt;name&gt;dt.operator.redis.prop.host&lt;/name&gt;
+    &lt;value&gt;127.0.0.1&lt;/value&gt;
+  &lt;/property&gt;
+</code></pre>
+
+<p>The name tag specifies the property and the value specifies the property
+value. The property name is converted to a setter method which is called
+on the actual operator. The method name is composed by appending the
+word “set” and the property name with the first character of the name
+capitalized. In the above example the setter method would become
+setHost. The method is called using JAVA reflection and the property
+value is passed as an argument. In the above example the method setHost
+will be called on the “redis” operator with “127.0.0.1” as the argument.</p>
+<h3 id="port-attributes">Port attributes</h3>
+<p>Port attributes are used to specify the platform behavior for input and
+output ports. They can be specified using the parameter <code>dt.operator.&lt;operator-name&gt;.inputport.&lt;port-name&gt;.attr.&lt;attribute&gt;</code>
+for input port and <code>dt.operator.&lt;operator-name&gt;.outputport.&lt;port-name&gt;.attr.&lt;attribute&gt;</code>
+for output port. The keyword “inputport” is used to denote an input port
+and “outputport” to denote an output port. The rest of the specification
+follows the conventions described in other specifications above. An
+example illustrating this is specified below. It specifies the queue
+capacity for an input port named “input” of an operator named “range” to
+be 4k.</p>
+<pre><code>&lt;property&gt;
+  &lt;name&gt;dt.operator.range.inputport.input.attr.QUEUE_CAPACITY&lt;/name&gt;
+  &lt;value&gt;4000&lt;/value&gt;
+&lt;/property&gt;
+</code></pre>
+
+<p>The name tag specifies the attribute and value tag specifies the
+attribute value. The name of the attribute is a JAVA constant name
+identifying the attribute. The constants are defined in
+com.datatorrent.api.Context.PortContext and the different attributes can
+be specified in the format described above.</p>
+<p>The attributes for an output port can also be specified in a similar way
+as described above with a change that keyword “outputport” is used
+instead of “intputport”. A generic keyword “port” can be used to specify
+either an input or an output port. It is useful in the wildcard
+specification described below.</p>
+<h3 id="stream-properties">Stream properties</h3>
+<p>Streams can be configured using stream properties. The properties can be
+specified using the parameter
+<code>dt.stream.&lt;stream-name&gt;.prop.&lt;property-name&gt;</code>  The constant “stream”
+specifies that it is a stream, <code>&lt;stream-name&gt;</code> specifies the name of the
+stream and <code>&lt;property-name&gt;</code> the name of the property. The name of the
+stream is the same name that is passed when the stream is added to the
+DAG using the addStream method. An example illustrating the
+specification is shown below. It sets the locality of the stream named
+“stream1” to container local indicating that the operators the stream is
+connecting be run in the same container.</p>
+<pre><code>  &lt;property&gt;
+    &lt;name&gt;dt.stream.stream1.prop.locality&lt;/name&gt;
+    &lt;value&gt;CONTAINER_LOCAL&lt;/value&gt;
+  &lt;/property&gt;
+</code></pre>
+
+<p>The property name is converted into a set method on the stream in the
+same way as described in operator properties section above. In this case
+the method would be setLocality and it will be called in the stream
+“stream1” with the value as the argument.</p>
+<p>Along with the above system defined parameters, the applications can
+define their own specific parameters they can be specified in the
+configuration file. The only condition is that the names of these
+parameters don’t conflict with the system defined parameters or similar
+application parameters defined by other applications. To this end, it is
+recommended that the application parameters have the format
+<code>&lt;full-application-class-name&gt;.&lt;param-name&gt;.</code> The
+full-application-class-name is the full JAVA class name of the
+application including the package path and param-name is the name of the
+parameter within the application. The application will still have to
+still read the parameter in using the configuration API of the
+configuration object that is passed in populateDAG.</p>
+<h3 id="wildcards">Wildcards</h3>
+<p>Wildcards and regular expressions can be used in place of names to
+specify a group for applications, operators, ports or streams. For
+example, to specify an attribute for all ports of an operator it can be
+done as follows</p>
+<pre><code>&lt;property&gt;
+  &lt;name&gt;dt.operator.range.port.*.attr.QUEUE_CAPACITY&lt;/name&gt;
+  &lt;value&gt;4000&lt;/value&gt;
+&lt;/property&gt;
+</code></pre>
+
+<p>The wildcard “*” was used instead of the name of the port. Wildcard can
+also be used for operator name, stream name or application name. Regular
+expressions can also be used for names to specify attributes or
+properties for a specific set.</p>
+<h3 id="adding-configuration-properties">Adding configuration properties</h3>
+<p>It is common for applications to require configuration parameters to
+run.  For example, the address and port of the database, the location of
+a file for ingestion, etc.  You can specify them in
+src/main/resources/META-INF/properties.xml under the App Package
+project. The properties.xml may look like:</p>
+<pre><code>&lt;?xml version=&quot;1.0&quot;?&gt;
+&lt;configuration&gt;
+  &lt;property&gt;
+    &lt;name&gt;some_name_1&lt;/name&gt;
+  &lt;/property&gt;
+  &lt;property&gt;
+    &lt;name&gt;some_name_2&lt;/name&gt;
+    &lt;value&gt;some_default_value&lt;/value&gt;
+  &lt;/property&gt;
+&lt;/configuration&gt;
+</code></pre>
+
+<p>The name of an application-specific property takes the form of:</p>
+<p><code>dt.operator.{opName}.prop.{propName}</code></p>
+<p>The first represents the property with name propName of operator opName.
+ Or you can set the application name at run time by setting this
+property:</p>
+<pre><code>    dt.attr.APPLICATION_NAME
+</code></pre>
+<p>In this example, property some_name_1 is a required property which
+must be set at launch time, or it must be set by a pre-set configuration
+(see next section).  Property some_name_2 is a property that is
+assigned with value some_default_value unless it is overridden at
+launch time.</p>
+<h3 id="adding-pre-set-configurations">Adding pre-set configurations</h3>
+<p>At build time, you can add pre-set configurations to the App Package by
+adding configuration XML files under <code>src/site/conf/&lt;conf&gt;.xml</code>in your
+project.  You can then specify which configuration to use at launch
+time.  The configuration XML is of the same format of the properties.xml
+file.</p>
+<h3 id="application-specific-properties-file">Application-specific properties file</h3>
+<p>You can also specify properties.xml per application in the application
+package.  Just create a file with the name properties-{appName}.xml and
+it will be picked up when you launch the application with the specified
+name within the application package.  In short:</p>
+<p>properties.xml: Properties that are global to the Configuration
+Package</p>
+<p>properties-{appName}.xml: Properties that are specific when launching
+an application with the specified appName.</p>
+<h3 id="properties-source-precedence">Properties source precedence</h3>
+<p>If properties with the same key appear in multiple sources (e.g. from
+app package default configuration as META-INF/properties.xml, from app
+package configuration in the conf directory, from launch time defines,
+etc), the precedence of sources, from highest to lowest, is as follows:</p>
+<ol>
+<li>Launch time defines (using -D option in CLI)</li>
+<li>Launch time specified configuration file in file system (using -conf
+    option in CLI)</li>
+<li>Launch time specified package configuration (using -apconf option in
+    CLI)</li>
+<li>Configuration from \$HOME/.dt/dt-site.xml</li>
+<li>Application defaults within the package as
+    META-INF/properties-{appname}.xml</li>
+<li>Package defaults as META-INF/properties.xml</li>
+<li>dt-site.xml in local DT installation</li>
+<li>dt-site.xml stored in HDFS</li>
+</ol>
+<h3 id="other-meta-data">Other meta-data</h3>
+<p>In a Apex App Package project, the pom.xml file contains a
+section that looks like:</p>
+<pre><code>&lt;properties&gt;
+  &lt;apex.version&gt;3.2.0-incubating&lt;/apex.version&gt;
+  &lt;apex.apppackage.classpath\&gt;lib*.jar&lt;/apex.apppackage.classpath&gt;
+&lt;/properties&gt;
+</code></pre>
+
+<p>apex.version is the Apache Apex version that are to be used
+with this Application Package.</p>
+<p>apex.apppackage.classpath is the classpath that is used when
+launching the application in the Application Package.  The default is
+lib/*.jar, where lib is where all the dependency jars are kept within
+the Application Package.  One reason to change this field is when your
+Application Package needs the classpath in a specific order.</p>
+<h3 id="logging-configuration">Logging configuration</h3>
+<p>Just like other Java projects, you can change the logging configuration
+by having your log4j.properties under src/main/resources.  For example,
+if you have the following in src/main/resources/log4j.properties:</p>
+<pre><code> log4j.rootLogger=WARN,CONSOLE
+ log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
+ log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
+ log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [%t] %-5p
+ %c{2} %M - %m%n
+</code></pre>
+
+<p>The root logger’s level is set to WARN and the output is set to the console (stdout).</p>
+<p>Note that by default from project created from the maven archetype,
+there is already a log4j.properties file under src/test/resources and
+that file is only used for the unit test.</p>
+<h2 id="zip-structure-of-application-package">Zip Structure of Application Package</h2>
+<p>Apache Apex Application Package files are zip files.  You can examine the content of any Application Package by using unzip -t on your Linux command line.</p>
+<p>There are four top level directories in an Application Package:</p>
+<ol>
+<li>"app" contains the jar files of the DAG code and any custom operators.</li>
+<li>"lib" contains all dependency jars</li>
+<li>"conf" contains all the pre-set configuration XML files.</li>
+<li>"META-INF" contains the MANIFEST.MF file and the properties.xml file.</li>
+<li>“resources” contains any other files</li>
+</ol>
+<h2 id="examining-and-launching-application-packages-through-cli">Examining and Launching Application Packages Through CLI</h2>
+<p>If you are working with Application Packages in the local filesystem, you can use the Apex Command Line Interface (dtcli).  </p>
+<h3 id="getting-application-package-meta-information">Getting Application Package Meta Information</h3>
+<p>You can get the meta information about the Application Package using
+this Apex CLI command.</p>
+<pre><code> dt&gt; get-app-package-info &lt;app-package-file&gt;
+</code></pre>
+
+<h3 id="getting-available-operators-in-application-package">Getting Available Operators In Application Package</h3>
+<p>You can get the list of available operators in the Application Package
+using this command.</p>
+<pre><code> dt&gt; get-app-package-operators &lt;app-package-file&gt; &lt;package-prefix&gt;
+ [parent-class]
+</code></pre>
+
+<h3 id="getting-properties-of-operators-in-application-package">Getting Properties of Operators in Application Package</h3>
+<p>You can get the list of properties of any operator in the Application
+Package using this command.</p>
+<p>dt&gt; get-app-package-operator-properties <app-package-file> <operator-class></p>
+<h3 id="launching-an-application-package">Launching an Application Package</h3>
+<p>You can launch an application within an Application Package.</p>
+<pre><code>dt&gt; launch [-D property-name=property-value, ...] [-conf config-name]
+ [-apconf config-file-within-app-package] &lt;app-package-file&gt;
+ [matching-app-name]
+</code></pre>
+
+<p>Note that -conf expects a configuration file in the file system, while -apconf expects a configuration file within the app package.</p>
+<h1 id="configuration-packages">Configuration Packages</h1>
+<p>Sometimes just a configuration file is not enough for launching an application package. If a configuration requires
+additional files to be packaged, you can use an Apex Configuration Package.</p>
+<h2 id="creating-configuration-packages">Creating Configuration Packages</h2>
+<p>Creating Configuration Packages is similar to creating Application Packages. You can create a configuration 
+package project using Maven by running the following command. Replace "com.example", "mydtconfig" and "1.0-SNAPSHOT" with the appropriate values:</p>
+<pre><code>$ mvn archetype:generate -DarchetypeGroupId=org.apache.apex \
+  -DarchetypeArtifactId=apex-conf-archetype -DarchetypeVersion=3.2.0-incubating \
+  -DgroupId=com.example -Dpackage=com.example.mydtconfig -DartifactId=mydtconfig \
+  -Dversion=1.0-SNAPSHOT
+</code></pre>
+
+<p>And create the configuration package file by running:</p>
+<pre><code>$ mvn package
+</code></pre>
+
+<p>The "mvn package" command creates the Config Package file in target
+directory as target/mydtconfig.apc. You will be able to use that
+Configuration Package file to launch an Apache Apex application.</p>
+<h2 id="assembling-your-own-configuration-package">Assembling your own configuration package</h2>
+<p>Inside the project created by the archetype, these are the files that
+you should know about when assembling your own configuration package:</p>
+<pre><code>./pom.xml
+./src/main/resources/classpath
+./src/main/resources/files
+./src/main/resources/META-INF/properties.xml
+./src/main/resources/META-INF/properties-{appname}.xml
+</code></pre>
+<h3 id="pomxml">pom.xml</h3>
+<p>Example:</p>
+<pre><code class="xml">  &lt;groupId&gt;com.example&lt;/groupId&gt;
+  &lt;version&gt;1.0.0&lt;/version&gt;
+  &lt;artifactId&gt;mydtconf&lt;/artifactId&gt;
+  &lt;packaging&gt;jar&lt;/packaging&gt;
+  &lt;!-- change these to the appropriate values --&gt;
+  &lt;name&gt;My Apex Application Configuration&lt;/name&gt;
+  &lt;description&gt;My Custom Application Configuration Description&lt;/description&gt;
+  &lt;properties&gt;
+    &lt;apex.apppackage.name&gt;myapexapp&lt;/apex.apppackage.name&gt;
+    &lt;apex.apppackage.minversion&gt;1.0.0&lt;/apex.apppackage.minversion&gt;
+    &lt;apex.apppackage.maxversion&gt;1.9999.9999&lt;/apex.apppackage.maxversion&gt;
+    &lt;apex.appconf.classpath&gt;classpath/*&lt;/apex.appconf.classpath&gt;
+    &lt;apex.appconf.files&gt;files/*&lt;/apex.appconf.files&gt;
+  &lt;/properties&gt;
+
+</code></pre>
+
+<p>In pom.xml, you can change the following keys to your desired values</p>
+<ul>
+<li><code>&lt;groupId&gt;</code></li>
+<li><code>&lt;version&gt;</code></li>
+<li><code>&lt;artifactId&gt;</code></li>
+<li><code>&lt;name&gt;</code></li>
+<li><code>&lt;description&gt;</code></li>
+</ul>
+<p>You can also change the values of</p>
+<ul>
+<li><code>&lt;apex.apppackage.name&gt;</code></li>
+<li><code>&lt;apex.apppackage.minversion&gt;</code></li>
+<li><code>&lt;apex.apppackage.maxversion&gt;</code></li>
+</ul>
+<p>to reflect what Application Packages can be used with this configuration package.  Apex will use this information to check whether a
+configuration package is compatible with the Application Package when you issue a launch command.</p>
+<h3 id="srcmainresourcesclasspath">./src/main/resources/classpath</h3>
+<p>Place any file in this directory that you’d like to be copied to the
+compute machines when launching an application and included in the
+classpath of the application.  Example of such files are Java properties
+files and jar files.</p>
+<h3 id="srcmainresourcesfiles">./src/main/resources/files</h3>
+<p>Place any file in this directory that you’d like to be copied to the
+compute machines when launching an application but not included in the
+classpath of the application.</p>
+<h3 id="properties-xml-file">Properties XML file</h3>
+<p>A properties xml file consists of a set of key-value pairs.  The set of
+key-value pairs specifies the configuration options the application
+should be launched with.</p>
+<p>Example:</p>
+<pre><code class="xml">&lt;configuration&gt;
+  &lt;property&gt;
+    &lt;name&gt;some-property-name&lt;/name&gt;
+    &lt;value&gt;some-property-value&lt;/value&gt;
+  &lt;/property&gt;
+   ...
+&lt;/configuration&gt;
+</code></pre>
+
+<p>Names of properties XML file:</p>
+<ul>
+<li><strong>properties.xml:</strong> Properties that are global to the Configuration
+Package</li>
+<li><strong>properties-{appName}.xml:</strong> Properties that are specific when launching
+an application with the specified appName within the Application
+Package.</li>
+</ul>
+<p>After you are done with the above, remember to do mvn package to
+generate a new configuration package, which will be located in the
+target directory in your project.</p>
+<h3 id="zip-structure-of-configuration-package">Zip structure of configuration package</h3>
+<p>Apex Application Configuration Package files are zip files.  You
+can examine the content of any Application Configuration Package by
+using unzip -t on your Linux command line.  The structure of the zip
+file is as follow:</p>
+<pre><code>META-INF
+  MANIFEST.MF
+  properties.xml
+  properties-{appname}.xml
+classpath
+  {classpath files}
+files
+  {files}
+</code></pre>
+
+<h3 id="launching-with-cli">Launching with CLI</h3>
+<p><code>-conf</code> option of the launch command in CLI supports specifying configuration package in the local filesystem.  Example:</p>
+<pre><code>dt\&gt; launch mydtapp-1.0.0.apa -conf mydtconfig.apc
+</code></pre>
+<p>This command expects both the application package and the configuration package to be in the local file system.</p>
+              
+            </div>
+          </div>
+          <footer>
+  
+    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
+      
+        <a href="../operator_development/" class="btn btn-neutral float-right" title="Operators">Next <span class="icon icon-circle-arrow-right"></span></a>
+      
+      
+        <a href="../application_development/" class="btn btn-neutral" title="Applications"><span class="icon icon-circle-arrow-left"></span> Previous</a>
+      
+    </div>
+  
+
+  <hr/>
+
+  <div role="contentinfo">
+    <!-- Copyright etc -->
+    
+  </div>
+
+  Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
+</footer>
+	  
+        </div>
+      </div>
+
+    </section>
+
+  </div>
+
+<div class="rst-versions" role="note" style="cursor: pointer">
+    <span class="rst-current-version" data-toggle="rst-current-version">
+      
+      
+        <span><a href="../application_development/" style="color: #fcfcfc;">&laquo; Previous</a></span>
+      
+      
+        <span style="margin-left: 15px"><a href="../operator_development/" style="color: #fcfcfc">Next &raquo;</a></span>
+      
+    </span>
+</div>
+
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/incubator-apex-site/blob/e411d993/content/docs/apex/autometrics/index.html
----------------------------------------------------------------------
diff --git a/content/docs/apex/autometrics/index.html b/content/docs/apex/autometrics/index.html
new file mode 100644
index 0000000..6fd3fd8
--- /dev/null
+++ b/content/docs/apex/autometrics/index.html
@@ -0,0 +1,384 @@
+<!DOCTYPE html>
+<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  
+  
+  
+  <title>AutoMetric API - Apache Apex Documentation</title>
+  
+
+  <link rel="shortcut icon" href="../favicon.ico">
+  
+
+  
+  <link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
+
+  <link rel="stylesheet" href="../css/theme.css" type="text/css" />
+  <link rel="stylesheet" href="../css/theme_extra.css" type="text/css" />
+  <link rel="stylesheet" href="../css/highlight.css">
+
+  
+  <script>
+    // Current page data
+    var mkdocs_page_name = "AutoMetric API";
+    var mkdocs_page_input_path = "autometrics.md";
+    var mkdocs_page_url = "/autometrics/";
+  </script>
+  
+  <script src="../js/jquery-2.1.1.min.js"></script>
+  <script src="../js/modernizr-2.8.3.min.js"></script>
+  <script type="text/javascript" src="../js/highlight.pack.js"></script>
+  <script src="../js/theme.js"></script> 
+
+  
+</head>
+
+<body class="wy-body-for-nav" role="document">
+
+  <div class="wy-grid-for-nav">
+
+    
+    <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
+      <div class="wy-side-nav-search">
+        <a href=".." class="icon icon-home"> Apache Apex Documentation</a>
+        <div role="search">
+  <form id ="rtd-search-form" class="wy-form" action="../search.html" method="get">
+    <input type="text" name="q" placeholder="Search docs" />
+  </form>
+</div>
+      </div>
+
+      <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
+        <ul class="current">
+          
+            <li>
+    <li class="toctree-l1 ">
+        <a class="" href="..">Apache Apex</a>
+        
+    </li>
+<li>
+          
+            <li>
+    <ul class="subnav">
+    <li><span>Development</span></li>
+
+        
+            
+    <li class="toctree-l1 ">
+        <a class="" href="../apex_development_setup/">Development Setup</a>
+        
+    </li>
+
+        
+            
+    <li class="toctree-l1 ">
+        <a class="" href="../application_development/">Applications</a>
+        
+    </li>
+
+        
+            
+    <li class="toctree-l1 ">
+        <a class="" href="../application_packages/">Packages</a>
+        
+    </li>
+
+        
+            
+    <li class="toctree-l1 ">
+        <a class="" href="../operator_development/">Operators</a>
+        
+    </li>
+
+        
+            
+    <li class="toctree-l1 current">
+        <a class="current" href="./">AutoMetric API</a>
+        
+            <ul>
+            
+                <li class="toctree-l3"><a href="#apache-apex-autometrics">Apache Apex AutoMetrics</a></li>
+                
+            
+                <li class="toctree-l3"><a href="#introduction">Introduction</a></li>
+                
+            
+                <li class="toctree-l3"><a href="#specifying-autometrics-in-an-operator">Specifying AutoMetrics in an Operator</a></li>
+                
+            
+                <li class="toctree-l3"><a href="#aggregating-autometrics-across-partitions">Aggregating AutoMetrics across Partitions</a></li>
+                
+                    <li><a class="toctree-l4" href="#default-aggregators">Default aggregators</a></li>
+                
+                    <li><a class="toctree-l4" href="#building-custom-aggregators">Building custom aggregators</a></li>
+                
+            
+                <li class="toctree-l3"><a href="#retrieving-autometrics">Retrieving AutoMetrics</a></li>
+                
+            
+                <li class="toctree-l3"><a href="#system-metrics">System Metrics</a></li>
+                
+            
+            </ul>
+        
+    </li>
+
+        
+    </ul>
+<li>
+          
+            <li>
+    <ul class="subnav">
+    <li><span>Operations</span></li>
+
+        
+            
+    <li class="toctree-l1 ">
+        <a class="" href="../dtcli/">dtCli</a>
+        
+    </li>
+
+        
+    </ul>
+<li>
+          
+        </ul>
+      </div>
+      &nbsp;
+    </nav>
+
+    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
+
+      
+      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
+        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
+        <a href="..">Apache Apex Documentation</a>
+      </nav>
+
+      
+      <div class="wy-nav-content">
+        <div class="rst-content">
+          <div role="navigation" aria-label="breadcrumbs navigation">
+  <ul class="wy-breadcrumbs">
+    <li><a href="..">Docs</a> &raquo;</li>
+    
+      
+        
+          <li>Development &raquo;</li>
+        
+      
+    
+    <li>AutoMetric API</li>
+    <li class="wy-breadcrumbs-aside">
+      
+    </li>
+  </ul>
+  <hr/>
+</div>
+          <div role="main">
+            <div class="section">
+              
+                <h1 id="apache-apex-autometrics">Apache Apex AutoMetrics</h1>
+<h1 id="introduction">Introduction</h1>
+<p>Metrics collect various statistical information about a process which can be very useful for diagnosis. Auto Metrics in Apex can help monitor operators in a running application.  The goal of <em>AutoMetric</em> API is to enable operator developer to define relevant metrics for an operator in a simple way which the platform collects and reports automatically.</p>
+<h1 id="specifying-autometrics-in-an-operator">Specifying AutoMetrics in an Operator</h1>
+<p>An <em>AutoMetric</em> can be any object. It can be of a primitive type - int, long, etc. or a complex one. A field or a <code>get</code> method in an operator can be annotated with <code>@AutoMetric</code> to specify that its value is a metric. After every application end window, the platform collects the values of these fields/methods in a map and sends it to application master.</p>
+<pre><code class="java">public class LineReceiver extends BaseOperator
+{
+ @AutoMetric
+ long length;
+
+ @AutoMetric
+ long count;
+
+ public final transient DefaultInputPort&lt;String&gt; input = new DefaultInputPort&lt;String&gt;()
+ {
+   @Override
+   public void process(String s)
+   {
+     length += s.length();
+     count++;
+   }
+ };
+
+ @Override
+ public void beginWindow(long windowId)
+ {
+   length = 0;
+   count = 0;
+ }
+}
+</code></pre>
+
+<p>There are 2 auto-metrics declared in the <code>LineReceiver</code>. At the end of each application window, the platform will send a map with 2 entries - <code>[(length, 100), (count, 10)]</code> to the application master.</p>
+<h1 id="aggregating-autometrics-across-partitions">Aggregating AutoMetrics across Partitions</h1>
+<p>When an operator is partitioned, it is useful to aggregate the values of auto-metrics across all its partitions every window to get a logical view of these metrics. The application master performs these aggregations using metrics aggregators.</p>
+<p>The AutoMetric API helps to achieve this by providing an interface for writing aggregators- <code>AutoMetric.Aggregator</code>. Any implementation of <code>AutoMetric.Aggregator</code> can be set as an operator attribute - <code>METRICS_AGGREGATOR</code> for a particular operator which in turn is used for aggregating physical metrics.</p>
+<h2 id="default-aggregators">Default aggregators</h2>
+<p><a href="https://github.com/apache/incubator-apex-core/blob/devel-3/common/src/main/java/com/datatorrent/common/metric/MetricsAggregator.java"><code>MetricsAggregator</code></a> is a simple implementation of <code>AutoMetric.Aggregator</code> that platform uses as a default for summing up primitive types - int, long, float and double.</p>
+<p><code>MetricsAggregator</code> is just a collection of <code>SingleMetricAggregator</code>s. There are multiple implementations of <code>SingleMetricAggregator</code> that perform sum, min, max, avg which are present in Apex core and Apex malhar.</p>
+<p>For the <code>LineReceiver</code> operator, the application developer need not specify any aggregator. The platform will automatically inject an instance of <code>MetricsAggregator</code> that contains two <code>LongSumAggregator</code>s - one for <code>length</code> and one for <code>count</code>. This aggregator will report sum of length and sum of count across all the partitions of <code>LineReceiver</code>.</p>
+<h2 id="building-custom-aggregators">Building custom aggregators</h2>
+<p>Platform cannot perform any meaningful aggregations for non-numeric metrics. In such cases, the operator or application developer can write custom aggregators. Let’s say, if the <code>LineReceiver</code> was modified to have a complex metric as shown below.</p>
+<pre><code class="java">public class AnotherLineReceiver extends BaseOperator
+{
+  @AutoMetric
+  final LineMetrics lineMetrics = new LineMetrics();
+
+  public final transient DefaultInputPort&lt;String&gt; input = new DefaultInputPort&lt;String&gt;()
+  {
+    @Override
+    public void process(String s)
+    {
+      lineMetrics.length += s.length();
+      lineMetrics.count++;
+    }
+  };
+
+  @Override
+  public void beginWindow(long windowId)
+  {
+    lineMetrics.length = 0;
+    lineMetrics.count = 0;
+  }
+
+  public static class LineMetrics implements Serializable
+  {
+    long length;
+    long count;
+
+    private static final long serialVersionUID = 201511041908L;
+  }
+}
+</code></pre>
+
+<p>Below is a custom aggregator that can calculate average line length across all partitions of <code>AnotherLineReceiver</code>.</p>
+<pre><code class="java">public class AvgLineLengthAggregator implements AutoMetric.Aggregator
+{
+
+  Map&lt;String, Object&gt; result = Maps.newHashMap();
+
+  @Override
+  public Map&lt;String, Object&gt; aggregate(long l, Collection&lt;AutoMetric.PhysicalMetricsContext&gt; collection)
+  {
+    long totalLength = 0;
+    long totalCount = 0;
+    for (AutoMetric.PhysicalMetricsContext pmc : collection) {
+      AnotherLineReceiver.LineMetrics lm = (AnotherLineReceiver.LineMetrics)pmc.getMetrics().get(&quot;lineMetrics&quot;);
+      totalLength += lm.length;
+      totalCount += lm.count;
+    }
+    result.put(&quot;avgLineLength&quot;, totalLength/totalCount);
+    return result;
+  }
+}
+</code></pre>
+
+<p>An instance of above aggregator can be specified as the <code>METRIC_AGGREGATOR</code> for <code>AnotherLineReceiver</code> while creating the DAG as shown below.</p>
+<pre><code class="java">  @Override
+  public void populateDAG(DAG dag, Configuration configuration)
+  {
+    ...
+    AnotherLineReceiver lineReceiver = dag.addOperator(&quot;LineReceiver&quot;, new AnotherLineReceiver());
+    dag.setAttribute(lineReceiver, Context.OperatorContext.METRICS_AGGREGATOR, new AvgLineLengthAggregator());
+    ...
+  }
+</code></pre>
+
+<h1 id="retrieving-autometrics">Retrieving AutoMetrics</h1>
+<p>There are two options for retrieving the AutoMetrics:</p>
+<ul>
+<li>Throught DataTorrent Gateway REST API</li>
+<li>Through REST service on the port of the running STRAM</li>
+</ul>
+<p>The Gateway REST API provides a way to retrieve the latest AutoMetrics for each logical operator.  For example:</p>
+<pre><code>GET /ws/v2/applications/{appid}/logicalPlan/operators/{opName}
+{
+    ...
+    &quot;autoMetrics&quot;: {
+       &quot;count&quot;: &quot;71314&quot;,
+       &quot;length&quot;: &quot;27780706&quot;
+    },
+    &quot;className&quot;: &quot;com.datatorrent.autometric.LineReceiver&quot;,
+    ...
+}
+</code></pre>
+
+<h1 id="system-metrics">System Metrics</h1>
+<p>System metrics are standard operator metrics provided by the system.  Examples include:</p>
+<ul>
+<li>processed tuples per second</li>
+<li>emitted tuples per second</li>
+<li>total tuples processed</li>
+<li>total tuples emitted</li>
+<li>latency</li>
+<li>CPU percentage</li>
+<li>failure count</li>
+<li>checkpoint elapsed time</li>
+</ul>
+<p>The Gateway REST API provides a way to retrieve the latest values for all of the above for each of the logical operators in the application.</p>
+<pre><code>GET /ws/v2/applications/{appid}/logicalPlan/operators/{opName}
+{
+    ...
+    &quot;cpuPercentageMA&quot;: &quot;{cpuPercentageMA}&quot;,
+    &quot;failureCount&quot;: &quot;{failureCount}&quot;,
+    &quot;latencyMA&quot;: &quot;{latencyMA}&quot;,  
+    &quot;totalTuplesEmitted&quot;: &quot;{totalTuplesEmitted}&quot;,
+    &quot;totalTuplesProcessed&quot;: &quot;{totalTuplesProcessed}&quot;,
+    &quot;tuplesEmittedPSMA&quot;: &quot;{tuplesEmittedPSMA}&quot;,
+    &quot;tuplesProcessedPSMA&quot;: &quot;{tuplesProcessedPSMA}&quot;,
+    ...
+}
+</code></pre>
+
+<p>However, just like AutoMetrics, the Gateway only provides the latest metrics.  For historical metrics, we will need the help of <a href="http://docs.datatorrent.com/autometrics/#app-data-tracker">App Data Tracker</a>.</p>
+              
+            </div>
+          </div>
+          <footer>
+  
+    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
+      
+        <a href="../dtcli/" class="btn btn-neutral float-right" title="dtCli">Next <span class="icon icon-circle-arrow-right"></span></a>
+      
+      
+        <a href="../operator_development/" class="btn btn-neutral" title="Operators"><span class="icon icon-circle-arrow-left"></span> Previous</a>
+      
+    </div>
+  
+
+  <hr/>
+
+  <div role="contentinfo">
+    <!-- Copyright etc -->
+    
+  </div>
+
+  Built with <a href="http://www.mkdocs.org">MkDocs</a> using a <a href="https://github.com/snide/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
+</footer>
+	  
+        </div>
+      </div>
+
+    </section>
+
+  </div>
+
+<div class="rst-versions" role="note" style="cursor: pointer">
+    <span class="rst-current-version" data-toggle="rst-current-version">
+      
+      
+        <span><a href="../operator_development/" style="color: #fcfcfc;">&laquo; Previous</a></span>
+      
+      
+        <span style="margin-left: 15px"><a href="../dtcli/" style="color: #fcfcfc">Next &raquo;</a></span>
+      
+    </span>
+</div>
+
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/incubator-apex-site/blob/e411d993/content/docs/apex/base.html
----------------------------------------------------------------------
diff --git a/content/docs/apex/base.html b/content/docs/apex/base.html
new file mode 100644
index 0000000..87c9f8a
--- /dev/null
+++ b/content/docs/apex/base.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html>
+<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
+<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
+<head>
+  <meta charset="utf-8">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  {% if page_description %}<meta name="description" content="{{ page_description }}">{% endif %}
+  {% if site_author %}<meta name="author" content="{{ site_author }}">{% endif %}
+  {% block htmltitle %}
+  <title>{% if page_title %}{{ page_title }} - {% endif %}{{ site_name }}</title>
+  {% endblock %}
+
+  {% if favicon %}<link rel="shortcut icon" href="{{ favicon }}">
+  {% else %}<link rel="shortcut icon" href="{{ base_url }}/img/favicon.ico">{% endif %}
+
+  {# CSS #}
+  <link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>
+
+  <link rel="stylesheet" href="{{ base_url }}/css/theme.css" type="text/css" />
+  <link rel="stylesheet" href="{{ base_url }}/css/theme_extra.css" type="text/css" />
+  <link rel="stylesheet" href="{{ base_url }}/css/highlight.css">
+  {%- for path in extra_css %}
+  <link href="{{ path }}" rel="stylesheet">
+  {%- endfor %}
+
+  {% if current_page %}
+  <script>
+    // Current page data
+    var mkdocs_page_name = {{ page_title|tojson|safe }};
+    var mkdocs_page_input_path = {{ current_page.input_path|tojson|safe }};
+    var mkdocs_page_url = {{ current_page.abs_url|tojson|safe }};
+  </script>
+  {% endif %}
+  <script src="{{ base_url }}/js/jquery-2.1.1.min.js"></script>
+  <script src="{{ base_url }}/js/modernizr-2.8.3.min.js"></script>
+  <script type="text/javascript" src="{{ base_url }}/js/highlight.pack.js"></script>
+  <script src="{{ base_url }}/js/theme.js"></script>
+
+  {%- block extrahead %} {% endblock %}
+
+  {%- for path in extra_javascript %}
+  <script src="{{ path }}"></script>
+  {%- endfor %}
+
+  {% if google_analytics %}
+  <script>
+      (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
+      (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
+      m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
+      })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+
+      ga('create', '{{ google_analytics[0] }}', '{{ google_analytics[1] }}');
+      ga('send', 'pageview');
+  </script>
+  {% endif %}
+</head>
+
+<body class="wy-body-for-nav" role="document">
+
+  <div class="wy-grid-for-nav">
+
+    {# SIDE NAV, TOGGLES ON MOBILE #}
+    <nav data-toggle="wy-nav-shift" class="wy-nav-side stickynav">
+      <div class="wy-side-nav-search">
+        <a href="{{ homepage_url }}" class="icon icon-home"> {{ site_name }}</a>
+        {% include "searchbox.html" %}
+      </div>
+
+      <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
+        <ul class="current">
+          {% for nav_item in nav %}
+            <li>{% include "toc.html" %}<li>
+          {% endfor %}
+        </ul>
+      </div>
+      &nbsp;
+    </nav>
+
+    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
+
+      {# MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #}
+      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
+        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
+        <a href="{{ homepage_url }}">{{ site_name }}</a>
+      </nav>
+
+      {# PAGE CONTENT #}
+      <div class="wy-nav-content">
+        <div class="rst-content">
+          {% include "breadcrumbs.html" %}
+          <div role="main">
+            <div class="section">
+              {% block content %}
+                {{ content }}
+              {% endblock %}
+            </div>
+          </div>
+	  {%- block footer %}
+          {% include "footer.html" %}
+	  {% endblock %}
+        </div>
+      </div>
+
+    </section>
+
+  </div>
+
+{% include "versions.html" %}
+
+</body>
+</html>
+{% if current_page and current_page.is_homepage %}
+<!--
+MkDocs version : {{ mkdocs_version }}
+Build Date UTC : {{ build_date_utc }}
+-->
+{% endif %}

http://git-wip-us.apache.org/repos/asf/incubator-apex-site/blob/e411d993/content/docs/apex/breadcrumbs.html
----------------------------------------------------------------------
diff --git a/content/docs/apex/breadcrumbs.html b/content/docs/apex/breadcrumbs.html
new file mode 100644
index 0000000..01960e6
--- /dev/null
+++ b/content/docs/apex/breadcrumbs.html
@@ -0,0 +1,25 @@
+<div role="navigation" aria-label="breadcrumbs navigation">
+  <ul class="wy-breadcrumbs">
+    <li><a href="{{ homepage_url }}">Docs</a> &raquo;</li>
+    {% if current_page %}
+      {% for doc in current_page.ancestors %}
+        {% if doc.link %}
+          <li><a href="{{ doc.link|e }}">{{ doc.title }}</a> &raquo;</li>
+        {% else %}
+          <li>{{ doc.title }} &raquo;</li>
+        {% endif %}
+      {% endfor %}
+    {% endif %}
+    {% if current_page %}<li>{{ current_page.title }}</li>{% endif %}
+    <li class="wy-breadcrumbs-aside">
+      {% if repo_url %}
+        {% if repo_name == 'GitHub' %}
+          <a href="{{ repo_url }}" class="icon icon-github"> Edit on GitHub</a>
+        {% elif repo_name == 'Bitbucket' %}
+          <a href="{{ repo_url }}" class="icon icon-bitbucket"> Edit on BitBucket</a>
+        {% endif %}
+      {% endif %}
+    </li>
+  </ul>
+  <hr/>
+</div>

http://git-wip-us.apache.org/repos/asf/incubator-apex-site/blob/e411d993/content/docs/apex/css/highlight.css
----------------------------------------------------------------------
diff --git a/content/docs/apex/css/highlight.css b/content/docs/apex/css/highlight.css
new file mode 100644
index 0000000..0ae40a7
--- /dev/null
+++ b/content/docs/apex/css/highlight.css
@@ -0,0 +1,124 @@
+/*
+This is the GitHub theme for highlight.js
+
+github.com style (c) Vasily Polovnyov <va...@whiteants.net>
+
+*/
+
+.hljs {
+  display: block;
+  overflow-x: auto;
+  color: #333;
+  -webkit-text-size-adjust: none;
+}
+
+.hljs-comment,
+.diff .hljs-header,
+.hljs-javadoc {
+  color: #998;
+  font-style: italic;
+}
+
+.hljs-keyword,
+.css .rule .hljs-keyword,
+.hljs-winutils,
+.nginx .hljs-title,
+.hljs-subst,
+.hljs-request,
+.hljs-status {
+  color: #333;
+  font-weight: bold;
+}
+
+.hljs-number,
+.hljs-hexcolor,
+.ruby .hljs-constant {
+  color: #008080;
+}
+
+.hljs-string,
+.hljs-tag .hljs-value,
+.hljs-phpdoc,
+.hljs-dartdoc,
+.tex .hljs-formula {
+  color: #d14;
+}
+
+.hljs-title,
+.hljs-id,
+.scss .hljs-preprocessor {
+  color: #900;
+  font-weight: bold;
+}
+
+.hljs-list .hljs-keyword,
+.hljs-subst {
+  font-weight: normal;
+}
+
+.hljs-class .hljs-title,
+.hljs-type,
+.vhdl .hljs-literal,
+.tex .hljs-command {
+  color: #458;
+  font-weight: bold;
+}
+
+.hljs-tag,
+.hljs-tag .hljs-title,
+.hljs-rule .hljs-property,
+.django .hljs-tag .hljs-keyword {
+  color: #000080;
+  font-weight: normal;
+}
+
+.hljs-attribute,
+.hljs-variable,
+.lisp .hljs-body,
+.hljs-name {
+  color: #008080;
+}
+
+.hljs-regexp {
+  color: #009926;
+}
+
+.hljs-symbol,
+.ruby .hljs-symbol .hljs-string,
+.lisp .hljs-keyword,
+.clojure .hljs-keyword,
+.scheme .hljs-keyword,
+.tex .hljs-special,
+.hljs-prompt {
+  color: #990073;
+}
+
+.hljs-built_in {
+  color: #0086b3;
+}
+
+.hljs-preprocessor,
+.hljs-pragma,
+.hljs-pi,
+.hljs-doctype,
+.hljs-shebang,
+.hljs-cdata {
+  color: #999;
+  font-weight: bold;
+}
+
+.hljs-deletion {
+  background: #fdd;
+}
+
+.hljs-addition {
+  background: #dfd;
+}
+
+.diff .hljs-change {
+  background: #0086b3;
+}
+
+.hljs-chunk {
+  color: #aaa;
+}