You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@livy.apache.org by js...@apache.org on 2017/07/27 03:12:24 UTC
incubator-livy git commit: [LIVY-376][DOCS] Update README with new
naming and links and move Docs into separate files
Repository: incubator-livy
Updated Branches:
refs/heads/master dcd29a043 -> 60ee047e9
[LIVY-376][DOCS] Update README with new naming and links and move Docs into separate files
[LIVY-376](https://issues.cloudera.org/browse/LIVY-376)
* The README has been updated to match our new Apache naming and links.
* The API Documentation has been split into separate files
* Examples have been moved to the website https://github.com/apache/incubator-livy-website/pull/5
This PR will be followed up with a way to build out the Docs for the website
Author: Alex Bozarth <aj...@us.ibm.com>
Closes #21 from ajbozarth/readme.
Project: http://git-wip-us.apache.org/repos/asf/incubator-livy/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-livy/commit/60ee047e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-livy/tree/60ee047e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-livy/diff/60ee047e
Branch: refs/heads/master
Commit: 60ee047e98b93b50b2763594e9bd17ecc4d31563
Parents: dcd29a0
Author: Alex Bozarth <aj...@us.ibm.com>
Authored: Thu Jul 27 11:12:19 2017 +0800
Committer: jerryshao <ss...@hortonworks.com>
Committed: Thu Jul 27 11:12:19 2017 +0800
----------------------------------------------------------------------
NOTICE.txt | 2 +-
README.md | 82 ++++
README.rst | 982 ------------------------------------------
docs/programmatic-api.md | 89 ++++
docs/rest-api.md | 726 +++++++++++++++++++++++++++++++
5 files changed, 898 insertions(+), 983 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-livy/blob/60ee047e/NOTICE.txt
----------------------------------------------------------------------
diff --git a/NOTICE.txt b/NOTICE.txt
index 73ec690..e61d336 100644
--- a/NOTICE.txt
+++ b/NOTICE.txt
@@ -1,4 +1,4 @@
-Apache livy
+Apache Livy
Copyright 2017 The Apache Software Foundation
This product includes software developed at
http://git-wip-us.apache.org/repos/asf/incubator-livy/blob/60ee047e/README.md
----------------------------------------------------------------------
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..2dc33c2
--- /dev/null
+++ b/README.md
@@ -0,0 +1,82 @@
+# Apache Livy
+
+[![Build Status](https://travis-ci.org/apache/incubator-livy.svg?branch=master)](https://travis-ci.org/apache/incubator-livy)
+
+Apache Livy is an open source REST interface for interacting with
+[Apache Spark](http://spark.apache.org) from anywhere. It supports executing snippets of code or
+programs in a Spark context that runs locally or in
+[Apache Hadoop YARN](http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html).
+
+* Interactive Scala, Python and R shells
+* Batch submissions in Scala, Java, Python
+* Multiple users can share the same server (impersonation support)
+* Can be used for submitting jobs from anywhere with REST
+* Does not require any code change to your programs
+
+[Pull requests](https://github.com/apache/incubator-livy/pulls) are welcomed! But before you begin,
+please check out the [Contributing](http://livy.incubator.apache.org/community#Contributing)
+section on the [Community](http://livy.incubator.apache.org/community) page of our website.
+
+## Online Documentation
+
+Guides and documentation on getting started using Livy, example code snippets, and Livy API
+documentation can be found at [livy.incubator.apache.org](http://livy.incubator.apache.org).
+
+## Before Building Livy
+
+To build Livy, you will need:
+
+Debian/Ubuntu:
+ * mvn (from ``maven`` package or maven3 tarball)
+ * openjdk-7-jdk (or Oracle Java7 jdk)
+ * Python 2.6+
+ * R 3.x
+
+Redhat/CentOS:
+ * mvn (from ``maven`` package or maven3 tarball)
+ * java-1.7.0-openjdk (or Oracle Java7 jdk)
+ * Python 2.6+
+ * R 3.x
+
+MacOS:
+ * Xcode command line tools
+ * Oracle's JDK 1.7+
+ * Maven (Homebrew)
+ * Python 2.6+
+ * R 3.x
+
+Required python packages for building Livy:
+ * cloudpickle
+ * requests
+ * requests-kerberos
+ * flake8
+ * flaky
+ * pytest
+
+
+To run Livy, you will also need a Spark installation. You can get Spark releases at
+https://spark.apache.org/downloads.html.
+
+Livy requires at least Spark 1.6 and supports both Scala 2.10 and 2.11 builds of Spark, Livy
+will automatically pick repl dependencies through detecting the Scala version of Spark.
+
+Livy also supports Spark 2.0+ for both interactive and batch submission, you could seamlessly
+switch to different versions of Spark through ``SPARK_HOME`` configuration, without needing to
+rebuild Livy.
+
+
+## Building Livy
+
+Livy is built using [Apache Maven](http://maven.apache.org). To check out and build Livy, run:
+
+```
+git clone https://github.com/apache/incubator-livy.git
+cd livy
+mvn package
+```
+
+By default Livy is built against Apache Spark 1.6.2, but the version of Spark used when running
+Livy does not need to match the version used to build Livy. Livy internally uses reflection to
+mitigate the gaps between different Spark versions, also Livy package itself does not
+contain a Spark distribution, so it will work with any supported version of Spark (Spark 1.6+)
+without needing to rebuild against specific version of Spark.
http://git-wip-us.apache.org/repos/asf/incubator-livy/blob/60ee047e/README.rst
----------------------------------------------------------------------
diff --git a/README.rst b/README.rst
deleted file mode 100644
index 9f14fa0..0000000
--- a/README.rst
+++ /dev/null
@@ -1,982 +0,0 @@
-Welcome to Livy
-===============
-
-.. image:: https://travis-ci.org/cloudera/livy.svg?branch=master
- :target: https://travis-ci.org/cloudera/livy
-
-Livy is an open source REST interface for interacting with `Apache Spark`_ from anywhere.
-It supports executing snippets of code or programs in a Spark context that runs locally or in `Apache Hadoop YARN`_.
-
-* Interactive Scala, Python and R shells
-* Batch submissions in Scala, Java, Python
-* Multiple users can share the same server (impersonation support)
-* Can be used for submitting jobs from anywhere with REST
-* Does not require any code change to your programs
-
-`Pull requests`_ are welcomed! But before you begin, please check out the `Wiki`_.
-
-.. _Apache Spark: http://spark.apache.org
-.. _Apache Hadoop YARN: http://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/YARN.html
-.. _Pull requests: https://github.com/cloudera/livy/pulls
-.. _Wiki: https://github.com/cloudera/livy/wiki/Contributing-to-Livy
-
-
-Prerequisites
-=============
-
-To build Livy, you will need:
-
-Debian/Ubuntu:
- * mvn (from ``maven`` package or maven3 tarball)
- * openjdk-7-jdk (or Oracle Java7 jdk)
- * Python 2.6+
- * R 3.x
-
-Redhat/CentOS:
- * mvn (from ``maven`` package or maven3 tarball)
- * java-1.7.0-openjdk (or Oracle Java7 jdk)
- * Python 2.6+
- * R 3.x
-
-MacOS:
- * Xcode command line tools
- * Oracle's JDK 1.7+
- * Maven (Homebrew)
- * Python 2.6+
- * R 3.x
-
-Required python packages for building Livy:
- * cloudpickle
- * requests
- * requests-kerberos
- * flake8
- * flaky
- * pytest
-
-
-To run Livy, you will also need a Spark installation. You can get Spark releases at
-https://spark.apache.org/downloads.html.
-
-Livy requires at least Spark 1.6 and supports both Scala 2.10 and 2.11 builds of Spark, Livy
-will automatically pick repl dependencies through detecting the Scala version of Spark.
-
-Livy also supports Spark 2.0+ for both interactive and batch submission, you could seamlessly
-switch to different versions of Spark through ``SPARK_HOME`` configuration, without needing to
-rebuild Livy.
-
-
-Building Livy
-=============
-
-Livy is built using `Apache Maven`_. To check out and build Livy, run:
-
-.. code:: shell
-
- git clone https://github.com/cloudera/livy.git
- cd livy
- mvn package
-
-By default Livy is built against Apache Spark 1.6.2, but the version of Spark used when running
-Livy does not need to match the version used to build Livy. Livy internally uses reflection to
-mitigate the gaps between different Spark versions, also Livy package itself does not
-contain a Spark distribution, so it will work with any supported version of Spark (Spark 1.6+)
-without needing to rebuild against specific version of Spark.
-
-.. _Apache Maven: http://maven.apache.org
-
-
-Running Livy
-============
-
-In order to run Livy with local sessions, first export these variables:
-
-.. code:: shell
-
- export SPARK_HOME=/usr/lib/spark
- export HADOOP_CONF_DIR=/etc/hadoop/conf
-
-Then start the server with:
-
-.. code:: shell
-
- ./bin/livy-server
-
-Livy uses the Spark configuration under ``SPARK_HOME`` by default. You can override the Spark configuration
-by setting the ``SPARK_CONF_DIR`` environment variable before starting Livy.
-
-It is strongly recommended to configure Spark to submit applications in YARN cluster mode.
-That makes sure that user sessions have their resources properly accounted for in the YARN cluster,
-and that the host running the Livy server doesn't become overloaded when multiple user sessions are
-running.
-
-
-Livy Configuration
-==================
-
-Livy uses a few configuration files under configuration the directory, which by default is the
-``conf`` directory under the Livy installation. An alternative configuration directory can be
-provided by setting the ``LIVY_CONF_DIR`` environment variable when starting Livy.
-
-The configuration files used by Livy are:
-
-* ``livy.conf``: contains the server configuration. The Livy distribution ships with a default
- configuration file listing available configuration keys and their default values.
-
-* ``spark-blacklist.conf``: list Spark configuration options that users are not allowed to override.
- These options will be restricted to either their default values, or the values set in the Spark
- configuration used by Livy.
-
-* ``log4j.properties``: configuration for Livy logging. Defines log levels and where log messages
- will be written to. The default configuration will print log messages to stderr.
-
-Upgrade from Livy 0.1
-=====================
-
-A few things changed between since Livy 0.1 that require manual intervention when upgrading.
-
-- Sessions that were active when the Livy 0.1 server was stopped may need to be killed
- manually. Use the tools from your cluster manager to achieve that (for example, the
- ``yarn`` command line tool).
-
-- The configuration file has been renamed from ``livy-defaults.conf`` to ``livy.conf``.
-
-- A few configuration values do not have any effect anymore. Notably:
-
- * ``livy.server.session.factory``: this config option has been replaced by the Spark
- configuration under ``SPARK_HOME``. If you wish to use a different Spark configuration
- for Livy, you can set ``SPARK_CONF_DIR`` in Livy's environment. To define the default
- file system root for sessions, set ``HADOOP_CONF_DIR`` to point at the Hadoop configuration
- to use. The default Hadoop file system will be used.
-
- * ``livy.yarn.jar``: this config has been replaced by separate configs listing specific
- archives for different Livy features. Refer to the default ``livy.conf`` file shipped
- with Livy for instructions.
-
- * ``livy.server.spark-submit``: replaced by the ``SPARK_HOME`` environment variable.
-
-
-Using the Programmatic API
-==========================
-
-Livy provides a programmatic Java/Scala and Python API that allows applications to run code inside
-Spark without having to maintain a local Spark context. Here shows how to use the Java API.
-
-Add the Cloudera repository to your application's POM:
-
-.. code:: xml
-
- <repositories>
- <repository>
- <id>cloudera.repo</id>
- <url>https://repository.cloudera.com/artifactory/cloudera-repos</url>
- <name>Cloudera Repositories</name>
- <snapshots>
- <enabled>false</enabled>
- </snapshots>
- </repository>
- </repositories>
-
-
-And add the Livy client dependency:
-
-.. code:: xml
-
- <dependency>
- <groupId>com.cloudera.livy</groupId>
- <artifactId>livy-client-http</artifactId>
- <version>0.2.0</version>
- </dependency>
-
-
-To be able to compile code that uses Spark APIs, also add the correspondent Spark dependencies.
-
-To run Spark jobs within your applications, extend ``org.apache.livy.Job`` and implement
-the functionality you need. Here's an example job that calculates an approximate value for Pi:
-
-.. code:: java
-
- import java.util.*;
-
- import org.apache.spark.api.java.*;
- import org.apache.spark.api.java.function.*;
-
- import com.cloudera.livy.*;
-
- public class PiJob implements Job<Double>, Function<Integer, Integer>,
- Function2<Integer, Integer, Integer> {
-
- private final int samples;
-
- public PiJob(int samples) {
- this.samples = samples;
- }
-
- @Override
- public Double call(JobContext ctx) throws Exception {
- List<Integer> sampleList = new ArrayList<Integer>();
- for (int i = 0; i < samples; i++) {
- sampleList.add(i + 1);
- }
-
- return 4.0d * ctx.sc().parallelize(sampleList).map(this).reduce(this) / samples;
- }
-
- @Override
- public Integer call(Integer v1) {
- double x = Math.random();
- double y = Math.random();
- return (x*x + y*y < 1) ? 1 : 0;
- }
-
- @Override
- public Integer call(Integer v1, Integer v2) {
- return v1 + v2;
- }
-
- }
-
-
-To submit this code using Livy, create a LivyClient instance and upload your application code to
-the Spark context. Here's an example of code that submits the above job and prints the computed
-value:
-
-.. code:: java
-
- LivyClient client = new LivyClientBuilder()
- .setURI(new URI(livyUrl))
- .build();
-
- try {
- System.err.printf("Uploading %s to the Spark context...\n", piJar);
- client.uploadJar(new File(piJar)).get();
-
- System.err.printf("Running PiJob with %d samples...\n", samples);
- double pi = client.submit(new PiJob(samples)).get();
-
- System.out.println("Pi is roughly: " + pi);
- } finally {
- client.stop(true);
- }
-
-
-To learn about all the functionality available to applications, read the javadoc documentation for
-the classes under the ``api`` module.
-
-
-Spark Example
-=============
-
-Here's a step-by-step example of interacting with Livy in Python with the `Requests`_ library. By
-default Livy runs on port 8998 (which can be changed with the ``livy.server.port`` config option).
-We’ll start off with a Spark session that takes Scala code:
-
-.. code:: shell
-
- sudo pip install requests
-
-.. code:: python
-
- import json, pprint, requests, textwrap
- host = 'http://localhost:8998'
- data = {'kind': 'spark'}
- headers = {'Content-Type': 'application/json'}
- r = requests.post(host + '/sessions', data=json.dumps(data), headers=headers)
- r.json()
-
- {u'state': u'starting', u'id': 0, u'kind': u'spark'}
-
-Once the session has completed starting up, it transitions to the idle state:
-
-.. code:: python
-
- session_url = host + r.headers['location']
- r = requests.get(session_url, headers=headers)
- r.json()
-
- {u'state': u'idle', u'id': 0, u'kind': u'spark'}
-
-Now we can execute Scala by passing in a simple JSON command:
-
-.. code:: python
-
- statements_url = session_url + '/statements'
- data = {'code': '1 + 1'}
- r = requests.post(statements_url, data=json.dumps(data), headers=headers)
- r.json()
-
- {u'output': None, u'state': u'running', u'id': 0}
-
-If a statement takes longer than a few milliseconds to execute, Livy returns
-early and provides a statement URL that can be polled until it is complete:
-
-.. code:: python
-
- statement_url = host + r.headers['location']
- r = requests.get(statement_url, headers=headers)
- pprint.pprint(r.json())
-
- {u'id': 0,
- u'output': {u'data': {u'text/plain': u'res0: Int = 2'},
- u'execution_count': 0,
- u'status': u'ok'},
- u'state': u'available'}
-
-That was a pretty simple example. More interesting is using Spark to estimate
-Pi. This is from the `Spark Examples`_:
-
-.. code:: python
-
- data = {
- 'code': textwrap.dedent("""
- val NUM_SAMPLES = 100000;
- val count = sc.parallelize(1 to NUM_SAMPLES).map { i =>
- val x = Math.random();
- val y = Math.random();
- if (x*x + y*y < 1) 1 else 0
- }.reduce(_ + _);
- println(\"Pi is roughly \" + 4.0 * count / NUM_SAMPLES)
- """)
- }
-
- r = requests.post(statements_url, data=json.dumps(data), headers=headers)
- pprint.pprint(r.json())
-
- statement_url = host + r.headers['location']
- r = requests.get(statement_url, headers=headers)
- pprint.pprint(r.json())
-
- {u'id': 1,
- u'output': {u'data': {u'text/plain': u'Pi is roughly 3.14004\nNUM_SAMPLES: Int = 100000\ncount: Int = 78501'},
- u'execution_count': 1,
- u'status': u'ok'},
- u'state': u'available'}
-
-Finally, close the session:
-
-.. code:: python
-
- session_url = 'http://localhost:8998/sessions/0'
- requests.delete(session_url, headers=headers)
-
- <Response [204]>
-
-.. _Requests: http://docs.python-requests.org/en/latest/
-.. _Spark Examples: https://spark.apache.org/examples.html
-
-
-PySpark Example
-===============
-
-PySpark has the same API, just with a different initial request:
-
-.. code:: python
-
- data = {'kind': 'pyspark'}
- r = requests.post(host + '/sessions', data=json.dumps(data), headers=headers)
- r.json()
-
- {u'id': 1, u'state': u'idle'}
-
-The Pi example from before then can be run as:
-
-.. code:: python
-
- data = {
- 'code': textwrap.dedent("""
- import random
- NUM_SAMPLES = 100000
- def sample(p):
- x, y = random.random(), random.random()
- return 1 if x*x + y*y < 1 else 0
-
- count = sc.parallelize(xrange(0, NUM_SAMPLES)).map(sample).reduce(lambda a, b: a + b)
- print "Pi is roughly %f" % (4.0 * count / NUM_SAMPLES)
- """)
- }
-
- r = requests.post(statements_url, data=json.dumps(data), headers=headers)
- pprint.pprint(r.json())
-
- {u'id': 12,
- u'output': {u'data': {u'text/plain': u'Pi is roughly 3.136000'},
- u'execution_count': 12,
- u'status': u'ok'},
- u'state': u'running'}
-
-
-SparkR Example
-==============
-
-SparkR has the same API:
-
-.. code:: python
-
- data = {'kind': 'sparkr'}
- r = requests.post(host + '/sessions', data=json.dumps(data), headers=headers)
- r.json()
-
- {u'id': 1, u'state': u'idle'}
-
-The Pi example from before then can be run as:
-
-.. code:: python
-
- data = {
- 'code': textwrap.dedent("""
- n <- 100000
- piFunc <- function(elem) {
- rands <- runif(n = 2, min = -1, max = 1)
- val <- ifelse((rands[1]^2 + rands[2]^2) < 1, 1.0, 0.0)
- val
- }
- piFuncVec <- function(elems) {
- message(length(elems))
- rands1 <- runif(n = length(elems), min = -1, max = 1)
- rands2 <- runif(n = length(elems), min = -1, max = 1)
- val <- ifelse((rands1^2 + rands2^2) < 1, 1.0, 0.0)
- sum(val)
- }
- rdd <- parallelize(sc, 1:n, slices)
- count <- reduce(lapplyPartition(rdd, piFuncVec), sum)
- cat("Pi is roughly", 4.0 * count / n, "\n")
- """)
- }
-
- r = requests.post(statements_url, data=json.dumps(data), headers=headers)
- pprint.pprint(r.json())
-
- {u'id': 12,
- u'output': {u'data': {u'text/plain': u'Pi is roughly 3.136000'},
- u'execution_count': 12,
- u'status': u'ok'},
- u'state': u'running'}
-
-
-Community
-=========
-
- * User group: http://groups.google.com/a/cloudera.org/group/livy-user
- * Dev group: http://groups.google.com/a/cloudera.org/group/livy-dev
- * Dev slack: https://livy-dev.slack.com.
-
- To join: http://livy-slack-invite.azurewebsites.net. Invite token: ``I'm not a bot``.
- * JIRA: https://issues.cloudera.org/browse/LIVY
- * Pull requests: https://github.com/cloudera/livy/pulls
-
-
-REST API
-========
-
-GET /sessions
--------------
-
-Returns all the active interactive sessions.
-
-Request Parameters
-^^^^^^^^^^^^^^^^^^
-
-+------+-----------------------------------+------+
-| name | description | type |
-+======+===================================+======+
-| from | The start index to fetch sessions | int |
-+------+-----------------------------------+------+
-| size | Number of sessions to fetch | int |
-+------+-----------------------------------+------+
-
-Response Body
-^^^^^^^^^^^^^
-
-+----------+-------------------------------------+------+
-| name | description | type |
-+==========+=====================================+======+
-| from | The start index of fetched sessions | int |
-+----------+-------------------------------------+------+
-| total | Number of sessions fetched | int |
-+----------+-------------------------------------+------+
-| sessions | `Session`_ list | list |
-+----------+-------------------------------------+------+
-
-
-POST /sessions
---------------
-
-Creates a new interactive Scala, Python, or R shell in the cluster.
-
-Request Body
-^^^^^^^^^^^^
-
-+--------------------------+------------------------------------------------+-----------------+
-| name | description | type |
-+==========================+================================================+=================+
-| kind | The session kind (required) | `session kind`_ |
-+--------------------------+------------------------------------------------+-----------------+
-| proxyUser | User to impersonate when starting the session | string |
-+--------------------------+------------------------------------------------+-----------------+
-| jars | jars to be used in this session | List of string |
-+--------------------------+------------------------------------------------+-----------------+
-| pyFiles | Python files to be used in this session | List of string |
-+--------------------------+------------------------------------------------+-----------------+
-| files | files to be used in this session | List of string |
-+--------------------------+------------------------------------------------+-----------------+
-| driverMemory | Amount of memory to use for the driver process | string |
-+--------------------------+------------------------------------------------+-----------------+
-| driverCores | Number of cores to use for the driver process | int |
-+--------------------------+------------------------------------------------+-----------------+
-| executorMemory | Amount of memory to use per executor process | string |
-+--------------------------+------------------------------------------------+-----------------+
-| executorCores | Number of cores to use for each executor | int |
-+--------------------------+------------------------------------------------+-----------------+
-| numExecutors | Number of executors to launch for this session | int |
-+--------------------------+------------------------------------------------+-----------------+
-| archives | Archives to be used in this session | List of string |
-+--------------------------+------------------------------------------------+-----------------+
-| queue | The name of the YARN queue to which submitted | string |
-+--------------------------+------------------------------------------------+-----------------+
-| name | The name of this session | string |
-+--------------------------+------------------------------------------------+-----------------+
-| conf | Spark configuration properties | Map of key=val |
-+--------------------------+------------------------------------------------+-----------------+
-| heartbeatTimeoutInSecond | Timeout in second to which session be orphaned | int |
-+--------------------------+------------------------------------------------+-----------------+
-
-
-Response Body
-^^^^^^^^^^^^^
-
-The created `Session`_.
-
-
-GET /sessions/{sessionId}
--------------------------
-
-Returns the session information.
-
-Response Body
-^^^^^^^^^^^^^
-
-The `Session`_.
-
-
-GET /sessions/{sessionId}/state
--------------------------------
-
-Returns the state of session
-
-Response
-^^^^^^^^
-
-+-------+-----------------------------------+--------+
-| name | description | type |
-+=======+===================================+========+
-| id | Session id | int |
-+-------+-----------------------------------+--------+
-| state | The current state of session | string |
-+-------+-----------------------------------+--------+
-
-
-DELETE /sessions/{sessionId}
-----------------------------
-
-Kills the `Session`_ job.
-
-
-GET /sessions/{sessionId}/log
-------------------------------
-
-Gets the log lines from this session.
-
-Request Parameters
-^^^^^^^^^^^^^^^^^^
-
-+------+-----------------------------------+------+
-| name | description | type |
-+======+===================================+======+
-| from | Offset | int |
-+------+-----------------------------------+------+
-| size | Max number of log lines to return | int |
-+------+-----------------------------------+------+
-
-Response Body
-^^^^^^^^^^^^^
-
-+------+--------------------------+-----------------+
-| name | description | type |
-+======+==========================+=================+
-| id | The session id | int |
-+------+--------------------------+-----------------+
-| from | Offset from start of log | int |
-+------+--------------------------+-----------------+
-| size | Number of log lines | int |
-+------+--------------------------+-----------------+
-| log | The log lines | list of strings |
-+------+--------------------------+-----------------+
-
-
-GET /sessions/{sessionId}/statements
-------------------------------------
-
-Returns all the statements in a session.
-
-Response Body
-^^^^^^^^^^^^^
-
-+------------+-------------------+------+
-| name | description | type |
-+============+===================+======+
-| statements | `statement`_ list | list |
-+------------+-------------------+------+
-
-
-POST /sessions/{sessionId}/statements
--------------------------------------
-
-Runs a statement in a session.
-
-Request Body
-^^^^^^^^^^^^
-
-+------+---------------------+--------+
-| name | description | type |
-+======+=====================+========+
-| code | The code to execute | string |
-+------+---------------------+--------+
-
-Response Body
-^^^^^^^^^^^^^
-
-The `statement`_ object.
-
-
-GET /sessions/{sessionId}/statements/{statementId}
---------------------------------------------------
-
-Returns a specified statement in a session.
-
-Response Body
-^^^^^^^^^^^^^
-
-The `statement`_ object.
-
-
-POST /sessions/{sessionId}/statements/{statementId}/cancel
-----------------------------------------------------------
-
-Cancel the specified statement in this session.
-
-Response Body
-^^^^^^^^^^^^^
-
-+------+----------------------------+--------+
-| name | description | type |
-+======+============================+========+
-| msg | is always "cancelled" | string |
-+------+----------------------------+--------+
-
-
-GET /batches
--------------
-
-Returns all the active batch sessions.
-
-Request Parameters
-^^^^^^^^^^^^^^^^^^
-
-+------+-----------------------------------+------+
-| name | description | type |
-+======+===================================+======+
-| from | The start index to fetch sessions | int |
-+------+-----------------------------------+------+
-| size | Number of sessions to fetch | int |
-+------+-----------------------------------+------+
-
-Response Body
-^^^^^^^^^^^^^
-
-+----------+-------------------------------------+------+
-| name | description | type |
-+==========+=====================================+======+
-| from | The start index of fetched sessions | int |
-+----------+-------------------------------------+------+
-| total | Number of sessions fetched | int |
-+----------+-------------------------------------+------+
-| sessions | `Batch`_ list | list |
-+----------+-------------------------------------+------+
-
-
-POST /batches
--------------
-
-Request Body
-^^^^^^^^^^^^
-
-+----------------+---------------------------------------------------+-----------------+
-| name | description | type |
-+================+===================================================+=================+
-| file | File containing the application to execute | path (required) |
-+----------------+---------------------------------------------------+-----------------+
-| proxyUser | User to impersonate when running the job | string |
-+----------------+---------------------------------------------------+-----------------+
-| className | Application Java/Spark main class | string |
-+----------------+---------------------------------------------------+-----------------+
-| args | Command line arguments for the application | list of strings |
-+----------------+---------------------------------------------------+-----------------+
-| jars | jars to be used in this session | List of string |
-+----------------+---------------------------------------------------+-----------------+
-| pyFiles | Python files to be used in this session | List of string |
-+----------------+---------------------------------------------------+-----------------+
-| files | files to be used in this session | List of string |
-+----------------+---------------------------------------------------+-----------------+
-| driverMemory | Amount of memory to use for the driver process | string |
-+----------------+---------------------------------------------------+-----------------+
-| driverCores | Number of cores to use for the driver process | int |
-+----------------+---------------------------------------------------+-----------------+
-| executorMemory | Amount of memory to use per executor process | string |
-+----------------+---------------------------------------------------+-----------------+
-| executorCores | Number of cores to use for each executor | int |
-+----------------+---------------------------------------------------+-----------------+
-| numExecutors | Number of executors to launch for this session | int |
-+----------------+---------------------------------------------------+-----------------+
-| archives | Archives to be used in this session | List of string |
-+----------------+---------------------------------------------------+-----------------+
-| queue | The name of the YARN queue to which submitted | string |
-+----------------+---------------------------------------------------+-----------------+
-| name | The name of this session | string |
-+----------------+---------------------------------------------------+-----------------+
-| conf | Spark configuration properties | Map of key=val |
-+----------------+---------------------------------------------------+-----------------+
-
-Response Body
-^^^^^^^^^^^^^
-
-The created `Batch`_ object.
-
-
-GET /batches/{batchId}
-----------------------
-
-Returns the batch session information.
-
-Response Body
-^^^^^^^^^^^^^
-
-The `Batch`_.
-
-
-GET /batches/{batchId}/state
-----------------------------
-
-Returns the state of batch session
-
-Response
-^^^^^^^^
-
-+-------+-----------------------------------+--------+
-| name | description | type |
-+=======+===================================+========+
-| id | Batch session id | int |
-+-------+-----------------------------------+--------+
-| state | The current state of batch session| string |
-+-------+-----------------------------------+--------+
-
-
-DELETE /batches/{batchId}
--------------------------
-
-Kills the `Batch`_ job.
-
-
-GET /batches/{batchId}/log
---------------------------
-
-Gets the log lines from this batch.
-
-Request Parameters
-^^^^^^^^^^^^^^^^^^
-
-+------+-----------------------------------+------+
-| name | description | type |
-+======+===================================+======+
-| from | Offset | int |
-+------+-----------------------------------+------+
-| size | Max number of log lines to return | int |
-+------+-----------------------------------+------+
-
-Response Body
-^^^^^^^^^^^^^
-
-+------+--------------------------+-----------------+
-| name | description | type |
-+======+==========================+=================+
-| id | The batch id | int |
-+------+--------------------------+-----------------+
-| from | Offset from start of log | int |
-+------+--------------------------+-----------------+
-| size | Number of log lines | int |
-+------+--------------------------+-----------------+
-| log | The log lines | list of strings |
-+------+--------------------------+-----------------+
-
-
-REST Objects
-============
-
-Session
--------
-
-A session represents an interactive shell.
-
-+----------------+------------------------------------------+----------------------------+
-| name | description | type |
-+================+==========================================+============================+
-| id | The session id | int |
-+----------------+------------------------------------------+----------------------------+
-| appId | The application id of this session | String |
-+----------------+------------------------------------------+----------------------------+
-| owner | Remote user who submitted this session | String |
-+----------------+------------------------------------------+----------------------------+
-| proxyUser | User to impersonate when running | String |
-+----------------+------------------------------------------+----------------------------+
-| kind | Session kind (spark, pyspark, or sparkr) | `session kind`_ |
-+----------------+------------------------------------------+----------------------------+
-| log | The log lines | list of strings |
-+----------------+------------------------------------------+----------------------------+
-| state | The session state | string |
-+----------------+------------------------------------------+----------------------------+
-| appInfo | The detailed application info | Map of key=val |
-+----------------+------------------------------------------+----------------------------+
-
-
-Session State
-^^^^^^^^^^^^^
-
-+---------------+----------------------------------+
-| value | description |
-+===============+==================================+
-| not_started | Session has not been started |
-+---------------+----------------------------------+
-| starting | Session is starting |
-+---------------+----------------------------------+
-| idle | Session is waiting for input |
-+---------------+----------------------------------+
-| busy | Session is executing a statement |
-+---------------+----------------------------------+
-| shutting_down | Session is shutting down |
-+---------------+----------------------------------+
-| error | Session errored out |
-+---------------+----------------------------------+
-| dead | Session has exited |
-+---------------+----------------------------------+
-| success | Session is successfully stopped |
-+---------------+----------------------------------+
-
-Session Kind
-^^^^^^^^^^^^
-
-+-------------+------------------------------------+
-| value | description |
-+=============+====================================+
-| spark | Interactive Scala Spark session |
-+-------------+------------------------------------+
-| `pyspark`_ | Interactive Python 2 Spark session |
-+-------------+------------------------------------+
-| `pyspark3`_ | Interactive Python 3 Spark session |
-+-------------+------------------------------------+
-| sparkr | Interactive R Spark session |
-+-------------+------------------------------------+
-
-pyspark
-^^^^^^^
-To change the Python executable the session uses, Livy reads the path from environment variable
-``PYSPARK_PYTHON`` (Same as pyspark).
-
-Like pyspark, if Livy is running in ``local`` mode, just set the environment variable.
-If the session is running in ``yarn-cluster`` mode, please set
-``spark.yarn.appMasterEnv.PYSPARK_PYTHON`` in SparkConf so the environment variable is passed to
-the driver.
-
-pyspark3
-^^^^^^^^
-To change the Python executable the session uses, Livy reads the path from environment variable
-``PYSPARK3_PYTHON``.
-
-Like pyspark, if Livy is running in ``local`` mode, just set the environment variable.
-If the session is running in ``yarn-cluster`` mode, please set
-``spark.yarn.appMasterEnv.PYSPARK3_PYTHON`` in SparkConf so the environment variable is passed to
-the driver.
-
-Statement
----------
-
-A statement represents the result of an execution statement.
-
-+--------+----------------------+---------------------+
-| name | description | type |
-+========+======================+=====================+
-| id | The statement id | integer |
-+--------+----------------------+---------------------+
-| code | The execution code | string |
-+--------+----------------------+---------------------+
-| state | The execution state | statement state |
-+--------+----------------------+---------------------+
-| output | The execution output | statement output |
-+--------+----------------------+---------------------+
-
-Statement State
-^^^^^^^^^^^^^^^
-
-+------------+----------------------------------------------------+
-| value | description |
-+============+====================================================+
-| waiting | Statement is enqueued but execution hasn't started |
-+------------+----------------------------------------------------+
-| running | Statement is currently running |
-+------------+----------------------------------------------------+
-| available | Statement has a response ready |
-+------------+----------------------------------------------------+
-| error | Statement failed |
-+------------+----------------------------------------------------+
-| cancelling | Statement is being cancelling |
-+------------+----------------------------------------------------+
-| cancelled | Statement is cancelled |
-+------------+----------------------------------------------------+
-
-Statement Output
-^^^^^^^^^^^^^^^^
-
-+-----------------+-------------------+----------------------------------+
-| name | description | type |
-+=================+===================+==================================+
-| status | Execution status | string |
-+-----------------+-------------------+----------------------------------+
-| execution_count | A monotonically | integer |
-| | increasing number | |
-+-----------------+-------------------+----------------------------------+
-| data | Statement output | An object mapping a mime type to |
-| | | the result. If the mime type is |
-| | | ``application/json``, the value |
-| | | is a JSON value. |
-+-----------------+-------------------+----------------------------------+
-
-Batch
------
-
-+----------------+-------------------------------------+-----------------+
-| name | description | type |
-+================+=====================================+=================+
-| id | The session id | int |
-+----------------+-------------------------------------+-----------------+
-| appId | The application id of this session | String |
-+----------------+-------------------------------------+-----------------+
-| appInfo | The detailed application info | Map of key=val |
-+----------------+-------------------------------------+-----------------+
-| log | The log lines | list of strings |
-+----------------+-------------------------------------+-----------------+
-| state | The batch state | string |
-+----------------+-------------------------------------+-----------------+
-
-
-License
-=======
-
-Apache License, Version 2.0
-http://www.apache.org/licenses/LICENSE-2.0
http://git-wip-us.apache.org/repos/asf/incubator-livy/blob/60ee047e/docs/programmatic-api.md
----------------------------------------------------------------------
diff --git a/docs/programmatic-api.md b/docs/programmatic-api.md
new file mode 100644
index 0000000..faec319
--- /dev/null
+++ b/docs/programmatic-api.md
@@ -0,0 +1,89 @@
+## Using the Programmatic API
+
+Livy provides a programmatic Java/Scala and Python API that allows applications to run code inside
+Spark without having to maintain a local Spark context. Here shows how to use the Java API.
+
+Add the Livy client dependency to your application's POM:
+
+```xml
+<dependency>
+ <groupId>org.apache.livy</groupId>
+ <artifactId>livy-client-http</artifactId>
+ <version>0.4.0-SNAPSHOT</version>
+</dependency>
+```
+
+Note: Until Livy's first Apache release you will have to
+install the livy artifacts locally using `mvn install`.
+
+To be able to compile code that uses Spark APIs, also add the correspondent Spark dependencies.
+
+To run Spark jobs within your applications, extend ``org.apache.livy.Job`` and implement
+the functionality you need. Here's an example job that calculates an approximate value for Pi:
+
+```java
+import java.util.*;
+
+import org.apache.spark.api.java.*;
+import org.apache.spark.api.java.function.*;
+
+import org.apache.livy.*;
+
+public class PiJob implements Job<Double>, Function<Integer, Integer>,
+ Function2<Integer, Integer, Integer> {
+
+ private final int samples;
+
+ public PiJob(int samples) {
+ this.samples = samples;
+ }
+
+ @Override
+ public Double call(JobContext ctx) throws Exception {
+ List<Integer> sampleList = new ArrayList<Integer>();
+ for (int i = 0; i < samples; i++) {
+ sampleList.add(i + 1);
+ }
+
+ return 4.0d * ctx.sc().parallelize(sampleList).map(this).reduce(this) / samples;
+ }
+
+ @Override
+ public Integer call(Integer v1) {
+ double x = Math.random();
+ double y = Math.random();
+ return (x*x + y*y < 1) ? 1 : 0;
+ }
+
+ @Override
+ public Integer call(Integer v1, Integer v2) {
+ return v1 + v2;
+ }
+
+}
+```
+
+To submit this code using Livy, create a LivyClient instance and upload your application code to
+the Spark context. Here's an example of code that submits the above job and prints the computed
+value:
+
+```java
+LivyClient client = new LivyClientBuilder()
+ .setURI(new URI(livyUrl))
+ .build();
+
+try {
+ System.err.printf("Uploading %s to the Spark context...\n", piJar);
+ client.uploadJar(new File(piJar)).get();
+
+ System.err.printf("Running PiJob with %d samples...\n", samples);
+ double pi = client.submit(new PiJob(samples)).get();
+
+ System.out.println("Pi is roughly: " + pi);
+} finally {
+ client.stop(true);
+}
+```
+
+To learn about all the functionality available to applications, read the javadoc documentation for
+the classes under the ``api`` module.
http://git-wip-us.apache.org/repos/asf/incubator-livy/blob/60ee047e/docs/rest-api.md
----------------------------------------------------------------------
diff --git a/docs/rest-api.md b/docs/rest-api.md
new file mode 100644
index 0000000..c7d2fcc
--- /dev/null
+++ b/docs/rest-api.md
@@ -0,0 +1,726 @@
+## REST API
+
+### GET /sessions
+
+Returns all the active interactive sessions.
+
+
+#### Request Parameters
+
+<table class="table">
+ <tr><th>Name</th><th>Description</th><th>Type</th></tr>
+ <tr>
+ <td>from</td>
+ <td>The start index to fetch sessions</td>
+ <td>int</td>
+ </tr>
+ <tr>
+ <td>size</td>
+ <td>Number of sessions to fetch</td>
+ <td>int</td>
+ </tr>
+</table>
+
+#### Response Body
+
+<table class="table">
+ <tr><th>Name</th><th>Description</th><th>Type</th></tr>
+ <tr>
+ <td>from</td>
+ <td>The start index to fetch sessions</td>
+ <td>int</td>
+ </tr>
+ <tr>
+ <td>size</td>
+ <td>Number of sessions to fetch</td>
+ <td>int</td>
+ </tr>
+ <tr>
+ <td>sessions</td>
+ <td><a href="#session">Session</a> list</td>
+ <td>list</td>
+ </tr>
+</table>
+
+### POST /sessions
+
+Creates a new interactive Scala, Python, or R shell in the cluster.
+
+#### Request Body
+
+<table class="table">
+ <tr><th>Name</th><th>Description</th><th>Type</th></tr>
+ <tr>
+ <td>kind</td>
+ <td>The session kind (required)</td>
+ <td><a href="#session-kind">session kind</a></td>
+ </tr>
+ <tr>
+ <td>proxyUser</td>
+ <td>User to impersonate when starting the session</td>
+ <td>string</td>
+ </tr>
+ <tr>
+ <td>jars</td>
+ <td>jars to be used in this session</td>
+ <td>List of string</td>
+ </tr>
+ <tr>
+ <td>pyFiles</td>
+ <td>Python files to be used in this session</td>
+ <td>List of string</td>
+ </tr>
+ <tr>
+ <td>files</td>
+ <td>files to be used in this session</td>
+ <td>List of string</td>
+ </tr>
+ <tr>
+ <td>driverMemory</td>
+ <td>Amount of memory to use for the driver process</td>
+ <td>string</td>
+ </tr>
+ <tr>
+ <td>driverCores</td>
+ <td>Number of cores to use for the driver process</td>
+ <td>int</td>
+ </tr>
+ <tr>
+ <td>executorMemory</td>
+ <td>Amount of memory to use per executor process</td>
+ <td>string</td>
+ </tr>
+ <tr>
+ <td>executorCores</td>
+ <td>Number of cores to use for each executor</td>
+ <td>int</td>
+ </tr>
+ <tr>
+ <td>numExecutors</td>
+ <td>Number of executors to launch for this session</td>
+ <td>int</td>
+ </tr>
+ <tr>
+ <td>archives</td>
+ <td>Archives to be used in this session</td>
+ <td>List of string</td>
+ </tr>
+ <tr>
+ <td>queue</td>
+ <td>The name of the YARN queue to which submitted</td>
+ <td>string</td>
+ </tr>
+ <tr>
+ <td>name</td>
+ <td>The name of this session</td>
+ <td>string</td>
+ </tr>
+ <tr>
+ <td>conf</td>
+ <td>Spark configuration properties</td>
+ <td>Map of key=val</td>
+ </tr>
+ <tr>
+ <td>heartbeatTimeoutInSecond</td>
+ <td>Timeout in second to which session be orphaned</td>
+ <td>int</td>
+ </tr>
+</table>
+
+#### Response Body
+
+The created <a href="#session">Session</a>.
+
+
+### GET /sessions/{sessionId}
+
+Returns the session information.
+
+#### Response Body
+
+The <a href="#session">Session</a>.
+
+
+### GET /sessions/{sessionId}/state
+
+Returns the state of session
+
+#### Response
+
+<table class="table">
+ <tr><th>Name</th><th>Description</th><th>Type</th></tr>
+ <tr>
+ <td>id</td>
+ <td>Session id</td>
+ <td>int</td>
+ </tr>
+ <tr>
+ <td>state</td>
+ <td>The current state of session</td>
+ <td>string</td>
+ </tr>
+</table>
+
+### DELETE /sessions/{sessionId}
+
+Kills the <a href="#session">Session</a> job.
+
+
+### GET /sessions/{sessionId}/log
+
+Gets the log lines from this session.
+
+#### Request Parameters
+
+<table class="table">
+ <tr><th>Name</th><th>Description</th><th>Type</th></tr>
+ <tr>
+ <td>from</td>
+ <td>Offset</td>
+ <td>int</td>
+ </tr>
+ <tr>
+ <td>size</td>
+ <td>Max number of log lines to return</td>
+ <td>int</td>
+ </tr>
+</table>
+
+#### Response Body
+
+<table class="table">
+ <tr><th>Name</th><th>Description</th><th>Type</th></tr>
+ <tr>
+ <td>id</td>
+ <td>The session id</td>
+ <td>int</td>
+ </tr>
+ <tr>
+ <td>from</td>
+ <td>Offset from start of log</td>
+ <td>int</td>
+ </tr>
+ <tr>
+ <td>size</td>
+ <td>Max number of log lines</td>
+ <td>int</td>
+ </tr>
+ <tr>
+ <td>log</td>
+ <td>The log lines</td>
+ <td>list of strings</td>
+ </tr>
+</table>
+
+### GET /sessions/{sessionId}/statements
+
+Returns all the statements in a session.
+
+#### Response Body
+
+<table class="table">
+ <tr><th>Name</th><th>Description</th><th>Type</th></tr>
+ <tr>
+ <td>statements</td>
+ <td><a href="#statement">statement</a> list</td>
+ <td>list</td>
+ </tr>
+</table>
+
+### POST /sessions/{sessionId}/statements
+
+Runs a statement in a session.
+
+#### Request Body
+
+<table class="table">
+ <tr><th>Name</th><th>Description</th><th>Type</th></tr>
+ <tr>
+ <td>code</td>
+ <td>The code to execute</td>
+ <td>string</td>
+ </tr>
+</table>
+
+#### Response Body
+
+The <a href="#statement">statement</a> object.
+
+
+### GET /sessions/{sessionId}/statements/{statementId}
+
+Returns a specified statement in a session.
+
+#### Response Body
+
+The <a href="#statement">statement</a> object.
+
+
+### POST /sessions/{sessionId}/statements/{statementId}/cancel
+
+Cancel the specified statement in this session.
+
+#### Response Body
+
+<table class="table">
+ <tr><th>Name</th><th>Description</th><th>Type</th></tr>
+ <tr>
+ <td>msg</td>
+ <td>is always "cancelled"</td>
+ <td>string</td>
+ </tr>
+</table>
+
+### GET /batches
+
+Returns all the active batch sessions.
+
+#### Request Parameters
+
+<table class="table">
+ <tr><th>Name</th><th>Description</th><th>Type</th></tr>
+ <tr>
+ <td>from</td>
+ <td>The start index to fetch sessions</td>
+ <td>int</td>
+ </tr>
+ <tr>
+ <td>size</td>
+ <td>Number of sessions to fetch</td>
+ <td>int</td>
+ </tr>
+</table>
+
+#### Response Body
+
+<table class="table">
+ <tr><th>Name</th><th>Description</th><th>Type</th></tr>
+ <tr>
+ <td>from</td>
+ <td>The start index of fetched sessions</td>
+ <td>int</td>
+ </tr>
+ <tr>
+ <td>total</td>
+ <td>Number of sessions fetched</td>
+ <td>int</td>
+ </tr>
+ <tr>
+ <td>sessions</td>
+ <td><a href="#batch">Batch</a> list</td>
+ <td>list</td>
+ </tr>
+</table>
+
+### POST /batches
+
+#### Request Body
+
+<table class="table">
+ <tr><th>Name</th><th>Description</th><th>Type</th></tr>
+ <tr>
+ <td>file</td>
+ <td>File containing the application to execute</td>
+ <td>path (required)</td>
+ </tr>
+ <tr>
+ <td>proxyUser</td>
+ <td>User to impersonate when running the job</td>
+ <td>string</td>
+ </tr>
+ <tr>
+ <td>className</td>
+ <td>Application Java/Spark main class</td>
+ <td>string</td>
+ </tr>
+ <tr>
+ <td>args</td>
+ <td>Command line arguments for the application</td>
+ <td>list of strings</td>
+ </tr>
+ <tr>
+ <td>jars</td>
+ <td>jars to be used in this session</td>
+ <td>list of strings</td>
+ </tr>
+ <tr>
+ <td>pyFiles</td>
+ <td>Python files to be used in this session</td>
+ <td>list of strings</td>
+ </tr>
+ <tr>
+ <td>files</td>
+ <td>files to be used in this session</td>
+ <td>list of strings</td>
+ </tr>
+ <tr>
+ <td>driverMemory</td>
+ <td>Amount of memory to use for the driver process</td>
+ <td>string</td>
+ </tr>
+ <tr>
+ <td>driverCores</td>
+ <td>Number of cores to use for the driver process</td>
+ <td>int</td>
+ </tr>
+ <tr>
+ <td>executorMemory</td>
+ <td>Amount of memory to use per executor process</td>
+ <td>string</td>
+ </tr>
+ <tr>
+ <td>executorCores</td>
+ <td>Number of cores to use for each executor</td>
+ <td>int</td>
+ </tr>
+ <tr>
+ <td>numExecutors</td>
+ <td>Number of executors to launch for this session</td>
+ <td>int</td>
+ </tr>
+ <tr>
+ <td>archives</td>
+ <td>Archives to be used in this session</td>
+ <td>List of string</td>
+ </tr>
+ <tr>
+ <td>queue</td>
+ <td>The name of the YARN queue to which submitted</td>
+ <td>string</td>
+ </tr>
+ <tr>
+ <td>name</td>
+ <td>The name of this session</td>
+ <td>string</td>
+ </tr>
+ <tr>
+ <td>conf</td>
+ <td>Spark configuration properties</td>
+ <td>Map of key=val</td>
+ </tr>
+</table>
+
+#### Response Body
+
+The created <a href="#batch">Batch</a> object.
+
+
+### GET /batches/{batchId}
+
+Returns the batch session information.
+
+#### Response Body
+
+The <a href="#batch">Batch</a>.
+
+
+### GET /batches/{batchId}/state
+
+Returns the state of batch session
+
+#### Response
+
+<table class="table">
+ <tr><th>Name</th><th>Description</th><th>Type</th></tr>
+ <tr>
+ <td>id</td>
+ <td>Batch session id</td>
+ <td>int</td>
+ </tr>
+ <tr>
+ <td>state</td>
+ <td>The current state of batch session</td>
+ <td>string</td>
+ </tr>
+</table>
+
+### DELETE /batches/{batchId}
+
+Kills the <a href="#batch">Batch</a> job.
+
+
+### GET /batches/{batchId}/log
+
+Gets the log lines from this batch.
+
+#### Request Parameters
+
+<table class="table">
+ <tr><th>Name</th><th>Description</th><th>Type</th></tr>
+ <tr>
+ <td>from</td>
+ <td>Offset</td>
+ <td>Offset</td>
+ </tr>
+ <tr>
+ <td>size</td>
+ <td>Max number of log lines to return</td>
+ <td>Offset</td>
+ </tr>
+</table>
+
+#### Response Body
+
+<table class="table">
+ <tr><th>Name</th><th>Description</th><th>Type</th></tr>
+ <tr>
+ <td>id</td>
+ <td>The batch id</td>
+ <td>id</td>
+ </tr>
+ <tr>
+ <td>from</td>
+ <td>Offset from start of log</td>
+ <td>id</td>
+ </tr>
+ <tr>
+ <td>size</td>
+ <td>Number of log lines</td>
+ <td>id</td>
+ </tr>
+ <tr>
+ <td>log</td>
+ <td>The log lines</td>
+ <td>list of strings</td>
+ </tr>
+</table>
+
+## REST Objects
+
+### Session
+
+A session represents an interactive shell.
+
+<table class="table">
+ <tr><th>Name</th><th>Description</th><th>Type</th></tr>
+ <tr>
+ <td>id</td>
+ <td>The session id</td>
+ <td>int</td>
+ </tr>
+ <tr>
+ <td>appId</td>
+ <td>The application id of this session</td>
+ <td>string</td>
+ </tr>
+ <tr>
+ <td>owner</td>
+ <td>Remote user who submitted this session</td>
+ <td>string</td>
+ </tr>
+ <tr>
+ <td>proxyUser</td>
+ <td>User to impersonate when running</td>
+ <td>string</td>
+ </tr>
+ <tr>
+ <td>kind</td>
+ <td>Session kind (spark, pyspark, or sparkr)</td>
+ <td><a href="#session-kind">session kind</a></td>
+ </tr>
+ <tr>
+ <td>log</td>
+ <td>The log lines</td>
+ <td>list of strings</td>
+ </tr>
+ <tr>
+ <td>state</td>
+ <td>The session state</td>
+ <td>string</td>
+ </tr>
+ <tr>
+ <td>appInfo</td>
+ <td>The detailed application info</td>
+ <td>Map of key=val</td>
+ </tr>
+</table>
+
+
+#### Session State
+
+<table class="table">
+ <tr><th>Value</th><th>Description</th></tr>
+ <tr>
+ <td>not_started</td>
+ <td>Session has not been started</td>
+ </tr>
+ <tr>
+ <td>starting</td>
+ <td>Session is starting</td>
+ </tr>
+ <tr>
+ <td>idle</td>
+ <td>Session is waiting for input</td>
+ </tr>
+ <tr>
+ <td>busy</td>
+ <td>Session is executing a statement</td>
+ </tr>
+ <tr>
+ <td>shutting_down</td>
+ <td>Session is shutting down</td>
+ </tr>
+ <tr>
+ <td>error</td>
+ <td>Session errored out</td>
+ </tr>
+ <tr>
+ <td>dead</td>
+ <td>Session has exited</td>
+ </tr>
+ <tr>
+ <td>success</td>
+ <td>Session is successfully stopped</td>
+ </tr>
+</table>
+
+#### Session Kind
+
+<table class="table">
+ <tr><th>Value</th><th>Description</th></tr>
+ <tr>
+ <td>spark</td>
+ <td>Interactive Scala Spark session</td>
+ </tr>
+ <tr>
+ <td><a href="#pyspark">pyspark</a></td>
+ <td>Interactive Python 2 Spark session</td>
+ </tr>
+ <tr>
+ <td><a href="#pyspark3">pyspark3</a></td>
+ <td>Interactive Python 3 Spark session</td>
+ </tr>
+ <tr>
+ <td>sparkr</td>
+ <td>Interactive R Spark session</td>
+ </tr>
+</table>
+
+#### pyspark
+To change the Python executable the session uses, Livy reads the path from environment variable
+``PYSPARK_PYTHON`` (Same as pyspark).
+
+Like pyspark, if Livy is running in ``local`` mode, just set the environment variable.
+If the session is running in ``yarn-cluster`` mode, please set
+``spark.yarn.appMasterEnv.PYSPARK_PYTHON`` in SparkConf so the environment variable is passed to
+the driver.
+
+#### pyspark3
+To change the Python executable the session uses, Livy reads the path from environment variable
+``PYSPARK3_PYTHON``.
+
+Like pyspark, if Livy is running in ``local`` mode, just set the environment variable.
+If the session is running in ``yarn-cluster`` mode, please set
+``spark.yarn.appMasterEnv.PYSPARK3_PYTHON`` in SparkConf so the environment variable is passed to
+the driver.
+
+### Statement
+
+A statement represents the result of an execution statement.
+
+<table class="table">
+ <tr><th>Name</th><th>Description</th><th>Type</th></tr>
+ <tr>
+ <td>id</td>
+ <td>The statement id</td>
+ <td>integer</td>
+ </tr>
+ <tr>
+ <td>code</td>
+ <td>The execution code</td>
+ <td>string</td>
+ </tr>
+ <tr>
+ <td>state</td>
+ <td>The execution state</td>
+ <td>statement state</td>
+ </tr>
+ <tr>
+ <td>output</td>
+ <td>The execution output</td>
+ <td>statement output</td>
+ </tr>
+</table>
+
+#### Statement State
+
+<table class="table">
+ <tr><th>Value</th><th>Description</th></tr>
+ <tr>
+ <td>waiting</td>
+ <td>Statement is enqueued but execution hasn't started</td>
+ </tr>
+ <tr>
+ <td>running</td>
+ <td>Statement is currently running</td>
+ </tr>
+ <tr>
+ <td>available</td>
+ <td>Statement has a response ready</td>
+ </tr>
+ <tr>
+ <td>error</td>
+ <td>Statement failed</td>
+ </tr>
+ <tr>
+ <td>cancelling</td>
+ <td>Statement is being cancelling</td>
+ </tr>
+ <tr>
+ <td>cancelled</td>
+ <td>Statement is cancelled</td>
+ </tr>
+</table>
+
+#### Statement Output
+
+<table class="table">
+ <tr><th>Name</th><th>Description</th><th>Type</th></tr>
+ <tr>
+ <td>status</td>
+ <td>Execution status</td>
+ <td>string</td>
+ </tr>
+ <tr>
+ <td>execution_count</td>
+ <td>A monotonically increasing number</td>
+ <td>integer</td>
+ </tr>
+ <tr>
+ <td>data</td>
+ <td>Statement output</td>
+ <td>An object mapping a mime type to the result. If the mime type is
+ ``application/json``, the value is a JSON value.</td>
+ </tr>
+</table>
+
+### Batch
+
+<table class="table">
+ <tr><th>Name</th><th>Description</th><th>Type</th></tr>
+ <tr>
+ <td>id</td>
+ <td>The session id</td>
+ <td>int</td>
+ </tr>
+ <tr>
+ <td>appId</td>
+ <td>The application id of this session</td>
+ <td>string</td>
+ </tr>
+ <tr>
+ <td>appInfo</td>
+ <td>The detailed application info</td>
+ <td>Map of key=val</td>
+ </tr>
+ <tr>
+ <td>log</td>
+ <td>The log lines</td>
+ <td>list of strings</td>
+ </tr>
+ <tr>
+ <td>state</td>
+ <td>The batch state</td>
+ <td>string</td>
+ </tr>
+</table>