You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by fe...@apache.org on 2016/02/03 05:22:19 UTC

incubator-zeppelin git commit: HBase Shell Interpreter

Repository: incubator-zeppelin
Updated Branches:
  refs/heads/master ea03e84d6 -> 1940388e3


HBase Shell Interpreter

Support for Hbase Shell. All the commands documented here https://wiki.apache.org/hadoop/Hbase/Shell is supported.

 Requirements:

 Hbase Shell should be installed on the same machine. To be more specific, the following dir. should be available: https://github.com/apache/hbase/tree/master/hbase-shell/src/main/ruby
 Hbase Shell should be able to connect to the Hbase cluster from terminal. This makes sure that the client is configured properly.
 The interpreter takes 3 config parameters:

 hbase.home: Root dir. where hbase is installed. Default is /usr/lib/hbase/
 hbase.ruby.sources: Dir where shell ruby code is installed. Path is relative to hbase.home. Default: lib/ruby
 hbase.irb.load: (Testing only) Default is true. Whether to load irb in the interpreter.

Author: Rajat Venkatesh <rv...@qubole.com>

Closes #278 from vrajat/incubator_hbase and squashes the following commits:

caf87f3 [Rajat Venkatesh] Fix Protobuf version number
c17db3b [Rajat Venkatesh] Fix typo in ZeppelinConfiguration
3efc892 [Rajat Venkatesh] Do not use ruby 1.9 and do not bother setting paths
9924784 [Rajat Venkatesh] Log absolute path of ruby source
69755ad [Rajat Venkatesh] Set hbase.ruby.sources in system properties
57ebad8 [Rajat Venkatesh] Fix hirb path
39dddb8 [Rajat Venkatesh] Address minor review comments
b4ad18d [Rajat Venkatesh] Load hirb
49b5b27 [Rajat Venkatesh] Merge from master
320bfd5 [Rajat Venkatesh] Add information about licenses
7078a35 [Rajat Venkatesh] Add a doc for HBase shell interpreter
0fdcfe6 [Rajat Venkatesh] Merge from master
be1bde7 [Rajat Venkatesh] Use Paths and Path instead of Strings to manipulate file system paths
e21539b [Rajat Venkatesh] Remove hirb. Add a property for testing which disables all checks
7e9dffb [Rajat Venkatesh] Minor review comments
4f6bd04 [Rajat Venkatesh] Merge from master
72306b7 [Rajat Venkatesh] Merge from master
ca64931 [Rajat Venkatesh] Review comments
255d0d9 [Rajat Venkatesh] Add more info in javadoc
b598b70 [Rajat Venkatesh] Fix javadoc in unit tests
19f137e [Rajat Venkatesh] Terminate jruby
c160787 [Rajat Venkatesh] Explicitly add private keyword. Improve javadoc
feacd89 [Rajat Venkatesh] Fix tab in pom.xml
b8b52ba [Rajat Venkatesh] Missed a couple of resolved conflicts
afd50bc [Rajat Venkatesh] Merge master
9a23a21 [Rajat Venkatesh] Add an explicit dependency for mapreduce-client-core
b7b06cd [Rajat Venkatesh] Fix version to add incubating string
bc03f79 [Rajat Venkatesh] Merge remote branch 'upstream/master' into incubator_hbase
b9a407c [Rajat Venkatesh] Specify relative path
b2ff198 [Rajat Venkatesh] More fixes - sigh
032a2a4 [Rajat Venkatesh] More fixes for version config vars
63a2d89 [Rajat Venkatesh] Add a new config for hbase version for interpreter
cd41ec2 [Rajat Venkatesh] Add a profile for Hbase-1.0
03e1b7a [Rajat Venkatesh] Fix test setup
bdba5b2 [Rajat Venkatesh] Hbase Interpreter


Project: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/commit/1940388e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/tree/1940388e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/diff/1940388e

Branch: refs/heads/master
Commit: 1940388e3422b86a322fc82a0e7868ff25126804
Parents: ea03e84
Author: Rajat Venkatesh <rv...@qubole.com>
Authored: Mon Feb 1 16:26:35 2016 +0530
Committer: Felix Cheung <fe...@apache.org>
Committed: Tue Feb 2 20:22:15 2016 -0800

----------------------------------------------------------------------
 conf/zeppelin-site.xml.template                 |   2 +-
 docs/_includes/themes/zeppelin/_navigation.html |   1 +
 docs/interpreter/hbase.md                       |  57 ++++++
 hbase/pom.xml                                   | 176 +++++++++++++++++++
 .../apache/zeppelin/hbase/HbaseInterpreter.java | 158 +++++++++++++++++
 .../zeppelin/hbase/HbaseInterpreterTest.java    |  75 ++++++++
 pom.xml                                         |   1 +
 zeppelin-distribution/src/bin_license/LICENSE   |   5 +
 .../zeppelin/conf/ZeppelinConfiguration.java    |   3 +-
 9 files changed, 476 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/1940388e/conf/zeppelin-site.xml.template
----------------------------------------------------------------------
diff --git a/conf/zeppelin-site.xml.template b/conf/zeppelin-site.xml.template
index 1d085ec..a55f6ae 100755
--- a/conf/zeppelin-site.xml.template
+++ b/conf/zeppelin-site.xml.template
@@ -111,7 +111,7 @@
 
 <property>
   <name>zeppelin.interpreters</name>
-  <value>org.apache.zeppelin.spark.SparkInterpreter,org.apache.zeppelin.spark.PySparkInterpreter,org.apache.zeppelin.spark.SparkSqlInterpreter,org.apache.zeppelin.spark.DepInterpreter,org.apache.zeppelin.markdown.Markdown,org.apache.zeppelin.angular.AngularInterpreter,org.apache.zeppelin.shell.ShellInterpreter,org.apache.zeppelin.hive.HiveInterpreter,org.apache.zeppelin.tajo.TajoInterpreter,org.apache.zeppelin.flink.FlinkInterpreter,org.apache.zeppelin.lens.LensInterpreter,org.apache.zeppelin.ignite.IgniteInterpreter,org.apache.zeppelin.ignite.IgniteSqlInterpreter,org.apache.zeppelin.cassandra.CassandraInterpreter,org.apache.zeppelin.geode.GeodeOqlInterpreter,org.apache.zeppelin.postgresql.PostgreSqlInterpreter,org.apache.zeppelin.jdbc.JDBCInterpreter,org.apache.zeppelin.phoenix.PhoenixInterpreter,org.apache.zeppelin.kylin.KylinInterpreter,org.apache.zeppelin.elasticsearch.ElasticsearchInterpreter,org.apache.zeppelin.scalding.ScaldingInterpreter,org.apache.zeppelin.tachyon.TachyonIn
 terpreter</value>
+  <value>org.apache.zeppelin.spark.SparkInterpreter,org.apache.zeppelin.spark.PySparkInterpreter,org.apache.zeppelin.spark.SparkSqlInterpreter,org.apache.zeppelin.spark.DepInterpreter,org.apache.zeppelin.markdown.Markdown,org.apache.zeppelin.angular.AngularInterpreter,org.apache.zeppelin.shell.ShellInterpreter,org.apache.zeppelin.hive.HiveInterpreter,org.apache.zeppelin.tajo.TajoInterpreter,org.apache.zeppelin.flink.FlinkInterpreter,org.apache.zeppelin.lens.LensInterpreter,org.apache.zeppelin.ignite.IgniteInterpreter,org.apache.zeppelin.ignite.IgniteSqlInterpreter,org.apache.zeppelin.cassandra.CassandraInterpreter,org.apache.zeppelin.geode.GeodeOqlInterpreter,org.apache.zeppelin.postgresql.PostgreSqlInterpreter,org.apache.zeppelin.jdbc.JDBCInterpreter,org.apache.zeppelin.phoenix.PhoenixInterpreter,org.apache.zeppelin.kylin.KylinInterpreter,org.apache.zeppelin.elasticsearch.ElasticsearchInterpreter,org.apache.zeppelin.scalding.ScaldingInterpreter,org.apache.zeppelin.tachyon.TachyonIn
 terpreter,org.apache.zeppelin.hbase.HbaseInterpreter</value>
   <description>Comma separated interpreter configurations. First interpreter become a default</description>
 </property>
 

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/1940388e/docs/_includes/themes/zeppelin/_navigation.html
----------------------------------------------------------------------
diff --git a/docs/_includes/themes/zeppelin/_navigation.html b/docs/_includes/themes/zeppelin/_navigation.html
index 7a73365..ed54336 100644
--- a/docs/_includes/themes/zeppelin/_navigation.html
+++ b/docs/_includes/themes/zeppelin/_navigation.html
@@ -42,6 +42,7 @@
                 <li><a href="{{BASE_PATH}}/interpreter/elasticsearch.html">Elasticsearch</a></li>
                 <li><a href="{{BASE_PATH}}/interpreter/flink.html">Flink</a></li>
                 <li><a href="{{BASE_PATH}}/interpreter/geode.html">Geode</a></li>
+                <li><a href="{{BASE_PATH}}/interpreter/hbase.html">HBase</a></li>
                 <li><a href="{{BASE_PATH}}/interpreter/hive.html">Hive</a></li>
                 <li><a href="{{BASE_PATH}}/interpreter/ignite.html">Ignite</a></li>
                 <li><a href="{{BASE_PATH}}/interpreter/lens.html">Lens</a></li>

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/1940388e/docs/interpreter/hbase.md
----------------------------------------------------------------------
diff --git a/docs/interpreter/hbase.md b/docs/interpreter/hbase.md
new file mode 100644
index 0000000..30cec44
--- /dev/null
+++ b/docs/interpreter/hbase.md
@@ -0,0 +1,57 @@
+---
+layout: page
+title: "HBase Shell Interpreter"
+description: ""
+group: manual
+---
+{% include JB/setup %}
+
+
+## HBase Shell Interpreter for Apache Zeppelin
+[HBase Shell](http://hbase.apache.org/book.html#shell) is a JRuby IRB client for Apache HBase. 
+This interpreter provides all capabilities of Apache HBase shell within Apache Zeppelin. The 
+interpreter assumes that Apache HBase client software has been installed and its possible to 
+connect to the Apache HBase cluster from the machine on where Apache Zeppelin is installed.
+
+<br />
+## 1. Configuration
+
+<table class="table-configuration">
+  <tr>
+    <th>Property</th>
+    <th>Default</th>
+    <th>Description</th>
+  </tr>
+  <tr>
+    <td>hbase.home</td>
+    <td>/usr/lib/hbase</td>
+    <td>Installation directory of Hbase</td>
+  </tr>
+  <tr>
+    <td>hbase.ruby.sources</td>
+    <td>lib/ruby</td>
+    <td>Path to Ruby scripts relative to 'hbase.home'</td>
+  </tr>
+  <tr>
+    <td>hbase.test.mode</td>
+    <td>false</td>
+    <td>Disable checks for unit and manual tests</td>
+  </tr>
+</table>
+
+## 2. Enabling the HBase Shell Interpreter
+
+In a notebook, to enable the **HBase Shell** interpreter, click the **Gear** icon and select 
+**HBase Shell**.
+
+## 3. Using the HBase Shell Interpreter
+
+In a paragraph, use `%hbase` to select the **HBase Shell** interpreter and then input all commands.
+ To get the list of available commands, use `help`.
+
+```bash
+| %hbase
+| help
+```
+
+For more information on all commands available, refer to [HBase Shell Documentation](http://hbase.apache.org/book.html#shell)
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/1940388e/hbase/pom.xml
----------------------------------------------------------------------
diff --git a/hbase/pom.xml b/hbase/pom.xml
new file mode 100644
index 0000000..f70ef88
--- /dev/null
+++ b/hbase/pom.xml
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You under the Apache License, Version 2.0
+  ~ (the "License"); you may not use this file except in compliance with
+  ~ the License.  You may obtain a copy of the License at
+  ~
+  ~    http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <parent>
+    <artifactId>zeppelin</artifactId>
+    <groupId>org.apache.zeppelin</groupId>
+    <version>0.6.0-incubating-SNAPSHOT</version>
+  </parent>
+
+  <groupId>org.apache.zeppelin</groupId>
+  <artifactId>zeppelin-hbase</artifactId>
+  <packaging>jar</packaging>
+  <version>0.6.0-incubating-SNAPSHOT</version>
+  <name>Zeppelin: HBase interpreter</name>
+  <url>http://www.apache.org</url>
+
+  <properties>
+    <hbase.hbase.version>1.0.0</hbase.hbase.version>
+    <hbase.hadoop.version>2.6.0</hbase.hadoop.version>
+    <jruby.version>1.6.8</jruby.version>
+    <protobuf.version>2.5.0</protobuf.version>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>zeppelin-interpreter</artifactId>
+      <version>${project.version}</version>
+      <scope>provided</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-exec</artifactId>
+      <version>1.1</version>
+    </dependency>
+
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.11</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.hamcrest</groupId>
+      <artifactId>hamcrest-all</artifactId>
+      <version>1.3</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.jruby</groupId>
+      <artifactId>jruby-complete</artifactId>
+      <version>${jruby.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.hadoop</groupId>
+      <artifactId>hadoop-yarn-common</artifactId>
+      <version>${hbase.hadoop.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.hadoop</groupId>
+      <artifactId>hadoop-yarn-api</artifactId>
+      <version>${hbase.hadoop.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.hbase</groupId>
+      <artifactId>hbase-client</artifactId>
+      <version>${hbase.hbase.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.hbase</groupId>
+      <artifactId>hbase-annotations</artifactId>
+      <version>${hbase.hbase.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>com.google.protobuf</groupId>
+      <artifactId>protobuf-java</artifactId>
+      <version>${protobuf.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.hbase</groupId>
+      <artifactId>hbase-server</artifactId>
+      <version>${hbase.hbase.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>jline</groupId>
+      <artifactId>jline</artifactId>
+      <version>2.12.1</version>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-deploy-plugin</artifactId>
+        <version>2.7</version>
+        <configuration>
+          <skip>true</skip>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>1.3.1</version>
+        <executions>
+          <execution>
+            <id>enforce</id>
+            <phase>none</phase>
+          </execution>
+        </executions>
+      </plugin>
+
+      <plugin>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <version>2.8</version>
+        <executions>
+          <execution>
+            <id>copy-dependencies</id>
+            <phase>package</phase>
+            <goals>
+              <goal>copy-dependencies</goal>
+            </goals>
+            <configuration>
+              <outputDirectory>${project.build.directory}/../../interpreter/hbase</outputDirectory>
+              <overWriteReleases>false</overWriteReleases>
+              <overWriteSnapshots>false</overWriteSnapshots>
+              <overWriteIfNewer>true</overWriteIfNewer>
+              <includeScope>runtime</includeScope>
+            </configuration>
+          </execution>
+          <execution>
+            <id>copy-artifact</id>
+            <phase>package</phase>
+            <goals>
+              <goal>copy</goal>
+            </goals>
+            <configuration>
+              <outputDirectory>${project.build.directory}/../../interpreter/hbase</outputDirectory>
+              <overWriteReleases>false</overWriteReleases>
+              <overWriteSnapshots>false</overWriteSnapshots>
+              <overWriteIfNewer>true</overWriteIfNewer>
+              <includeScope>runtime</includeScope>
+              <artifactItems>
+                <artifactItem>
+                  <groupId>${project.groupId}</groupId>
+                  <artifactId>${project.artifactId}</artifactId>
+                  <version>${project.version}</version>
+                  <type>${project.packaging}</type>
+                </artifactItem>
+              </artifactItems>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/1940388e/hbase/src/main/java/org/apache/zeppelin/hbase/HbaseInterpreter.java
----------------------------------------------------------------------
diff --git a/hbase/src/main/java/org/apache/zeppelin/hbase/HbaseInterpreter.java b/hbase/src/main/java/org/apache/zeppelin/hbase/HbaseInterpreter.java
new file mode 100644
index 0000000..dbcb33d
--- /dev/null
+++ b/hbase/src/main/java/org/apache/zeppelin/hbase/HbaseInterpreter.java
@@ -0,0 +1,158 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.zeppelin.hbase;
+
+import org.apache.zeppelin.interpreter.*;
+import org.apache.zeppelin.scheduler.Scheduler;
+import org.apache.zeppelin.scheduler.SchedulerFactory;
+import org.jruby.embed.LocalContextScope;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.jruby.embed.ScriptingContainer;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Properties;
+
+/**
+ * Support for Hbase Shell. All the commands documented here
+ * http://hbase.apache.org/book.html#shell is supported.
+ *
+ * Requirements:
+ * Hbase Shell should be installed on the same machine. To be more specific, the following dir.
+ * should be available: https://github.com/apache/hbase/tree/master/hbase-shell/src/main/ruby
+ * Hbase Shell should be able to connect to the Hbase cluster from terminal. This makes sure
+ * that the client is configured properly.
+ *
+ * The interpreter takes 3 config parameters:
+ * hbase.home: Root dir. where hbase is installed. Default is /usr/lib/hbase/
+ * hbase.ruby.sources: Dir where shell ruby code is installed.
+ *                          Path is relative to hbase.home. Default: lib/ruby
+ * hbase.irb.load: (Testing only) Default is true.
+ *                      Whether to load irb in the interpreter.
+ */
+public class HbaseInterpreter extends Interpreter {
+  private Logger logger = LoggerFactory.getLogger(HbaseInterpreter.class);
+  private ScriptingContainer scriptingContainer;
+
+  private StringWriter writer;
+
+  static {
+    Interpreter.register("hbase", "hbase", HbaseInterpreter.class.getName(),
+        new InterpreterPropertyBuilder()
+            .add("hbase.home", "/usr/lib/hbase/", "Installation dir. of Hbase")
+            .add("hbase.ruby.sources", "lib/ruby",
+                "Path to Ruby scripts relative to 'hbase.home'")
+            .add("hbase.test.mode", "false", "Disable checks for unit and manual tests")
+            .build());
+  }
+
+  public HbaseInterpreter(Properties property) {
+    super(property);
+  }
+
+  @Override
+  public void open() {
+    this.scriptingContainer  = new ScriptingContainer(LocalContextScope.SINGLETON);
+    this.writer = new StringWriter();
+    scriptingContainer.setOutput(this.writer);
+
+    if (!Boolean.parseBoolean(getProperty("hbase.test.mode"))) {
+      String hbase_home = getProperty("hbase.home");
+      String ruby_src = getProperty("hbase.ruby.sources");
+      Path abs_ruby_src = Paths.get(hbase_home, ruby_src).toAbsolutePath();
+
+      logger.info("Home:" + hbase_home);
+      logger.info("Ruby Src:" + ruby_src);
+
+      File f = abs_ruby_src.toFile();
+      if (!f.exists() || !f.isDirectory()) {
+        throw new InterpreterException("hbase ruby sources is not available at '" + abs_ruby_src
+            + "'");
+      }
+
+      logger.info("Absolute Ruby Source:" + abs_ruby_src.toString());
+      // hirb.rb:41 requires the following system property to be set.
+      Properties sysProps = System.getProperties();
+      sysProps.setProperty("hbase.ruby.sources", abs_ruby_src.toString());
+
+      Path abs_hirb_path = Paths.get(hbase_home, "bin/hirb.rb");
+      try {
+        FileInputStream fis = new FileInputStream(abs_hirb_path.toFile());
+        this.scriptingContainer.runScriptlet(fis, "hirb.rb");
+        fis.close();
+      } catch (IOException e) {
+        throw new InterpreterException(e.getCause());
+      }
+    }
+  }
+
+  @Override
+  public void close() {
+    if (this.scriptingContainer != null) {
+      this.scriptingContainer.terminate();
+    }
+  }
+
+  @Override
+  public InterpreterResult interpret(String cmd, InterpreterContext interpreterContext) {
+    try {
+      logger.info(cmd);
+      this.writer.getBuffer().setLength(0);
+      this.scriptingContainer.runScriptlet(cmd);
+      this.writer.flush();
+      logger.debug(writer.toString());
+      return new InterpreterResult(InterpreterResult.Code.SUCCESS, writer.getBuffer().toString());
+    } catch (Throwable t) {
+      logger.error("Can not run '" + cmd + "'", t);
+      return new InterpreterResult(InterpreterResult.Code.ERROR, t.getMessage());
+    }
+  }
+
+  @Override
+  public void cancel(InterpreterContext context) {}
+
+  @Override
+  public FormType getFormType() {
+    return FormType.SIMPLE;
+  }
+
+  @Override
+  public int getProgress(InterpreterContext context) {
+    return 0;
+  }
+
+  @Override
+  public Scheduler getScheduler() {
+    return SchedulerFactory.singleton().createOrGetFIFOScheduler(
+        HbaseInterpreter.class.getName() + this.hashCode());
+  }
+
+  @Override
+  public List<String> completion(String buf, int cursor) {
+    return null;
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/1940388e/hbase/src/test/java/org/apache/zeppelin/hbase/HbaseInterpreterTest.java
----------------------------------------------------------------------
diff --git a/hbase/src/test/java/org/apache/zeppelin/hbase/HbaseInterpreterTest.java b/hbase/src/test/java/org/apache/zeppelin/hbase/HbaseInterpreterTest.java
new file mode 100644
index 0000000..e218070
--- /dev/null
+++ b/hbase/src/test/java/org/apache/zeppelin/hbase/HbaseInterpreterTest.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.zeppelin.hbase;
+
+import org.apache.log4j.BasicConfigurator;
+import org.apache.zeppelin.interpreter.InterpreterResult;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Properties;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.*;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Tests for HBase Interpreter
+ */
+public class HbaseInterpreterTest {
+  private static Logger logger = LoggerFactory.getLogger(HbaseInterpreterTest.class);
+  private static HbaseInterpreter hbaseInterpreter;
+
+  @BeforeClass
+  public static void setUp() throws NullPointerException {
+    BasicConfigurator.configure();
+    Properties properties = new Properties();
+    properties.put("hbase.home", "");
+    properties.put("hbase.ruby.sources", "");
+    properties.put("hbase.test.mode", "true");
+
+    hbaseInterpreter = new HbaseInterpreter(properties);
+    hbaseInterpreter.open();
+  }
+  
+  @Test
+  public void newObject() {
+    assertThat(hbaseInterpreter, notNullValue());
+  }
+
+  @Test
+  public void putsTest() {
+    InterpreterResult result = hbaseInterpreter.interpret("puts \"Hello World\"", null);
+    assertEquals(InterpreterResult.Code.SUCCESS, result.code());
+    assertEquals(result.type(), InterpreterResult.Type.TEXT);
+    assertEquals("Hello World\n", result.message());
+  }
+  
+  public void putsLoadPath() {
+    InterpreterResult result = hbaseInterpreter.interpret("require 'two_power'; puts twoToThePowerOf(4)", null);
+    assertEquals(InterpreterResult.Code.SUCCESS, result.code());
+    assertEquals(result.type(), InterpreterResult.Type.TEXT);
+    assertEquals("16\n", result.message());
+  }
+
+  @Test
+  public void testException() {
+    InterpreterResult result = hbaseInterpreter.interpret("plot practical joke", null);
+    assertEquals(InterpreterResult.Code.ERROR, result.code());
+    assertEquals("(NameError) undefined local variable or method `joke' for main:Object", result.message());
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/1940388e/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 9d46c0d..28260cf 100755
--- a/pom.xml
+++ b/pom.xml
@@ -93,6 +93,7 @@
     <module>angular</module>
     <module>shell</module>
     <module>hive</module>
+    <module>hbase</module>
     <module>phoenix</module>
     <module>postgresql</module>
     <module>jdbc</module>

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/1940388e/zeppelin-distribution/src/bin_license/LICENSE
----------------------------------------------------------------------
diff --git a/zeppelin-distribution/src/bin_license/LICENSE b/zeppelin-distribution/src/bin_license/LICENSE
index 36e9836..a12b9c4 100644
--- a/zeppelin-distribution/src/bin_license/LICENSE
+++ b/zeppelin-distribution/src/bin_license/LICENSE
@@ -37,6 +37,7 @@ The following components are provided under Apache License.
     (Apache 2.0) Apache Cassandra (http://cassandra.apache.org/)
     (Apache 2.0) Apache CXF (http://cxf.apache.org/)
     (Apache 2.0) Apache Hive (http://hive.apache.org/)
+    (Apache 2.0) Apache HBase (http://hbase.apache.org/)
     (Apache 2.0) Apache Ignite (http://ignite.apache.org/)
     (Apache 2.0) Apache Kylin (http://kylin.apache.org/)
     (Apache 2.0) Apache Lens (http://lens.apache.org/)
@@ -94,6 +95,7 @@ The following components are provided under Apache License.
     (Apache 2.0) Shiro Core (org.apache.shiro:shiro-core:1.2.3 - https://shiro.apache.org)
     (Apache 2.0) Shiro Web (org.apache.shiro:shiro-web:1.2.3 - https://shiro.apache.org)
     (Apache 2.0) SnakeYAML (org.yaml:snakeyaml:1.15 - http://www.snakeyaml.org)
+    (Apache 2.0) Protocol Buffers (com.google.protobuf:protobuf-java:2.4.1 - https://github.com/google/protobuf/releases)
     (Apache 2.0) Tachyon Shell (org.tachyonproject:tachyon-shell:0.8.2 - http://tachyon-project.org)
     (Apache 2.0) Tachyon Servers (org.tachyonproject:tachyon-servers:0.8.2 - http://tachyon-project.org)
     (Apache 2.0) Tachyon Minicluster (org.tachyonproject:tachyon-minicluster:0.8.2 - http://tachyon-project.org)
@@ -154,6 +156,8 @@ The text of each license is also included at licenses/LICENSE-[project]-[version
     (BSD Style) dom4j v1.6.1 (http://www.dom4j.org) - https://github.com/dom4j/dom4j/blob/dom4j_1_6_1/LICENSE.txt
     (BSD Style) JSch v0.1.53 (http://www.jcraft.com) - http://www.jcraft.com/jsch/LICENSE.txt
     (BSD 3 Clause) highlightjs v8.4.0 (https://highlightjs.org/) - https://github.com/isagalaev/highlight.js/blob/8.4/LICENSE
+    (BSD 3 Clause) hamcrest v1.3 (http://hamcrest.org/JavaHamcrest/) - http://opensource.org/licenses/BSD-3-Clause
+    (BSD Style) JLine v2.12.1 (https://github.com/jline/jline2) - https://github.com/jline/jline2/blob/master/LICENSE.txt
 
 
 
@@ -194,6 +198,7 @@ The following components are provided under the EPL License.
 
     (EPL 1.0) Aether (org.sonatype.aether - http://www.eclipse.org/aether/)
     (EPL 1.0) JDT Annotations For Enhanced Null Analysis (org.eclipse.jdt:org.eclipse.jdt.annotation:1.1.0 - https://repo.eclipse.org/content/repositories/eclipse-releases/org/eclipse/jdt/org.eclipse.jdt.annotation)
+    (EPL 1.0) JRuby (org.jruby.jruby-complete:v1.6.8 - http://www.jruby.org/)
 
 
 ========================================================================

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/1940388e/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java
index 421b3d4..687e622 100755
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java
@@ -458,7 +458,8 @@ public class ZeppelinConfiguration extends XMLConfiguration {
         + "org.apache.zeppelin.kylin.KylinInterpreter,"
         + "org.apache.zeppelin.elasticsearch.ElasticsearchInterpreter,"
         + "org.apache.zeppelin.scalding.ScaldingInterpreter,"
-        + "org.apache.zeppelin.jdbc.JDBCInterpreter"),
+        + "org.apache.zeppelin.jdbc.JDBCInterpreter,"
+        + "org.apache.zeppelin.hbase.HbaseInterpreter"),
     ZEPPELIN_INTERPRETER_DIR("zeppelin.interpreter.dir", "interpreter"),
     ZEPPELIN_INTERPRETER_LOCALREPO("zeppelin.interpreter.localRepo", "local-repo"),
     ZEPPELIN_INTERPRETER_CONNECT_TIMEOUT("zeppelin.interpreter.connect.timeout", 30000),