You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by zj...@apache.org on 2020/03/20 06:45:44 UTC

[zeppelin] branch branch-0.9 updated (c5c8c87 -> 2a0141d)

This is an automated email from the ASF dual-hosted git repository.

zjffdu pushed a change to branch branch-0.9
in repository https://gitbox.apache.org/repos/asf/zeppelin.git.


    from c5c8c87  [hotfix] Fix publish script
     new 8214b97  [ZEPPELIN-4688]. Support set statement in flink sql
     new 464027a  [ZEPPELIN-4686] Update commons-lang to commons-lang3
     new 2a0141d  [ZEPPELIN-4687]. Allow to run multiple sql as one flink job

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 cassandra/pom.xml                                  |   2 -
 elasticsearch/pom.xml                              |   4 +-
 .../ElasticsearchInterpreterTest.java              |  14 +-
 file/pom.xml                                       |   4 +-
 .../apache/zeppelin/file/HDFSFileInterpreter.java  |   2 +-
 flink/pom.xml                                      |   4 +
 .../apache/zeppelin/flink/FlinkSqlInterrpeter.java | 118 +++++++++++++++--
 .../zeppelin/flink/FlinkStreamSqlInterpreter.java  |   2 +-
 .../java/org/apache/zeppelin/flink/JobManager.java |   2 +-
 .../zeppelin/flink/sql/AppendStreamSqlJob.java     |   4 +-
 .../zeppelin/flink/sql/SingleRowStreamSqlJob.java  |   5 +-
 .../zeppelin/flink/sql/UpdateStreamSqlJob.java     |   6 +-
 .../zeppelin/flink/FlinkScalaInterpreter.scala     |   2 +-
 .../flink/FlinkBatchSqlInterpreterTest.java        | 141 +++++++++++++++++++++
 .../flink/FlinkStreamSqlInterpreterTest.java       |  44 +++++++
 .../apache/zeppelin/geode/GeodeOqlInterpreter.java |   2 +-
 jdbc/pom.xml                                       |   2 -
 .../org/apache/zeppelin/jdbc/SqlCompleterTest.java |   2 +-
 ksql/pom.xml                                       |   4 +-
 .../org/apache/zeppelin/ksql/KSQLInterpreter.java  |   2 +-
 .../org/apache/zeppelin/ksql/KSQLRestService.java  |   2 +-
 livy/pom.xml                                       |   4 +-
 .../apache/zeppelin/livy/BaseLivyInterpreter.java  |   6 +-
 .../zeppelin/livy/LivySharedInterpreter.java       |   2 +-
 .../zeppelin/livy/LivySparkSQLInterpreter.java     |   6 +-
 markdown/pom.xml                                   |   2 -
 .../zeppelin/mongodb/MongoDbInterpreter.java       |   2 +-
 .../zeppelin/mongodb/MongoDbInterpreterTest.java   |   2 +-
 neo4j/pom.xml                                      |   4 +-
 .../graph/neo4j/Neo4jConnectionManager.java        |   2 +-
 .../graph/neo4j/Neo4jCypherInterpreter.java        |   2 +-
 .../apache/zeppelin/pig/BasePigInterpreter.java    |   2 +-
 .../org/apache/zeppelin/pig/PigInterpreter.java    |   2 +-
 .../apache/zeppelin/pig/PigQueryInterpreter.java   |   4 +-
 .../java/org/apache/zeppelin/pig/PigUtils.java     |   2 +-
 pom.xml                                            |   7 +
 python/pom.xml                                     |   4 +-
 .../apache/zeppelin/python/IPythonInterpreter.java |   2 +-
 .../zeppelin/python/PythonCondaInterpreter.java    |   2 +-
 .../apache/zeppelin/python/PythonInterpreter.java  |   2 +-
 rlang/pom.xml                                      |   4 +-
 .../java/org/apache/zeppelin/r/IRInterpreter.java  |   2 +-
 .../org/apache/zeppelin/r/ShinyInterpreter.java    |   2 +-
 sap/pom.xml                                        |   4 +-
 .../apache/zeppelin/sap/UniverseInterpreter.java   |   2 +-
 .../zeppelin/sap/universe/UniverseClient.java      |   4 +-
 .../zeppelin/sap/universe/UniverseCompleter.java   |   2 +-
 .../sap/universe/UniverseNodeInfoCompleter.java    |   2 +-
 .../zeppelin/sap/universe/UniverseQuery.java       |   2 +-
 .../apache/zeppelin/sap/universe/UniverseUtil.java |   2 +-
 .../sap/universe/UniverseCompleterTest.java        |   2 +-
 scio/pom.xml                                       |   4 +-
 shell/pom.xml                                      |   6 +-
 .../shell/terminal/service/TerminalService.java    |   2 +-
 spark/interpreter/pom.xml                          |   4 +-
 .../apache/zeppelin/spark/PySparkInterpreter.java  |   2 +-
 .../apache/zeppelin/spark/SparkInterpreter.java    |   2 +-
 .../apache/zeppelin/spark/SparkSqlInterpreter.java |   2 +-
 .../zeppelin/submarine/SubmarineInterpreter.java   |   2 +-
 .../zeppelin/submarine/commons/SubmarineUI.java    |   2 +-
 .../zeppelin/submarine/commons/SubmarineUtils.java |   2 +-
 .../zeppelin/submarine/hadoop/HdfsClient.java      |   4 +-
 .../zeppelin/submarine/hadoop/YarnClient.java      |   2 +-
 .../zeppelin/submarine/job/SubmarineJob.java       |   2 +-
 .../submarine/job/thread/JobRunThread.java         |   2 +-
 .../submarine/job/thread/TensorboardRunThread.java |   2 +-
 zeppelin-integration/pom.xml                       |   1 -
 .../integration/InterpreterModeActionsIT.java      |   2 +-
 .../zeppelin/integration/ParagraphActionsIT.java   |   2 +-
 .../zeppelin/integration/PersonalizeActionsIT.java |   2 +-
 zeppelin-interpreter/pom.xml                       |   7 -
 .../apache/zeppelin/cluster/ClusterManager.java    |   2 +-
 .../zeppelin/cluster/ClusterManagerServer.java     |   2 +-
 .../apache/zeppelin/cluster/meta/ClusterMeta.java  |   2 +-
 .../zeppelin/conf/ZeppelinConfiguration.java       |   2 +-
 .../main/java/org/apache/zeppelin/dep/Booter.java  |   2 +-
 .../apache/zeppelin/dep/DependencyResolver.java    |   2 +-
 .../java/org/apache/zeppelin/dep/Repository.java   |   2 +-
 .../java/org/apache/zeppelin/display/Input.java    |   2 +-
 .../apache/zeppelin/interpreter/Interpreter.java   |   4 +-
 .../zeppelin/interpreter/InterpreterOutput.java    |   2 +-
 .../remote/RemoteInterpreterServer.java            |   2 +-
 .../interpreter/remote/RemoteInterpreterUtils.java |   2 +-
 .../zeppelin/interpreter/util/ProcessLauncher.java |   4 +-
 .../java/org/apache/zeppelin/scheduler/Job.java    |   6 +-
 .../apache/zeppelin/user/AuthenticationInfo.java   |   2 +-
 .../main/java/org/apache/zeppelin/util/Util.java   |   2 +-
 zeppelin-jupyter-interpreter/pom.xml               |   4 +-
 .../zeppelin/jupyter/JupyterKernelClient.java      |   2 +-
 .../zeppelin/jupyter/JupyterKernelInterpreter.java |   4 +-
 .../zeppelin/realm/ActiveDirectoryGroupRealm.java  |   2 +-
 .../java/org/apache/zeppelin/realm/LdapRealm.java  |   4 +-
 .../org/apache/zeppelin/rest/AdminRestApi.java     |   2 +-
 .../org/apache/zeppelin/rest/HeliumRestApi.java    |   2 +-
 .../apache/zeppelin/rest/InterpreterRestApi.java   |   2 +-
 .../apache/zeppelin/rest/NotebookRepoRestApi.java  |   2 +-
 .../rest/message/NotebookRepoSettingsRequest.java  |   2 +-
 .../org/apache/zeppelin/server/ZeppelinServer.java |   2 +-
 .../apache/zeppelin/service/NotebookService.java   |   2 +-
 .../apache/zeppelin/socket/ConnectionManager.java  |   2 +-
 .../org/apache/zeppelin/socket/NotebookServer.java |   2 +-
 .../org/apache/zeppelin/socket/NotebookSocket.java |   2 +-
 .../configuration/RequestHeaderSizeTest.java       |   2 +-
 .../zeppelin/rest/NotebookRepoRestApiTest.java     |   2 +-
 .../zeppelin/service/NotebookServiceTest.java      |   2 +-
 zeppelin-zengine/pom.xml                           |   2 -
 .../zeppelin/helium/HeliumBundleFactory.java       |   2 +-
 .../zeppelin/helium/HeliumOnlineRegistry.java      |   2 +-
 .../zeppelin/interpreter/ConfInterpreter.java      |   2 +-
 .../zeppelin/interpreter/InterpreterFactory.java   |   2 +-
 .../zeppelin/interpreter/InterpreterSetting.java   |   2 +-
 .../interpreter/InterpreterSettingManager.java     |   4 +-
 .../interpreter/SessionConfInterpreter.java        |   2 +-
 .../launcher/StandardInterpreterLauncher.java      |   2 +-
 .../recovery/FileSystemRecoveryStorage.java        |   2 +-
 .../remote/RemoteInterpreterManagedProcess.java    |   2 +-
 .../zeppelin/notebook/AuthorizationService.java    |   2 +-
 .../zeppelin/notebook/FileSystemStorage.java       |   2 +-
 .../java/org/apache/zeppelin/notebook/Note.java    |   2 +-
 .../org/apache/zeppelin/notebook/Paragraph.java    |   6 +-
 .../zeppelin/notebook/ParagraphTextParser.java     |   2 +-
 .../notebook/repo/NotebookRepoWithSettings.java    |   2 +-
 .../repo/NotebookRepoWithVersionControl.java       |   2 +-
 .../repo/OldNotebookRepoWithVersionControl.java    |   2 +-
 .../zeppelin/notebook/repo/OldVFSNotebookRepo.java |   2 +-
 .../zeppelin/notebook/repo/VFSNotebookRepo.java    |   2 +-
 .../zeppelinhub/model/UserSessionContainer.java    |   2 +-
 .../repo/zeppelinhub/model/UserTokenContainer.java |   2 +-
 .../repo/zeppelinhub/rest/HttpProxyClient.java     |   2 +-
 .../rest/ZeppelinhubRestApiHandler.java            |   2 +-
 .../zeppelinhub/websocket/ZeppelinhubClient.java   |   2 +-
 .../websocket/listener/WatcherWebsocket.java       |   2 +-
 .../websocket/protocol/ZeppelinhubMessage.java     |   2 +-
 .../websocket/session/ZeppelinhubSession.java      |   2 +-
 .../websocket/utils/ZeppelinhubUtils.java          |   2 +-
 .../interpreter/remote/RemoteInterpreterTest.java  |   2 +-
 .../notebook/repo/GitNotebookRepoTest.java         |   2 +-
 137 files changed, 472 insertions(+), 189 deletions(-)


[zeppelin] 01/03: [ZEPPELIN-4688]. Support set statement in flink sql

Posted by zj...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

zjffdu pushed a commit to branch branch-0.9
in repository https://gitbox.apache.org/repos/asf/zeppelin.git

commit 8214b97ed97b5d85493db576cc01882b367f9708
Author: Jeff Zhang <zj...@apache.org>
AuthorDate: Thu Mar 19 14:28:55 2020 +0800

    [ZEPPELIN-4688]. Support set statement in flink sql
    
    ### What is this PR for?
    This PR is to add support for set statement in flink sql.  The properties in the set statement only affect the current paragraph, we would reset the properties after the paragraph is finished
    
    ### What type of PR is it?
    [ Feature ]
    
    ### Todos
    * [ ] - Task
    
    ### What is the Jira issue?
    * https://issues.apache.org/jira/browse/ZEPPELIN-4688
    
    ### How should this be tested?
    * CI Pass
    
    ### Screenshots (if appropriate)
    
    ### Questions:
    * Does the licenses files need update? No
    * Is there breaking changes for older versions? No
    * Does this needs documentation? No
    
    Author: Jeff Zhang <zj...@apache.org>
    
    Closes #3693 from zjffdu/ZEPPELIN-4688 and squashes the following commits:
    
    790b241db [Jeff Zhang] [ZEPPELIN-4688]. Support set statement in flink sql
    
    (cherry picked from commit dc45a899dce0a7307663ae5ade51325763dc7f00)
---
 flink/pom.xml                                      |  4 +
 .../apache/zeppelin/flink/FlinkSqlInterrpeter.java | 87 ++++++++++++++++++++--
 .../flink/FlinkBatchSqlInterpreterTest.java        | 59 +++++++++++++++
 3 files changed, 144 insertions(+), 6 deletions(-)

diff --git a/flink/pom.xml b/flink/pom.xml
index 9be4fe5..21ec182 100644
--- a/flink/pom.xml
+++ b/flink/pom.xml
@@ -492,6 +492,10 @@
           <groupId>io.netty</groupId>
           <artifactId>netty</artifactId>
         </exclusion>
+        <exclusion>
+          <groupId>javax.jms</groupId>
+          <artifactId>jms</artifactId>
+        </exclusion>
       </exclusions>
     </dependency>
 
diff --git a/flink/src/main/java/org/apache/zeppelin/flink/FlinkSqlInterrpeter.java b/flink/src/main/java/org/apache/zeppelin/flink/FlinkSqlInterrpeter.java
index d794b4b..82ac50e 100644
--- a/flink/src/main/java/org/apache/zeppelin/flink/FlinkSqlInterrpeter.java
+++ b/flink/src/main/java/org/apache/zeppelin/flink/FlinkSqlInterrpeter.java
@@ -22,12 +22,16 @@ import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.flink.api.common.JobExecutionResult;
+import org.apache.flink.configuration.ConfigOption;
 import org.apache.flink.core.execution.JobClient;
 import org.apache.flink.core.execution.JobListener;
+import org.apache.flink.python.PythonConfig;
+import org.apache.flink.python.PythonOptions;
 import org.apache.flink.table.api.Table;
 import org.apache.flink.table.api.TableEnvironment;
 import org.apache.flink.table.api.TableSchema;
 import org.apache.flink.table.api.config.ExecutionConfigOptions;
+import org.apache.flink.table.api.config.OptimizerConfigOptions;
 import org.apache.zeppelin.flink.sql.SqlCommandParser;
 import org.apache.zeppelin.flink.sql.SqlCommandParser.SqlCommand;
 import org.apache.zeppelin.interpreter.Interpreter;
@@ -42,15 +46,14 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.annotation.Nullable;
-import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 import java.util.Properties;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 public abstract class FlinkSqlInterrpeter extends Interpreter {
@@ -69,6 +72,7 @@ public abstract class FlinkSqlInterrpeter extends Interpreter {
           .append(formatCommand(SqlCommand.INSERT_INTO, "Inserts the results of a SQL SELECT query into a declared table sink."))
           .append(formatCommand(SqlCommand.INSERT_OVERWRITE, "Inserts the results of a SQL SELECT query into a declared table sink and overwrite existing data."))
           .append(formatCommand(SqlCommand.SELECT, "Executes a SQL SELECT query on the Flink cluster."))
+          .append(formatCommand(SqlCommand.SET, "Sets a session configuration property. Syntax: 'SET <key>=<value>;'. Use 'SET;' for listing all properties."))
           .append(formatCommand(SqlCommand.SHOW_FUNCTIONS, "Shows all user-defined and built-in functions."))
           .append(formatCommand(SqlCommand.SHOW_TABLES, "Shows all registered tables."))
           .append(formatCommand(SqlCommand.SOURCE, "Reads a SQL SELECT query from a file and executes it on the Flink cluster."))
@@ -86,7 +90,11 @@ public abstract class FlinkSqlInterrpeter extends Interpreter {
   private SqlSplitter sqlSplitter;
   private int defaultSqlParallelism;
   private ReentrantReadWriteLock.WriteLock lock = new ReentrantReadWriteLock().writeLock();
-
+  // all the available sql config options. see
+  // https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/table/config.html
+  private Map<String, ConfigOption> tableConfigOptions;
+  // represent the current paragraph's configOptions
+  private Map<String, String> currentConfigOptions = new HashMap<>();
 
   public FlinkSqlInterrpeter(Properties properties) {
     super(properties);
@@ -117,6 +125,31 @@ public abstract class FlinkSqlInterrpeter extends Interpreter {
     flinkInterpreter.getExecutionEnvironment().getJavaEnv().registerJobListener(jobListener);
     flinkInterpreter.getStreamExecutionEnvironment().getJavaEnv().registerJobListener(jobListener);
     this.defaultSqlParallelism = flinkInterpreter.getDefaultSqlParallelism();
+    this.tableConfigOptions = extractTableConfigOptions();
+  }
+
+  private Map<String, ConfigOption> extractTableConfigOptions() {
+    Map<String, ConfigOption> configOptions = new HashMap<>();
+    configOptions.putAll(extractConfigOptions(ExecutionConfigOptions.class));
+    configOptions.putAll(extractConfigOptions(OptimizerConfigOptions.class));
+    configOptions.putAll(extractConfigOptions(PythonOptions.class));
+    return configOptions;
+  }
+
+  private Map<String, ConfigOption> extractConfigOptions(Class clazz) {
+    Map<String, ConfigOption> configOptions = new HashMap();
+    Field[] fields = clazz.getDeclaredFields();
+    for (Field field : fields) {
+      if (field.getType().isAssignableFrom(ConfigOption.class)) {
+        try {
+          ConfigOption configOption = (ConfigOption) field.get(ConfigOption.class);
+          configOptions.put(configOption.key(), configOption);
+        } catch (Throwable e) {
+          LOGGER.warn("Fail to get ConfigOption", e);
+        }
+      }
+    }
+    return configOptions;
   }
 
   @Override
@@ -139,6 +172,7 @@ public abstract class FlinkSqlInterrpeter extends Interpreter {
   }
 
   private InterpreterResult runSqlList(String st, InterpreterContext context) {
+    currentConfigOptions.clear();
     List<String> sqls = sqlSplitter.splitSql(st);
     for (String sql : sqls) {
       Optional<SqlCommandParser.SqlCommandCall> sqlCommand = SqlCommandParser.parse(sql);
@@ -210,6 +244,9 @@ public abstract class FlinkSqlInterrpeter extends Interpreter {
       case SELECT:
         callSelect(cmdCall.operands[0], context);
         break;
+      case SET:
+        callSet(cmdCall.operands[0], cmdCall.operands[1], context);
+        break;
       case INSERT_INTO:
       case INSERT_OVERWRITE:
         callInsertInto(cmdCall.operands[0], context);
@@ -401,25 +438,47 @@ public abstract class FlinkSqlInterrpeter extends Interpreter {
   public void callSelect(String sql, InterpreterContext context) throws IOException {
     try {
       lock.lock();
+      // set parallelism from paragraph local property
       if (context.getLocalProperties().containsKey("parallelism")) {
         this.tbenv.getConfig().getConfiguration()
                 .set(ExecutionConfigOptions.TABLE_EXEC_RESOURCE_DEFAULT_PARALLELISM,
                         Integer.parseInt(context.getLocalProperties().get("parallelism")));
       }
-      callInnerSelect(sql, context);
 
+      // set table config from set statement until now.
+      for (Map.Entry<String, String> entry : currentConfigOptions.entrySet()) {
+        this.tbenv.getConfig().getConfiguration().setString(entry.getKey(), entry.getValue());
+      }
+      callInnerSelect(sql, context);
     } finally {
       if (lock.isHeldByCurrentThread()) {
         lock.unlock();
       }
+      // reset parallelism
       this.tbenv.getConfig().getConfiguration()
               .set(ExecutionConfigOptions.TABLE_EXEC_RESOURCE_DEFAULT_PARALLELISM,
                       defaultSqlParallelism);
+      // reset table config
+      for (ConfigOption configOption: tableConfigOptions.values()) {
+        // some may has no default value, e.g. ExecutionConfigOptions#TABLE_EXEC_DISABLED_OPERATORS
+        if (configOption.defaultValue() != null) {
+          this.tbenv.getConfig().getConfiguration().set(configOption, configOption.defaultValue());
+        }
+      }
+      this.tbenv.getConfig().getConfiguration().addAll(flinkInterpreter.getFlinkConfiguration());
     }
   }
 
   public abstract void callInnerSelect(String sql, InterpreterContext context) throws IOException;
 
+  public void callSet(String key, String value, InterpreterContext context) throws IOException {
+    if (!tableConfigOptions.containsKey(key)) {
+      throw new IOException(key + " is not a valid table/sql config, please check link: " +
+              "https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/table/config.html");
+    }
+    currentConfigOptions.put(key, value);
+  }
+
   private void callInsertInto(String sql,
                               InterpreterContext context) throws IOException {
      if (!isBatch()) {
@@ -432,6 +491,12 @@ public abstract class FlinkSqlInterrpeter extends Interpreter {
                  .set(ExecutionConfigOptions.TABLE_EXEC_RESOURCE_DEFAULT_PARALLELISM,
                          Integer.parseInt(context.getLocalProperties().get("parallelism")));
        }
+
+       // set table config from set statement until now.
+       for (Map.Entry<String, String> entry : currentConfigOptions.entrySet()) {
+         this.tbenv.getConfig().getConfiguration().setString(entry.getKey(), entry.getValue());
+       }
+
        this.tbenv.sqlUpdate(sql);
        this.tbenv.execute(sql);
      } catch (Exception e) {
@@ -440,9 +505,19 @@ public abstract class FlinkSqlInterrpeter extends Interpreter {
        if (lock.isHeldByCurrentThread()) {
          lock.unlock();
        }
+
+       // reset parallelism
        this.tbenv.getConfig().getConfiguration()
                .set(ExecutionConfigOptions.TABLE_EXEC_RESOURCE_DEFAULT_PARALLELISM,
                        defaultSqlParallelism);
+       // reset table config
+       for (ConfigOption configOption: tableConfigOptions.values()) {
+         // some may has no default value, e.g. ExecutionConfigOptions#TABLE_EXEC_DISABLED_OPERATORS
+         if (configOption.defaultValue() != null) {
+           this.tbenv.getConfig().getConfiguration().set(configOption, configOption.defaultValue());
+         }
+       }
+       this.tbenv.getConfig().getConfiguration().addAll(flinkInterpreter.getFlinkConfiguration());
      }
      context.out.write("Insertion successfully.\n");
   }
diff --git a/flink/src/test/java/org/apache/zeppelin/flink/FlinkBatchSqlInterpreterTest.java b/flink/src/test/java/org/apache/zeppelin/flink/FlinkBatchSqlInterpreterTest.java
index 3fe35c5..c75d7fe 100644
--- a/flink/src/test/java/org/apache/zeppelin/flink/FlinkBatchSqlInterpreterTest.java
+++ b/flink/src/test/java/org/apache/zeppelin/flink/FlinkBatchSqlInterpreterTest.java
@@ -20,6 +20,8 @@ package org.apache.zeppelin.flink;
 
 
 import org.apache.commons.io.FileUtils;
+import org.apache.flink.table.api.config.ExecutionConfigOptions;
+import org.apache.flink.table.api.config.OptimizerConfigOptions;
 import org.apache.zeppelin.interpreter.InterpreterContext;
 import org.apache.zeppelin.interpreter.InterpreterException;
 import org.apache.zeppelin.interpreter.InterpreterResult;
@@ -237,4 +239,61 @@ public class FlinkBatchSqlInterpreterTest extends SqlInterpreterTest {
     //    resultMessages = context.out.toInterpreterResultMessage();
     //    assertEquals("id\tname\n2\ta\n3\tb\n", resultMessages.get(0).getData());
   }
+
+  @Test
+  public void testSetTableConfig() throws InterpreterException, IOException {
+    hiveShell.execute("create table source_table (id int, name string)");
+    hiveShell.execute("insert into source_table values(1, 'a'), (2, 'b')");
+
+    File destDir = Files.createTempDirectory("flink_test").toFile();
+    FileUtils.deleteDirectory(destDir);
+    InterpreterResult result = sqlInterpreter.interpret(
+            "CREATE TABLE sink_table (\n" +
+                    "id int,\n" +
+                    "name string" +
+                    ") WITH (\n" +
+                    "'format.field-delimiter'=',',\n" +
+                    "'connector.type'='filesystem',\n" +
+                    "'format.derive-schema'='true',\n" +
+                    "'connector.path'='" + destDir.getAbsolutePath() + "',\n" +
+                    "'format.type'='csv'\n" +
+                    ");", getInterpreterContext());
+    assertEquals(InterpreterResult.Code.SUCCESS, result.code());
+
+    // set parallelism then insert into
+    InterpreterContext context = getInterpreterContext();
+    result = sqlInterpreter.interpret(
+            "set table.exec.resource.default-parallelism=10;" +
+            "insert into sink_table select * from source_table", context);
+    assertEquals(InterpreterResult.Code.SUCCESS, result.code());
+    List<InterpreterResultMessage> resultMessages = context.out.toInterpreterResultMessage();
+    assertEquals("Insertion successfully.\n", resultMessages.get(0).getData());
+    assertEquals(ExecutionConfigOptions.TABLE_EXEC_RESOURCE_DEFAULT_PARALLELISM.defaultValue(),
+            sqlInterpreter.tbenv.getConfig().getConfiguration().get(ExecutionConfigOptions.TABLE_EXEC_RESOURCE_DEFAULT_PARALLELISM));
+
+    // set then insert into
+    destDir.delete();
+    context = getInterpreterContext();
+    result = sqlInterpreter.interpret(
+            "set table.optimizer.source.predicate-pushdown-enabled=false;" +
+                    "insert into sink_table select * from source_table", context);
+    assertEquals(InterpreterResult.Code.SUCCESS, result.code());
+    resultMessages = context.out.toInterpreterResultMessage();
+    assertEquals("Insertion successfully.\n", resultMessages.get(0).getData());
+    assertEquals(ExecutionConfigOptions.TABLE_EXEC_RESOURCE_DEFAULT_PARALLELISM.defaultValue(),
+            sqlInterpreter.tbenv.getConfig().getConfiguration().get(ExecutionConfigOptions.TABLE_EXEC_RESOURCE_DEFAULT_PARALLELISM));
+    assertEquals(OptimizerConfigOptions.TABLE_OPTIMIZER_SOURCE_PREDICATE_PUSHDOWN_ENABLED.defaultValue(),
+            sqlInterpreter.tbenv.getConfig().getConfiguration().get(OptimizerConfigOptions.TABLE_OPTIMIZER_SOURCE_PREDICATE_PUSHDOWN_ENABLED));
+
+    // invalid config
+    destDir.delete();
+    context = getInterpreterContext();
+    result = sqlInterpreter.interpret(
+            "set table.invalid_config=false;" +
+                    "insert into sink_table select * from source_table", context);
+    assertEquals(InterpreterResult.Code.ERROR, result.code());
+    resultMessages = context.out.toInterpreterResultMessage();
+    assertTrue(resultMessages.get(0).getData(),
+            resultMessages.get(0).getData().contains("table.invalid_config is not a valid table/sql config"));
+  }
 }


[zeppelin] 02/03: [ZEPPELIN-4686] Update commons-lang to commons-lang3

Posted by zj...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

zjffdu pushed a commit to branch branch-0.9
in repository https://gitbox.apache.org/repos/asf/zeppelin.git

commit 464027a6b0c119df1b54d98d754120bdadf00e3e
Author: Philipp Dallig <ph...@gmail.com>
AuthorDate: Mon Mar 16 14:54:00 2020 +0100

    [ZEPPELIN-4686] Update commons-lang to commons-lang3
    
    ### What is this PR for?
    I noticed that the Zeppelin project mixes "commons-lang" and "commons-lang3". I have (hopefully) changed all imports to `commons-lang3`
    I use `commons-lang3` 3.7, because this version was used in several submodules.
    
    ### What type of PR is it?
    Improvement
    
    ### Todos
    * [ ] - Is the replacement of `getFullStackTrace` to `getStackTrace` right?
    * [ ] - commons-lang isn't deleted from main `pom.xml`. Okay?
    
    ### What is the Jira issue?
    * https://issues.apache.org/jira/browse/ZEPPELIN-4686
    
    ### How should this be tested?
    * Unit-Tests withTravis CI https://travis-ci.org/github/Reamer/zeppelin/builds/663565663
    
    ### Questions:
    * Does the licenses files need update? No
    * Is there breaking changes for older versions? No
    * Does this needs documentation? No
    
    Author: Philipp Dallig <ph...@gmail.com>
    
    Closes #3691 from Reamer/commons-lang3 and squashes the following commits:
    
    bf12fc07c [Philipp Dallig] Update to org.apache.commons commons-lang3
    
    (cherry picked from commit f6f2bbcd6478de198758ae91c0c7e582b6528f6f)
---
 cassandra/pom.xml                                          |  2 --
 elasticsearch/pom.xml                                      |  4 ++--
 .../elasticsearch/ElasticsearchInterpreterTest.java        | 14 +++++++-------
 file/pom.xml                                               |  4 ++--
 .../java/org/apache/zeppelin/file/HDFSFileInterpreter.java |  2 +-
 .../apache/zeppelin/flink/FlinkStreamSqlInterpreter.java   |  2 +-
 .../main/java/org/apache/zeppelin/flink/JobManager.java    |  2 +-
 .../org/apache/zeppelin/flink/FlinkScalaInterpreter.scala  |  2 +-
 .../org/apache/zeppelin/geode/GeodeOqlInterpreter.java     |  2 +-
 jdbc/pom.xml                                               |  2 --
 .../java/org/apache/zeppelin/jdbc/SqlCompleterTest.java    |  2 +-
 ksql/pom.xml                                               |  4 ++--
 .../java/org/apache/zeppelin/ksql/KSQLInterpreter.java     |  2 +-
 .../java/org/apache/zeppelin/ksql/KSQLRestService.java     |  2 +-
 livy/pom.xml                                               |  4 ++--
 .../java/org/apache/zeppelin/livy/BaseLivyInterpreter.java |  6 +++---
 .../org/apache/zeppelin/livy/LivySharedInterpreter.java    |  2 +-
 .../org/apache/zeppelin/livy/LivySparkSQLInterpreter.java  |  6 +++---
 markdown/pom.xml                                           |  2 --
 .../org/apache/zeppelin/mongodb/MongoDbInterpreter.java    |  2 +-
 .../apache/zeppelin/mongodb/MongoDbInterpreterTest.java    |  2 +-
 neo4j/pom.xml                                              |  4 ++--
 .../zeppelin/graph/neo4j/Neo4jConnectionManager.java       |  2 +-
 .../zeppelin/graph/neo4j/Neo4jCypherInterpreter.java       |  2 +-
 .../java/org/apache/zeppelin/pig/BasePigInterpreter.java   |  2 +-
 .../main/java/org/apache/zeppelin/pig/PigInterpreter.java  |  2 +-
 .../java/org/apache/zeppelin/pig/PigQueryInterpreter.java  |  4 ++--
 pig/src/main/java/org/apache/zeppelin/pig/PigUtils.java    |  2 +-
 pom.xml                                                    |  7 +++++++
 python/pom.xml                                             |  4 ++--
 .../org/apache/zeppelin/python/IPythonInterpreter.java     |  2 +-
 .../org/apache/zeppelin/python/PythonCondaInterpreter.java |  2 +-
 .../java/org/apache/zeppelin/python/PythonInterpreter.java |  2 +-
 rlang/pom.xml                                              |  4 ++--
 .../src/main/java/org/apache/zeppelin/r/IRInterpreter.java |  2 +-
 .../main/java/org/apache/zeppelin/r/ShinyInterpreter.java  |  2 +-
 sap/pom.xml                                                |  4 ++--
 .../java/org/apache/zeppelin/sap/UniverseInterpreter.java  |  2 +-
 .../org/apache/zeppelin/sap/universe/UniverseClient.java   |  4 ++--
 .../apache/zeppelin/sap/universe/UniverseCompleter.java    |  2 +-
 .../zeppelin/sap/universe/UniverseNodeInfoCompleter.java   |  2 +-
 .../org/apache/zeppelin/sap/universe/UniverseQuery.java    |  2 +-
 .../org/apache/zeppelin/sap/universe/UniverseUtil.java     |  2 +-
 .../zeppelin/sap/universe/UniverseCompleterTest.java       |  2 +-
 scio/pom.xml                                               |  4 ++--
 shell/pom.xml                                              |  6 ++----
 .../zeppelin/shell/terminal/service/TerminalService.java   |  2 +-
 spark/interpreter/pom.xml                                  |  4 ++--
 .../java/org/apache/zeppelin/spark/PySparkInterpreter.java |  2 +-
 .../java/org/apache/zeppelin/spark/SparkInterpreter.java   |  2 +-
 .../org/apache/zeppelin/spark/SparkSqlInterpreter.java     |  2 +-
 .../apache/zeppelin/submarine/SubmarineInterpreter.java    |  2 +-
 .../org/apache/zeppelin/submarine/commons/SubmarineUI.java |  2 +-
 .../apache/zeppelin/submarine/commons/SubmarineUtils.java  |  2 +-
 .../org/apache/zeppelin/submarine/hadoop/HdfsClient.java   |  4 ++--
 .../org/apache/zeppelin/submarine/hadoop/YarnClient.java   |  2 +-
 .../org/apache/zeppelin/submarine/job/SubmarineJob.java    |  2 +-
 .../apache/zeppelin/submarine/job/thread/JobRunThread.java |  2 +-
 .../submarine/job/thread/TensorboardRunThread.java         |  2 +-
 zeppelin-integration/pom.xml                               |  1 -
 .../zeppelin/integration/InterpreterModeActionsIT.java     |  2 +-
 .../apache/zeppelin/integration/ParagraphActionsIT.java    |  2 +-
 .../apache/zeppelin/integration/PersonalizeActionsIT.java  |  2 +-
 zeppelin-interpreter/pom.xml                               |  7 -------
 .../java/org/apache/zeppelin/cluster/ClusterManager.java   |  2 +-
 .../org/apache/zeppelin/cluster/ClusterManagerServer.java  |  2 +-
 .../java/org/apache/zeppelin/cluster/meta/ClusterMeta.java |  2 +-
 .../org/apache/zeppelin/conf/ZeppelinConfiguration.java    |  2 +-
 .../src/main/java/org/apache/zeppelin/dep/Booter.java      |  2 +-
 .../java/org/apache/zeppelin/dep/DependencyResolver.java   |  2 +-
 .../src/main/java/org/apache/zeppelin/dep/Repository.java  |  2 +-
 .../src/main/java/org/apache/zeppelin/display/Input.java   |  2 +-
 .../java/org/apache/zeppelin/interpreter/Interpreter.java  |  4 ++--
 .../org/apache/zeppelin/interpreter/InterpreterOutput.java |  2 +-
 .../interpreter/remote/RemoteInterpreterServer.java        |  2 +-
 .../interpreter/remote/RemoteInterpreterUtils.java         |  2 +-
 .../apache/zeppelin/interpreter/util/ProcessLauncher.java  |  4 ++--
 .../src/main/java/org/apache/zeppelin/scheduler/Job.java   |  6 +++---
 .../java/org/apache/zeppelin/user/AuthenticationInfo.java  |  2 +-
 .../src/main/java/org/apache/zeppelin/util/Util.java       |  2 +-
 zeppelin-jupyter-interpreter/pom.xml                       |  4 ++--
 .../org/apache/zeppelin/jupyter/JupyterKernelClient.java   |  2 +-
 .../apache/zeppelin/jupyter/JupyterKernelInterpreter.java  |  4 ++--
 .../apache/zeppelin/realm/ActiveDirectoryGroupRealm.java   |  2 +-
 .../src/main/java/org/apache/zeppelin/realm/LdapRealm.java |  4 ++--
 .../main/java/org/apache/zeppelin/rest/AdminRestApi.java   |  2 +-
 .../main/java/org/apache/zeppelin/rest/HeliumRestApi.java  |  2 +-
 .../java/org/apache/zeppelin/rest/InterpreterRestApi.java  |  2 +-
 .../java/org/apache/zeppelin/rest/NotebookRepoRestApi.java |  2 +-
 .../zeppelin/rest/message/NotebookRepoSettingsRequest.java |  2 +-
 .../java/org/apache/zeppelin/server/ZeppelinServer.java    |  2 +-
 .../java/org/apache/zeppelin/service/NotebookService.java  |  2 +-
 .../java/org/apache/zeppelin/socket/ConnectionManager.java |  2 +-
 .../java/org/apache/zeppelin/socket/NotebookServer.java    |  2 +-
 .../java/org/apache/zeppelin/socket/NotebookSocket.java    |  2 +-
 .../zeppelin/configuration/RequestHeaderSizeTest.java      |  2 +-
 .../org/apache/zeppelin/rest/NotebookRepoRestApiTest.java  |  2 +-
 .../org/apache/zeppelin/service/NotebookServiceTest.java   |  2 +-
 zeppelin-zengine/pom.xml                                   |  2 --
 .../org/apache/zeppelin/helium/HeliumBundleFactory.java    |  2 +-
 .../org/apache/zeppelin/helium/HeliumOnlineRegistry.java   |  2 +-
 .../org/apache/zeppelin/interpreter/ConfInterpreter.java   |  2 +-
 .../apache/zeppelin/interpreter/InterpreterFactory.java    |  2 +-
 .../apache/zeppelin/interpreter/InterpreterSetting.java    |  2 +-
 .../zeppelin/interpreter/InterpreterSettingManager.java    |  4 ++--
 .../zeppelin/interpreter/SessionConfInterpreter.java       |  2 +-
 .../interpreter/launcher/StandardInterpreterLauncher.java  |  2 +-
 .../interpreter/recovery/FileSystemRecoveryStorage.java    |  2 +-
 .../remote/RemoteInterpreterManagedProcess.java            |  2 +-
 .../org/apache/zeppelin/notebook/AuthorizationService.java |  2 +-
 .../org/apache/zeppelin/notebook/FileSystemStorage.java    |  2 +-
 .../src/main/java/org/apache/zeppelin/notebook/Note.java   |  2 +-
 .../main/java/org/apache/zeppelin/notebook/Paragraph.java  |  6 +++---
 .../org/apache/zeppelin/notebook/ParagraphTextParser.java  |  2 +-
 .../zeppelin/notebook/repo/NotebookRepoWithSettings.java   |  2 +-
 .../notebook/repo/NotebookRepoWithVersionControl.java      |  2 +-
 .../notebook/repo/OldNotebookRepoWithVersionControl.java   |  2 +-
 .../apache/zeppelin/notebook/repo/OldVFSNotebookRepo.java  |  2 +-
 .../org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java |  2 +-
 .../repo/zeppelinhub/model/UserSessionContainer.java       |  2 +-
 .../repo/zeppelinhub/model/UserTokenContainer.java         |  2 +-
 .../notebook/repo/zeppelinhub/rest/HttpProxyClient.java    |  2 +-
 .../repo/zeppelinhub/rest/ZeppelinhubRestApiHandler.java   |  2 +-
 .../repo/zeppelinhub/websocket/ZeppelinhubClient.java      |  2 +-
 .../zeppelinhub/websocket/listener/WatcherWebsocket.java   |  2 +-
 .../zeppelinhub/websocket/protocol/ZeppelinhubMessage.java |  2 +-
 .../zeppelinhub/websocket/session/ZeppelinhubSession.java  |  2 +-
 .../repo/zeppelinhub/websocket/utils/ZeppelinhubUtils.java |  2 +-
 .../zeppelin/interpreter/remote/RemoteInterpreterTest.java |  2 +-
 .../apache/zeppelin/notebook/repo/GitNotebookRepoTest.java |  2 +-
 130 files changed, 164 insertions(+), 175 deletions(-)

diff --git a/cassandra/pom.xml b/cassandra/pom.xml
index 1452ff9..6c47e74 100644
--- a/cassandra/pom.xml
+++ b/cassandra/pom.xml
@@ -36,7 +36,6 @@
         <cassandra.driver.version>3.7.2</cassandra.driver.version>
         <snappy.version>1.1.2.6</snappy.version>
         <lz4.version>1.4.1</lz4.version>
-        <commons-lang.version>3.3.2</commons-lang.version>
         <scalate.version>1.7.1</scalate.version>
         <cassandra.guava.version>19.0</cassandra.guava.version>
 
@@ -117,7 +116,6 @@
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
-            <version>${commons-lang.version}</version>
         </dependency>
 
         <dependency>
diff --git a/elasticsearch/pom.xml b/elasticsearch/pom.xml
index e37d79a..c3ef705 100644
--- a/elasticsearch/pom.xml
+++ b/elasticsearch/pom.xml
@@ -54,8 +54,8 @@
     </dependency>
 
     <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
     </dependency>
 
     <dependency>
diff --git a/elasticsearch/src/test/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreterTest.java b/elasticsearch/src/test/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreterTest.java
index 4a412aa..a806dc3 100644
--- a/elasticsearch/src/test/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreterTest.java
+++ b/elasticsearch/src/test/java/org/apache/zeppelin/elasticsearch/ElasticsearchInterpreterTest.java
@@ -21,7 +21,7 @@ import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
-import org.apache.commons.lang.math.RandomUtils;
+import org.apache.commons.lang3.RandomUtils;
 import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
 import org.elasticsearch.client.Client;
 import org.elasticsearch.common.settings.Settings;
@@ -98,12 +98,12 @@ public class ElasticsearchInterpreterTest {
           .startObject()
             .field("date", new Date())
             .startObject("request")
-              .field("method", METHODS[RandomUtils.nextInt(METHODS.length)])
+              .field("method", METHODS[RandomUtils.nextInt(0, METHODS.length)])
               .field("url", "/zeppelin/" + UUID.randomUUID().toString())
               .field("headers", Arrays.asList("Accept: *.*", "Host: apache.org"))
             .endObject()
-            .field("status", STATUS[RandomUtils.nextInt(STATUS.length)])
-            .field("content_length", RandomUtils.nextInt(2000))
+            .field("status", STATUS[RandomUtils.nextInt(0, STATUS.length)])
+            .field("content_length", RandomUtils.nextInt(0, 2000))
           )
         .get();
     }
@@ -115,12 +115,12 @@ public class ElasticsearchInterpreterTest {
             .startObject()
               .field("date", new Date())
               .startObject("request")
-                .field("method", METHODS[RandomUtils.nextInt(METHODS.length)])
+                .field("method", METHODS[RandomUtils.nextInt(0, METHODS.length)])
                 .field("url", "/zeppelin/" + UUID.randomUUID().toString())
                 .field("headers", Arrays.asList("Accept: *.*", "Host: apache.org"))
               .endObject()
-              .field("status", STATUS[RandomUtils.nextInt(STATUS.length)])
-              .field("content_length", RandomUtils.nextInt(2000))
+              .field("status", STATUS[RandomUtils.nextInt(0, STATUS.length)])
+              .field("content_length", RandomUtils.nextInt(0, 2000))
             )
         .get();
     }
diff --git a/file/pom.xml b/file/pom.xml
index 532b70b..bf4501b 100644
--- a/file/pom.xml
+++ b/file/pom.xml
@@ -51,8 +51,8 @@
     </dependency>
 
     <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
     </dependency>
 
     <dependency>
diff --git a/file/src/main/java/org/apache/zeppelin/file/HDFSFileInterpreter.java b/file/src/main/java/org/apache/zeppelin/file/HDFSFileInterpreter.java
index b27dcb6..2a13b3c 100644
--- a/file/src/main/java/org/apache/zeppelin/file/HDFSFileInterpreter.java
+++ b/file/src/main/java/org/apache/zeppelin/file/HDFSFileInterpreter.java
@@ -21,7 +21,7 @@ package org.apache.zeppelin.file;
 import com.google.gson.Gson;
 
 import com.google.gson.annotations.SerializedName;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
diff --git a/flink/src/main/java/org/apache/zeppelin/flink/FlinkStreamSqlInterpreter.java b/flink/src/main/java/org/apache/zeppelin/flink/FlinkStreamSqlInterpreter.java
index 6f7b326..9c3d266 100644
--- a/flink/src/main/java/org/apache/zeppelin/flink/FlinkStreamSqlInterpreter.java
+++ b/flink/src/main/java/org/apache/zeppelin/flink/FlinkStreamSqlInterpreter.java
@@ -18,7 +18,7 @@
 
 package org.apache.zeppelin.flink;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.flink.table.api.config.ExecutionConfigOptions;
 import org.apache.zeppelin.flink.sql.UpdateStreamSqlJob;
 import org.apache.zeppelin.flink.sql.SingleRowStreamSqlJob;
diff --git a/flink/src/main/java/org/apache/zeppelin/flink/JobManager.java b/flink/src/main/java/org/apache/zeppelin/flink/JobManager.java
index e148cf5..0aab84f 100644
--- a/flink/src/main/java/org/apache/zeppelin/flink/JobManager.java
+++ b/flink/src/main/java/org/apache/zeppelin/flink/JobManager.java
@@ -19,7 +19,7 @@ package org.apache.zeppelin.flink;
 
 import com.mashape.unirest.http.JsonNode;
 import com.mashape.unirest.http.Unirest;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.flink.api.common.JobID;
 import org.apache.flink.core.execution.JobClient;
 import org.apache.zeppelin.interpreter.InterpreterContext;
diff --git a/flink/src/main/scala/org/apache/zeppelin/flink/FlinkScalaInterpreter.scala b/flink/src/main/scala/org/apache/zeppelin/flink/FlinkScalaInterpreter.scala
index 02ffaf2..4e6f3d0 100644
--- a/flink/src/main/scala/org/apache/zeppelin/flink/FlinkScalaInterpreter.scala
+++ b/flink/src/main/scala/org/apache/zeppelin/flink/FlinkScalaInterpreter.scala
@@ -25,7 +25,7 @@ import java.util.{Map, Properties}
 import java.util.concurrent.TimeUnit
 import java.util.jar.JarFile
 
-import org.apache.commons.lang.StringUtils
+import org.apache.commons.lang3.StringUtils
 import org.apache.flink.api.common.JobExecutionResult
 import org.apache.flink.api.scala.FlinkShell.{ExecutionMode, _}
 import org.apache.flink.api.scala.{ExecutionEnvironment, FlinkILoop}
diff --git a/geode/src/main/java/org/apache/zeppelin/geode/GeodeOqlInterpreter.java b/geode/src/main/java/org/apache/zeppelin/geode/GeodeOqlInterpreter.java
index 638a9f3..3e91238 100644
--- a/geode/src/main/java/org/apache/zeppelin/geode/GeodeOqlInterpreter.java
+++ b/geode/src/main/java/org/apache/zeppelin/geode/GeodeOqlInterpreter.java
@@ -14,7 +14,7 @@
  */
 package org.apache.zeppelin.geode;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.geode.cache.client.ClientCache;
 import org.apache.geode.cache.client.ClientCacheFactory;
 import org.apache.geode.cache.query.QueryService;
diff --git a/jdbc/pom.xml b/jdbc/pom.xml
index 0523199..216796c 100644
--- a/jdbc/pom.xml
+++ b/jdbc/pom.xml
@@ -235,7 +235,6 @@
     <hadoop.common.version>2.7.2</hadoop.common.version>
     <h2.version>1.4.190</h2.version>
     <commons.dbcp2.version>2.0.1</commons.dbcp2.version>
-    <commons-lang3.version>3.7</commons-lang3.version>
 
     <!--test library versions-->
     <mockrunner.jdbc.version>1.0.8</mockrunner.jdbc.version>
@@ -259,7 +258,6 @@
     <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
-      <version>${commons-lang3.version}</version>
     </dependency>
 
     <dependency>
diff --git a/jdbc/src/test/java/org/apache/zeppelin/jdbc/SqlCompleterTest.java b/jdbc/src/test/java/org/apache/zeppelin/jdbc/SqlCompleterTest.java
index 1ec3ae4..682c7c3 100644
--- a/jdbc/src/test/java/org/apache/zeppelin/jdbc/SqlCompleterTest.java
+++ b/jdbc/src/test/java/org/apache/zeppelin/jdbc/SqlCompleterTest.java
@@ -21,7 +21,7 @@ import static org.junit.Assert.assertTrue;
 
 import com.google.common.base.Joiner;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
diff --git a/ksql/pom.xml b/ksql/pom.xml
index b3b25b1..1779f28 100644
--- a/ksql/pom.xml
+++ b/ksql/pom.xml
@@ -52,8 +52,8 @@
     </dependency>
 
     <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
     </dependency>
 
 
diff --git a/ksql/src/main/java/org/apache/zeppelin/ksql/KSQLInterpreter.java b/ksql/src/main/java/org/apache/zeppelin/ksql/KSQLInterpreter.java
index 461b97a..f6079f1 100644
--- a/ksql/src/main/java/org/apache/zeppelin/ksql/KSQLInterpreter.java
+++ b/ksql/src/main/java/org/apache/zeppelin/ksql/KSQLInterpreter.java
@@ -17,7 +17,7 @@ package org.apache.zeppelin.ksql;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.interpreter.Interpreter;
 import org.apache.zeppelin.interpreter.InterpreterContext;
 import org.apache.zeppelin.interpreter.InterpreterException;
diff --git a/ksql/src/main/java/org/apache/zeppelin/ksql/KSQLRestService.java b/ksql/src/main/java/org/apache/zeppelin/ksql/KSQLRestService.java
index 3393330..4fcb2de 100644
--- a/ksql/src/main/java/org/apache/zeppelin/ksql/KSQLRestService.java
+++ b/ksql/src/main/java/org/apache/zeppelin/ksql/KSQLRestService.java
@@ -18,7 +18,7 @@
 package org.apache.zeppelin.ksql;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 import java.io.IOException;
 import java.util.Arrays;
diff --git a/livy/pom.xml b/livy/pom.xml
index 6049da8..303dc5a 100644
--- a/livy/pom.xml
+++ b/livy/pom.xml
@@ -154,8 +154,8 @@
         </dependency>
 
         <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
         </dependency>
 
         <dependency>
diff --git a/livy/src/main/java/org/apache/zeppelin/livy/BaseLivyInterpreter.java b/livy/src/main/java/org/apache/zeppelin/livy/BaseLivyInterpreter.java
index afaf55c..fdbe545 100644
--- a/livy/src/main/java/org/apache/zeppelin/livy/BaseLivyInterpreter.java
+++ b/livy/src/main/java/org/apache/zeppelin/livy/BaseLivyInterpreter.java
@@ -21,8 +21,8 @@ import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import com.google.gson.annotations.SerializedName;
 
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.http.auth.AuthSchemeProvider;
 import org.apache.http.auth.AuthScope;
 import org.apache.http.auth.Credentials;
@@ -730,7 +730,7 @@ public abstract class BaseLivyInterpreter extends Interpreter {
           throw new SessionNotFoundException(cause.getResponseBodyAsString());
         }
         throw new LivyException(cause.getResponseBodyAsString() + "\n"
-            + ExceptionUtils.getFullStackTrace(ExceptionUtils.getRootCause(e)));
+            + ExceptionUtils.getStackTrace(ExceptionUtils.getRootCause(e)));
       }
       if (e instanceof HttpServerErrorException) {
         HttpServerErrorException errorException = (HttpServerErrorException) e;
diff --git a/livy/src/main/java/org/apache/zeppelin/livy/LivySharedInterpreter.java b/livy/src/main/java/org/apache/zeppelin/livy/LivySharedInterpreter.java
index c912dc9..8e68cca 100644
--- a/livy/src/main/java/org/apache/zeppelin/livy/LivySharedInterpreter.java
+++ b/livy/src/main/java/org/apache/zeppelin/livy/LivySharedInterpreter.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.livy;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/livy/src/main/java/org/apache/zeppelin/livy/LivySparkSQLInterpreter.java b/livy/src/main/java/org/apache/zeppelin/livy/LivySparkSQLInterpreter.java
index b2e18f3..a3b0da2 100644
--- a/livy/src/main/java/org/apache/zeppelin/livy/LivySparkSQLInterpreter.java
+++ b/livy/src/main/java/org/apache/zeppelin/livy/LivySparkSQLInterpreter.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.livy;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.interpreter.InterpreterContext;
 import org.apache.zeppelin.interpreter.InterpreterException;
 import org.apache.zeppelin.interpreter.InterpreterOutput;
@@ -32,7 +32,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Properties;
 
-import static org.apache.commons.lang.StringEscapeUtils.escapeJavaScript;
+import static org.apache.commons.lang3.StringEscapeUtils.escapeEcmaScript;
 
 /**
  * Livy SparkSQL Interpreter for Zeppelin.
@@ -191,7 +191,7 @@ public class LivySparkSQLInterpreter extends BaseLivyInterpreter {
         List<String> cells = new ArrayList<>();
         for (Pair pair : pairs) {
           // strip the blank space around the cell and escape the string
-          cells.add(escapeJavaScript(line.substring(pair.start, pair.end)).trim());
+          cells.add(escapeEcmaScript(line.substring(pair.start, pair.end)).trim());
         }
         rows.add(StringUtils.join(cells, "\t"));
       }
diff --git a/markdown/pom.xml b/markdown/pom.xml
index 2461d49..ca8a0a8 100644
--- a/markdown/pom.xml
+++ b/markdown/pom.xml
@@ -35,7 +35,6 @@
 
   <properties>
     <interpreter.name>md</interpreter.name>
-    <commons.lang3.version>3.7</commons.lang3.version>
     <markdown4j.version>2.2-cj-1.0</markdown4j.version>
     <pegdown.version>1.6.0</pegdown.version>
     <flexmark.all.version>0.50.40</flexmark.all.version>
@@ -64,7 +63,6 @@
     <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
-      <version>${commons.lang3.version}</version>
     </dependency>
 
     <dependency>
diff --git a/mongodb/src/main/java/org/apache/zeppelin/mongodb/MongoDbInterpreter.java b/mongodb/src/main/java/org/apache/zeppelin/mongodb/MongoDbInterpreter.java
index 97ff2da..b812b68 100644
--- a/mongodb/src/main/java/org/apache/zeppelin/mongodb/MongoDbInterpreter.java
+++ b/mongodb/src/main/java/org/apache/zeppelin/mongodb/MongoDbInterpreter.java
@@ -32,7 +32,7 @@ import org.apache.commons.exec.ExecuteWatchdog;
 import org.apache.commons.exec.Executor;
 import org.apache.commons.exec.PumpStreamHandler;
 import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.interpreter.Interpreter;
 import org.apache.zeppelin.interpreter.InterpreterContext;
 import org.apache.zeppelin.interpreter.InterpreterResult;
diff --git a/mongodb/src/test/java/org/apache/zeppelin/mongodb/MongoDbInterpreterTest.java b/mongodb/src/test/java/org/apache/zeppelin/mongodb/MongoDbInterpreterTest.java
index 7a39f7a..c2f701b 100644
--- a/mongodb/src/test/java/org/apache/zeppelin/mongodb/MongoDbInterpreterTest.java
+++ b/mongodb/src/test/java/org/apache/zeppelin/mongodb/MongoDbInterpreterTest.java
@@ -24,7 +24,7 @@ import java.util.Properties;
 import java.util.Scanner;
 
 import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.interpreter.InterpreterContext;
 import org.apache.zeppelin.interpreter.InterpreterOutput;
 import org.apache.zeppelin.interpreter.InterpreterOutputListener;
diff --git a/neo4j/pom.xml b/neo4j/pom.xml
index f1b0549..524f768 100644
--- a/neo4j/pom.xml
+++ b/neo4j/pom.xml
@@ -55,8 +55,8 @@
     </dependency>
 
     <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
     </dependency>
 
     <dependency>
diff --git a/neo4j/src/main/java/org/apache/zeppelin/graph/neo4j/Neo4jConnectionManager.java b/neo4j/src/main/java/org/apache/zeppelin/graph/neo4j/Neo4jConnectionManager.java
index 208d142..472d31b 100644
--- a/neo4j/src/main/java/org/apache/zeppelin/graph/neo4j/Neo4jConnectionManager.java
+++ b/neo4j/src/main/java/org/apache/zeppelin/graph/neo4j/Neo4jConnectionManager.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.graph.neo4j;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.neo4j.driver.v1.AuthToken;
 import org.neo4j.driver.v1.AuthTokens;
 import org.neo4j.driver.v1.Config;
diff --git a/neo4j/src/main/java/org/apache/zeppelin/graph/neo4j/Neo4jCypherInterpreter.java b/neo4j/src/main/java/org/apache/zeppelin/graph/neo4j/Neo4jCypherInterpreter.java
index d7f8485..9127122 100644
--- a/neo4j/src/main/java/org/apache/zeppelin/graph/neo4j/Neo4jCypherInterpreter.java
+++ b/neo4j/src/main/java/org/apache/zeppelin/graph/neo4j/Neo4jCypherInterpreter.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.graph.neo4j;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.neo4j.driver.internal.types.InternalTypeSystem;
 import org.neo4j.driver.internal.util.Iterables;
 import org.neo4j.driver.v1.Record;
diff --git a/pig/src/main/java/org/apache/zeppelin/pig/BasePigInterpreter.java b/pig/src/main/java/org/apache/zeppelin/pig/BasePigInterpreter.java
index 9503aa7..bad673c 100644
--- a/pig/src/main/java/org/apache/zeppelin/pig/BasePigInterpreter.java
+++ b/pig/src/main/java/org/apache/zeppelin/pig/BasePigInterpreter.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.pig;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.pig.PigServer;
 import org.apache.pig.backend.BackendException;
diff --git a/pig/src/main/java/org/apache/zeppelin/pig/PigInterpreter.java b/pig/src/main/java/org/apache/zeppelin/pig/PigInterpreter.java
index 4fc0676..31c39e9 100644
--- a/pig/src/main/java/org/apache/zeppelin/pig/PigInterpreter.java
+++ b/pig/src/main/java/org/apache/zeppelin/pig/PigInterpreter.java
@@ -18,7 +18,7 @@
 package org.apache.zeppelin.pig;
 
 import org.apache.commons.io.output.ByteArrayOutputStream;
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.pig.PigServer;
 import org.apache.pig.impl.logicalLayer.FrontendException;
 import org.apache.pig.tools.pigscript.parser.ParseException;
diff --git a/pig/src/main/java/org/apache/zeppelin/pig/PigQueryInterpreter.java b/pig/src/main/java/org/apache/zeppelin/pig/PigQueryInterpreter.java
index 97c2f6e..84401ff 100644
--- a/pig/src/main/java/org/apache/zeppelin/pig/PigQueryInterpreter.java
+++ b/pig/src/main/java/org/apache/zeppelin/pig/PigQueryInterpreter.java
@@ -17,8 +17,8 @@
 
 package org.apache.zeppelin.pig;
 
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.pig.PigServer;
 import org.apache.pig.data.Tuple;
 import org.apache.pig.impl.logicalLayer.FrontendException;
diff --git a/pig/src/main/java/org/apache/zeppelin/pig/PigUtils.java b/pig/src/main/java/org/apache/zeppelin/pig/PigUtils.java
index 1c48250..c7690f3 100644
--- a/pig/src/main/java/org/apache/zeppelin/pig/PigUtils.java
+++ b/pig/src/main/java/org/apache/zeppelin/pig/PigUtils.java
@@ -18,7 +18,7 @@
 package org.apache.zeppelin.pig;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/pom.xml b/pom.xml
index 6090865..da60968 100644
--- a/pom.xml
+++ b/pom.xml
@@ -125,6 +125,7 @@
     <httpcomponents.client.version>4.5.1</httpcomponents.client.version>
     <httpcomponents.asyncclient.version>4.0.2</httpcomponents.asyncclient.version>
     <commons.lang.version>2.5</commons.lang.version>
+    <commons.lang3.version>3.7</commons.lang3.version>
     <commons.configuration.version>1.9</commons.configuration.version>
     <commons.exec.version>1.3</commons.exec.version>
     <commons.codec.version>1.5</commons.codec.version>
@@ -229,6 +230,12 @@
 
       <dependency>
         <groupId>org.apache.commons</groupId>
+        <artifactId>commons-lang3</artifactId>
+        <version>${commons.lang3.version}</version>
+      </dependency>
+
+      <dependency>
+        <groupId>org.apache.commons</groupId>
         <artifactId>commons-exec</artifactId>
         <version>${commons.exec.version}</version>
       </dependency>
diff --git a/python/pom.xml b/python/pom.xml
index 89d76ac..fb450f2 100644
--- a/python/pom.xml
+++ b/python/pom.xml
@@ -60,8 +60,8 @@
     </dependency>
 
     <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
     </dependency>
     <dependency>
       <groupId>commons-io</groupId>
diff --git a/python/src/main/java/org/apache/zeppelin/python/IPythonInterpreter.java b/python/src/main/java/org/apache/zeppelin/python/IPythonInterpreter.java
index fa432a0..c5527fe 100644
--- a/python/src/main/java/org/apache/zeppelin/python/IPythonInterpreter.java
+++ b/python/src/main/java/org/apache/zeppelin/python/IPythonInterpreter.java
@@ -19,7 +19,7 @@ package org.apache.zeppelin.python;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.interpreter.ZeppelinContext;
 import org.apache.zeppelin.interpreter.InterpreterException;
 import org.apache.zeppelin.interpreter.jupyter.proto.ExecuteRequest;
diff --git a/python/src/main/java/org/apache/zeppelin/python/PythonCondaInterpreter.java b/python/src/main/java/org/apache/zeppelin/python/PythonCondaInterpreter.java
index 5eb34e4..a55c36f 100644
--- a/python/src/main/java/org/apache/zeppelin/python/PythonCondaInterpreter.java
+++ b/python/src/main/java/org/apache/zeppelin/python/PythonCondaInterpreter.java
@@ -16,7 +16,7 @@
  */
 package org.apache.zeppelin.python;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.interpreter.Interpreter;
 import org.apache.zeppelin.interpreter.InterpreterContext;
 import org.apache.zeppelin.interpreter.InterpreterException;
diff --git a/python/src/main/java/org/apache/zeppelin/python/PythonInterpreter.java b/python/src/main/java/org/apache/zeppelin/python/PythonInterpreter.java
index 65a23b9..0b55018 100644
--- a/python/src/main/java/org/apache/zeppelin/python/PythonInterpreter.java
+++ b/python/src/main/java/org/apache/zeppelin/python/PythonInterpreter.java
@@ -24,7 +24,7 @@ import org.apache.commons.exec.CommandLine;
 import org.apache.commons.exec.ExecuteException;
 import org.apache.commons.exec.environment.EnvironmentUtils;
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.interpreter.ZeppelinContext;
 import org.apache.zeppelin.interpreter.Interpreter;
 import org.apache.zeppelin.interpreter.InterpreterContext;
diff --git a/rlang/pom.xml b/rlang/pom.xml
index 66abdf1..1bc0647 100644
--- a/rlang/pom.xml
+++ b/rlang/pom.xml
@@ -88,8 +88,8 @@
         </dependency>
         
         <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
         </dependency>
 
         <dependency>
diff --git a/rlang/src/main/java/org/apache/zeppelin/r/IRInterpreter.java b/rlang/src/main/java/org/apache/zeppelin/r/IRInterpreter.java
index c051ec4..24305d6 100644
--- a/rlang/src/main/java/org/apache/zeppelin/r/IRInterpreter.java
+++ b/rlang/src/main/java/org/apache/zeppelin/r/IRInterpreter.java
@@ -18,7 +18,7 @@
 package org.apache.zeppelin.r;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.zeppelin.interpreter.ZeppelinContext;
 import org.apache.zeppelin.interpreter.InterpreterContext;
 import org.apache.zeppelin.interpreter.InterpreterException;
diff --git a/rlang/src/main/java/org/apache/zeppelin/r/ShinyInterpreter.java b/rlang/src/main/java/org/apache/zeppelin/r/ShinyInterpreter.java
index 0df778a..032c522 100644
--- a/rlang/src/main/java/org/apache/zeppelin/r/ShinyInterpreter.java
+++ b/rlang/src/main/java/org/apache/zeppelin/r/ShinyInterpreter.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.r;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.interpreter.AbstractInterpreter;
 import org.apache.zeppelin.interpreter.ZeppelinContext;
 import org.apache.zeppelin.interpreter.InterpreterContext;
diff --git a/sap/pom.xml b/sap/pom.xml
index 7bc8d72..238f253 100644
--- a/sap/pom.xml
+++ b/sap/pom.xml
@@ -41,8 +41,8 @@
     <dependencies>
 
         <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
         </dependency>
 
         <dependency>
diff --git a/sap/src/main/java/org/apache/zeppelin/sap/UniverseInterpreter.java b/sap/src/main/java/org/apache/zeppelin/sap/UniverseInterpreter.java
index b90bdd3..fc6a423 100644
--- a/sap/src/main/java/org/apache/zeppelin/sap/UniverseInterpreter.java
+++ b/sap/src/main/java/org/apache/zeppelin/sap/UniverseInterpreter.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.sap;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.interpreter.AbstractInterpreter;
 import org.apache.zeppelin.interpreter.ZeppelinContext;
 import org.apache.zeppelin.interpreter.InterpreterContext;
diff --git a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseClient.java b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseClient.java
index c397f45..1385719 100644
--- a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseClient.java
+++ b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseClient.java
@@ -18,8 +18,8 @@
 package org.apache.zeppelin.sap.universe;
 
 import com.sun.org.apache.xpath.internal.NodeSet;
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.http.Header;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.config.RequestConfig;
diff --git a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseCompleter.java b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseCompleter.java
index e67011b..5f9bef0 100644
--- a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseCompleter.java
+++ b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseCompleter.java
@@ -19,7 +19,7 @@ package org.apache.zeppelin.sap.universe;
 
 import jline.console.completer.ArgumentCompleter.ArgumentList;
 import jline.console.completer.ArgumentCompleter.WhitespaceArgumentDelimiter;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.completer.CachedCompleter;
 import org.apache.zeppelin.completer.CompletionType;
 import org.apache.zeppelin.completer.StringsCompleter;
diff --git a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseNodeInfoCompleter.java b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseNodeInfoCompleter.java
index af46b46..5382d56 100644
--- a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseNodeInfoCompleter.java
+++ b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseNodeInfoCompleter.java
@@ -18,7 +18,7 @@ package org.apache.zeppelin.sap.universe;
 
 import jline.console.completer.Completer;
 import jline.internal.Preconditions;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 import java.util.*;
 
diff --git a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseQuery.java b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseQuery.java
index 43894b2..1edda33 100644
--- a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseQuery.java
+++ b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseQuery.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.sap.universe;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 import java.util.OptionalInt;
 
diff --git a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseUtil.java b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseUtil.java
index 6f24639..2676a3a 100644
--- a/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseUtil.java
+++ b/sap/src/main/java/org/apache/zeppelin/sap/universe/UniverseUtil.java
@@ -18,7 +18,7 @@
 package org.apache.zeppelin.sap.universe;
 
 import jline.console.completer.ArgumentCompleter.WhitespaceArgumentDelimiter;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 import java.util.*;
 
diff --git a/sap/src/test/java/org/apache/zeppelin/sap/universe/UniverseCompleterTest.java b/sap/src/test/java/org/apache/zeppelin/sap/universe/UniverseCompleterTest.java
index 91a4217..6529cc6 100644
--- a/sap/src/test/java/org/apache/zeppelin/sap/universe/UniverseCompleterTest.java
+++ b/sap/src/test/java/org/apache/zeppelin/sap/universe/UniverseCompleterTest.java
@@ -14,7 +14,7 @@
  */
 package org.apache.zeppelin.sap.universe;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.completer.CachedCompleter;
 import org.junit.Before;
 import org.junit.Test;
diff --git a/scio/pom.xml b/scio/pom.xml
index 9687326..a94dc6b 100644
--- a/scio/pom.xml
+++ b/scio/pom.xml
@@ -104,8 +104,8 @@
     </dependency>
 
     <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
       <scope>test</scope>
     </dependency>
 
diff --git a/shell/pom.xml b/shell/pom.xml
index 19c9cf3..2062320 100644
--- a/shell/pom.xml
+++ b/shell/pom.xml
@@ -42,7 +42,6 @@
     <jinjava.version>2.4.0</jinjava.version>
     <guava.version>20.0</guava.version>
     <gson.version>2.2</gson.version>
-    <commons-lang.version>2.5</commons-lang.version>
   </properties>
 
   <!-- pty4j library not in maven central repository (http://repo.maven.apache.org/maven2) -->
@@ -61,9 +60,8 @@
       <version>${gson.version}</version>
     </dependency>
     <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
-      <version>${commons-lang.version}</version>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
     </dependency>
     <dependency>
       <groupId>org.apache.commons</groupId>
diff --git a/shell/src/main/java/org/apache/zeppelin/shell/terminal/service/TerminalService.java b/shell/src/main/java/org/apache/zeppelin/shell/terminal/service/TerminalService.java
index c90977f..bdc5762 100644
--- a/shell/src/main/java/org/apache/zeppelin/shell/terminal/service/TerminalService.java
+++ b/shell/src/main/java/org/apache/zeppelin/shell/terminal/service/TerminalService.java
@@ -20,7 +20,7 @@ package org.apache.zeppelin.shell.terminal.service;
 import com.google.gson.Gson;
 import com.pty4j.PtyProcess;
 import com.pty4j.WinSize;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.shell.terminal.helper.IOHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/spark/interpreter/pom.xml b/spark/interpreter/pom.xml
index a3fa21a..001ec1e 100644
--- a/spark/interpreter/pom.xml
+++ b/spark/interpreter/pom.xml
@@ -258,8 +258,8 @@
     </dependency>
 
     <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
       <scope>provided</scope>
     </dependency>
 
diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java
index 5dbe410..94073e0 100644
--- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java
+++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.spark;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.spark.SparkConf;
 import org.apache.spark.api.java.JavaSparkContext;
 import org.apache.spark.sql.SQLContext;
diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java
index ebd30f1..0d69acc 100644
--- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java
+++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.spark;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.spark.SparkConf;
 import org.apache.spark.SparkContext;
 import org.apache.spark.api.java.JavaSparkContext;
diff --git a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkSqlInterpreter.java b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkSqlInterpreter.java
index 9274612..96250b5 100644
--- a/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkSqlInterpreter.java
+++ b/spark/interpreter/src/main/java/org/apache/zeppelin/spark/SparkSqlInterpreter.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.spark;
 
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.spark.SparkContext;
 import org.apache.spark.sql.SQLContext;
 import org.apache.zeppelin.interpreter.AbstractInterpreter;
diff --git a/submarine/src/main/java/org/apache/zeppelin/submarine/SubmarineInterpreter.java b/submarine/src/main/java/org/apache/zeppelin/submarine/SubmarineInterpreter.java
index 4dab841..3708e71 100644
--- a/submarine/src/main/java/org/apache/zeppelin/submarine/SubmarineInterpreter.java
+++ b/submarine/src/main/java/org/apache/zeppelin/submarine/SubmarineInterpreter.java
@@ -15,7 +15,7 @@
 package org.apache.zeppelin.submarine;
 
 import com.google.common.annotations.VisibleForTesting;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.display.ui.OptionInput.ParamOption;
 import org.apache.zeppelin.interpreter.Interpreter;
 import org.apache.zeppelin.interpreter.InterpreterContext;
diff --git a/submarine/src/main/java/org/apache/zeppelin/submarine/commons/SubmarineUI.java b/submarine/src/main/java/org/apache/zeppelin/submarine/commons/SubmarineUI.java
index 8a4f708..9c6b540 100644
--- a/submarine/src/main/java/org/apache/zeppelin/submarine/commons/SubmarineUI.java
+++ b/submarine/src/main/java/org/apache/zeppelin/submarine/commons/SubmarineUI.java
@@ -19,7 +19,7 @@ import com.google.common.io.Resources;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
 import com.hubspot.jinjava.Jinjava;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.interpreter.InterpreterContext;
 import org.apache.zeppelin.interpreter.InterpreterResult;
 import org.apache.zeppelin.interpreter.InterpreterResultMessageOutput;
diff --git a/submarine/src/main/java/org/apache/zeppelin/submarine/commons/SubmarineUtils.java b/submarine/src/main/java/org/apache/zeppelin/submarine/commons/SubmarineUtils.java
index 268d083..2c6aa7c 100644
--- a/submarine/src/main/java/org/apache/zeppelin/submarine/commons/SubmarineUtils.java
+++ b/submarine/src/main/java/org/apache/zeppelin/submarine/commons/SubmarineUtils.java
@@ -14,7 +14,7 @@
 
 package org.apache.zeppelin.submarine.commons;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.hadoop.fs.Path;
 import org.apache.zeppelin.display.AngularObject;
 import org.apache.zeppelin.interpreter.InterpreterContext;
diff --git a/submarine/src/main/java/org/apache/zeppelin/submarine/hadoop/HdfsClient.java b/submarine/src/main/java/org/apache/zeppelin/submarine/hadoop/HdfsClient.java
index 959c24c..3fc2b33 100644
--- a/submarine/src/main/java/org/apache/zeppelin/submarine/hadoop/HdfsClient.java
+++ b/submarine/src/main/java/org/apache/zeppelin/submarine/hadoop/HdfsClient.java
@@ -14,7 +14,7 @@
 
 package org.apache.zeppelin.submarine.hadoop;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
@@ -302,7 +302,7 @@ public class HdfsClient {
     for (int i = 0; i < paragraphInfos.size(); i++) {
       ParagraphInfo paragraph = paragraphInfos.get(i);
       String paragraphTitle = paragraph.getParagraphTitle();
-      if (org.apache.commons.lang.StringUtils.isEmpty(paragraphTitle)) {
+      if (org.apache.commons.lang3.StringUtils.isEmpty(paragraphTitle)) {
         String message = "WARN: The title of the [" + i
             + "] paragraph is empty and was not submitted to HDFS.\n";
         LOGGER.warn(message);
diff --git a/submarine/src/main/java/org/apache/zeppelin/submarine/hadoop/YarnClient.java b/submarine/src/main/java/org/apache/zeppelin/submarine/hadoop/YarnClient.java
index 8e4b735..9e9dab8 100644
--- a/submarine/src/main/java/org/apache/zeppelin/submarine/hadoop/YarnClient.java
+++ b/submarine/src/main/java/org/apache/zeppelin/submarine/hadoop/YarnClient.java
@@ -39,7 +39,7 @@ import com.google.gson.JsonParser;
 import com.google.gson.JsonPrimitive;
 import com.google.gson.JsonSyntaxException;
 import com.google.gson.reflect.TypeToken;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.security.UserGroupInformation;
 
diff --git a/submarine/src/main/java/org/apache/zeppelin/submarine/job/SubmarineJob.java b/submarine/src/main/java/org/apache/zeppelin/submarine/job/SubmarineJob.java
index 240ad82..aec20a6 100644
--- a/submarine/src/main/java/org/apache/zeppelin/submarine/job/SubmarineJob.java
+++ b/submarine/src/main/java/org/apache/zeppelin/submarine/job/SubmarineJob.java
@@ -15,7 +15,7 @@
 package org.apache.zeppelin.submarine.job;
 
 import com.google.common.annotations.VisibleForTesting;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.hadoop.fs.Path;
 import org.apache.zeppelin.interpreter.InterpreterContext;
 import org.apache.zeppelin.submarine.hadoop.HdfsClient;
diff --git a/submarine/src/main/java/org/apache/zeppelin/submarine/job/thread/JobRunThread.java b/submarine/src/main/java/org/apache/zeppelin/submarine/job/thread/JobRunThread.java
index d72d4c2..f704854 100644
--- a/submarine/src/main/java/org/apache/zeppelin/submarine/job/thread/JobRunThread.java
+++ b/submarine/src/main/java/org/apache/zeppelin/submarine/job/thread/JobRunThread.java
@@ -24,7 +24,7 @@ import org.apache.commons.exec.ExecuteWatchdog;
 import org.apache.commons.exec.LogOutputStream;
 import org.apache.commons.exec.PumpStreamHandler;
 import org.apache.commons.io.Charsets;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.interpreter.InterpreterContext;
 import org.apache.zeppelin.interpreter.thrift.ParagraphInfo;
 import org.apache.zeppelin.submarine.hadoop.HdfsClient;
diff --git a/submarine/src/main/java/org/apache/zeppelin/submarine/job/thread/TensorboardRunThread.java b/submarine/src/main/java/org/apache/zeppelin/submarine/job/thread/TensorboardRunThread.java
index 3c2d45c..046abfa 100644
--- a/submarine/src/main/java/org/apache/zeppelin/submarine/job/thread/TensorboardRunThread.java
+++ b/submarine/src/main/java/org/apache/zeppelin/submarine/job/thread/TensorboardRunThread.java
@@ -24,7 +24,7 @@ import org.apache.commons.exec.ExecuteWatchdog;
 import org.apache.commons.exec.LogOutputStream;
 import org.apache.commons.exec.PumpStreamHandler;
 import org.apache.commons.io.Charsets;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.submarine.commons.SubmarineConstants;
 import org.apache.zeppelin.submarine.commons.SubmarineUI;
 import org.apache.zeppelin.submarine.commons.SubmarineUtils;
diff --git a/zeppelin-integration/pom.xml b/zeppelin-integration/pom.xml
index 47e3494..23e8ac2 100644
--- a/zeppelin-integration/pom.xml
+++ b/zeppelin-integration/pom.xml
@@ -96,7 +96,6 @@
     <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
-      <version>${commons.lang3.version}</version>
     </dependency>
     <dependency>
       <groupId>org.rauschig</groupId>
diff --git a/zeppelin-integration/src/test/java/org/apache/zeppelin/integration/InterpreterModeActionsIT.java b/zeppelin-integration/src/test/java/org/apache/zeppelin/integration/InterpreterModeActionsIT.java
index e8c3e56..c1f5ab2 100644
--- a/zeppelin-integration/src/test/java/org/apache/zeppelin/integration/InterpreterModeActionsIT.java
+++ b/zeppelin-integration/src/test/java/org/apache/zeppelin/integration/InterpreterModeActionsIT.java
@@ -16,7 +16,7 @@
  */
 package org.apache.zeppelin.integration;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.CommandExecutor;
 import org.apache.zeppelin.ProcessData;
 import org.apache.zeppelin.AbstractZeppelinIT;
diff --git a/zeppelin-integration/src/test/java/org/apache/zeppelin/integration/ParagraphActionsIT.java b/zeppelin-integration/src/test/java/org/apache/zeppelin/integration/ParagraphActionsIT.java
index 7c5465b..13b96ae 100644
--- a/zeppelin-integration/src/test/java/org/apache/zeppelin/integration/ParagraphActionsIT.java
+++ b/zeppelin-integration/src/test/java/org/apache/zeppelin/integration/ParagraphActionsIT.java
@@ -18,7 +18,7 @@
 package org.apache.zeppelin.integration;
 
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.AbstractZeppelinIT;
 import org.apache.zeppelin.WebDriverManager;
 import org.apache.zeppelin.ZeppelinITUtils;
diff --git a/zeppelin-integration/src/test/java/org/apache/zeppelin/integration/PersonalizeActionsIT.java b/zeppelin-integration/src/test/java/org/apache/zeppelin/integration/PersonalizeActionsIT.java
index 1fc8890..8a7138c 100644
--- a/zeppelin-integration/src/test/java/org/apache/zeppelin/integration/PersonalizeActionsIT.java
+++ b/zeppelin-integration/src/test/java/org/apache/zeppelin/integration/PersonalizeActionsIT.java
@@ -16,7 +16,7 @@
  */
 package org.apache.zeppelin.integration;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.AbstractZeppelinIT;
 import org.apache.zeppelin.integration.AuthenticationIT;
 import org.apache.zeppelin.WebDriverManager;
diff --git a/zeppelin-interpreter/pom.xml b/zeppelin-interpreter/pom.xml
index b3f4269..674d26c 100644
--- a/zeppelin-interpreter/pom.xml
+++ b/zeppelin-interpreter/pom.xml
@@ -45,7 +45,6 @@
     <jline.version>2.14.3</jline.version>
     <atomix.version>3.0.0-rc4</atomix.version>
     <commons-math3.version>3.1.1</commons-math3.version>
-    <commons-lang3.version>3.7</commons-lang3.version>
 
     <!--plugin versions-->
     <plugin.shade.version>2.3</plugin.shade.version>
@@ -89,7 +88,6 @@
     <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
-      <version>${commons-lang3.version}</version>
     </dependency>
 
     <dependency>
@@ -124,11 +122,6 @@
     </dependency>
 
     <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
-    </dependency>
-
-    <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
     </dependency>
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/cluster/ClusterManager.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/cluster/ClusterManager.java
index 1ccf41a..869340f 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/cluster/ClusterManager.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/cluster/ClusterManager.java
@@ -78,7 +78,7 @@ import io.atomix.protocols.raft.storage.system.Configuration;
 import io.atomix.utils.net.Address;
 import io.atomix.utils.serializer.Namespace;
 import io.atomix.utils.serializer.Serializer;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.cluster.meta.ClusterMeta;
 import org.apache.zeppelin.cluster.meta.ClusterMetaEntity;
 import org.apache.zeppelin.cluster.meta.ClusterMetaOperation;
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/cluster/ClusterManagerServer.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/cluster/ClusterManagerServer.java
index eb1a6b8..11e5602 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/cluster/ClusterManagerServer.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/cluster/ClusterManagerServer.java
@@ -31,7 +31,7 @@ import io.atomix.protocols.raft.protocol.RaftServerProtocol;
 import io.atomix.protocols.raft.storage.RaftStorage;
 import io.atomix.storage.StorageLevel;
 import io.atomix.utils.net.Address;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.cluster.event.ClusterEventListener;
 import org.apache.zeppelin.cluster.meta.ClusterMeta;
 import org.apache.zeppelin.cluster.protocol.RaftServerMessagingProtocol;
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/cluster/meta/ClusterMeta.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/cluster/meta/ClusterMeta.java
index 0dfb2b7..4e8a276 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/cluster/meta/ClusterMeta.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/cluster/meta/ClusterMeta.java
@@ -17,7 +17,7 @@
 package org.apache.zeppelin.cluster.meta;
 
 import com.google.gson.Gson;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java
index 15e004d..dfcf840 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java
@@ -30,7 +30,7 @@ import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.XMLConfiguration;
 import org.apache.commons.configuration.tree.ConfigurationNode;
 import org.apache.commons.exec.environment.EnvironmentUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.util.Util;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Booter.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Booter.java
index 25bd0cc..3f0570a 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Booter.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Booter.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.dep;
 
-import org.apache.commons.lang.Validate;
+import org.apache.commons.lang3.Validate;
 import org.apache.maven.repository.internal.MavenRepositorySystemSession;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/DependencyResolver.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/DependencyResolver.java
index 495c69b..753163c 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/DependencyResolver.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/DependencyResolver.java
@@ -26,7 +26,7 @@ import java.util.LinkedList;
 import java.util.List;
 
 import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.sonatype.aether.RepositoryException;
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Repository.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Repository.java
index 74adce8..1524e08 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Repository.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/dep/Repository.java
@@ -16,7 +16,7 @@
  */
 
 package org.apache.zeppelin.dep;
-import static org.apache.commons.lang.StringUtils.isNotBlank;
+import static org.apache.commons.lang3.StringUtils.isNotBlank;
 
 import com.google.gson.Gson;
 import org.apache.zeppelin.common.JsonSerializable;
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java
index b6a5130..f17f3fe 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/display/Input.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.display;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.display.ui.CheckBox;
 import org.apache.zeppelin.display.ui.OptionInput;
 import org.apache.zeppelin.display.ui.OptionInput.ParamOption;
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/Interpreter.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/Interpreter.java
index 70da6a1..e38a84b 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/Interpreter.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/Interpreter.java
@@ -18,8 +18,8 @@
 package org.apache.zeppelin.interpreter;
 
 
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.reflect.FieldUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.reflect.FieldUtils;
 import org.apache.zeppelin.annotation.Experimental;
 import org.apache.zeppelin.annotation.ZeppelinApi;
 import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion;
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterOutput.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterOutput.java
index 3641222..83b6cc4 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterOutput.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/InterpreterOutput.java
@@ -17,7 +17,7 @@
 package org.apache.zeppelin.interpreter;
 
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java
index 7668cc0..d6bd116 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java
@@ -19,7 +19,7 @@ package org.apache.zeppelin.interpreter.remote;
 
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.thrift.TException;
 import org.apache.thrift.protocol.TBinaryProtocol;
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterUtils.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterUtils.java
index 4ebc2a2..4f7c9a5 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterUtils.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterUtils.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.interpreter.remote;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.thrift.transport.TServerSocket;
 import org.apache.thrift.transport.TTransportException;
 import org.slf4j.Logger;
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/util/ProcessLauncher.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/util/ProcessLauncher.java
index b45db06..ff07efe 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/util/ProcessLauncher.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/util/ProcessLauncher.java
@@ -24,8 +24,8 @@ import org.apache.commons.exec.ExecuteResultHandler;
 import org.apache.commons.exec.ExecuteWatchdog;
 import org.apache.commons.exec.LogOutputStream;
 import org.apache.commons.exec.PumpStreamHandler;
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.zeppelin.interpreter.InterpreterContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java
index 66bfefa..b051585 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/scheduler/Job.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.scheduler;
 
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -195,9 +195,9 @@ public abstract class Job<T> {
     }
     Throwable cause = ExceptionUtils.getRootCause(e);
     if (cause != null) {
-      return ExceptionUtils.getFullStackTrace(cause);
+      return ExceptionUtils.getStackTrace(cause);
     } else {
-      return ExceptionUtils.getFullStackTrace(e);
+      return ExceptionUtils.getStackTrace(e);
     }
   }
 
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/AuthenticationInfo.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/AuthenticationInfo.java
index 455fd8b..1444025 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/AuthenticationInfo.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/user/AuthenticationInfo.java
@@ -22,7 +22,7 @@ package org.apache.zeppelin.user;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.common.JsonSerializable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/util/Util.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/util/Util.java
index e36afca..dc4faf1 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/util/Util.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/util/Util.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.util;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 import java.io.IOException;
 import java.util.Properties;
diff --git a/zeppelin-jupyter-interpreter/pom.xml b/zeppelin-jupyter-interpreter/pom.xml
index 2ba7659..635508c 100644
--- a/zeppelin-jupyter-interpreter/pom.xml
+++ b/zeppelin-jupyter-interpreter/pom.xml
@@ -66,8 +66,8 @@
     </dependency>
 
     <dependency>
-      <groupId>commons-lang</groupId>
-      <artifactId>commons-lang</artifactId>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
     </dependency>
 
     <dependency>
diff --git a/zeppelin-jupyter-interpreter/src/main/java/org/apache/zeppelin/jupyter/JupyterKernelClient.java b/zeppelin-jupyter-interpreter/src/main/java/org/apache/zeppelin/jupyter/JupyterKernelClient.java
index edee23c..3d18df1 100644
--- a/zeppelin-jupyter-interpreter/src/main/java/org/apache/zeppelin/jupyter/JupyterKernelClient.java
+++ b/zeppelin-jupyter-interpreter/src/main/java/org/apache/zeppelin/jupyter/JupyterKernelClient.java
@@ -20,7 +20,7 @@ package org.apache.zeppelin.jupyter;
 import io.grpc.ManagedChannel;
 import io.grpc.ManagedChannelBuilder;
 import io.grpc.stub.StreamObserver;
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.zeppelin.interpreter.InterpreterContext;
 import org.apache.zeppelin.interpreter.InterpreterResult;
 import org.apache.zeppelin.interpreter.InterpreterResultMessageOutput;
diff --git a/zeppelin-jupyter-interpreter/src/main/java/org/apache/zeppelin/jupyter/JupyterKernelInterpreter.java b/zeppelin-jupyter-interpreter/src/main/java/org/apache/zeppelin/jupyter/JupyterKernelInterpreter.java
index d895bd8..5f8164f 100644
--- a/zeppelin-jupyter-interpreter/src/main/java/org/apache/zeppelin/jupyter/JupyterKernelInterpreter.java
+++ b/zeppelin-jupyter-interpreter/src/main/java/org/apache/zeppelin/jupyter/JupyterKernelInterpreter.java
@@ -23,8 +23,8 @@ import org.apache.commons.exec.CommandLine;
 import org.apache.commons.exec.environment.EnvironmentUtils;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.exception.ExceptionUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.interpreter.AbstractInterpreter;
 import org.apache.zeppelin.interpreter.ZeppelinContext;
 import org.apache.zeppelin.interpreter.InterpreterContext;
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/realm/ActiveDirectoryGroupRealm.java b/zeppelin-server/src/main/java/org/apache/zeppelin/realm/ActiveDirectoryGroupRealm.java
index c31acc8..6d461d2 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/realm/ActiveDirectoryGroupRealm.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/realm/ActiveDirectoryGroupRealm.java
@@ -17,7 +17,7 @@
 package org.apache.zeppelin.realm;
 
 import java.util.LinkedHashMap;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.authc.AuthenticationException;
 import org.apache.shiro.authc.AuthenticationInfo;
 import org.apache.shiro.authc.AuthenticationToken;
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/realm/LdapRealm.java b/zeppelin-server/src/main/java/org/apache/zeppelin/realm/LdapRealm.java
index 5a1b357..e33385a 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/realm/LdapRealm.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/realm/LdapRealm.java
@@ -216,7 +216,7 @@ public class LdapRealm extends JndiLdapRealm {
 
   protected void onInit() {
     super.onInit();
-    if (!org.apache.commons.lang.StringUtils.isEmpty(this.hadoopSecurityCredentialPath)
+    if (!org.apache.commons.lang3.StringUtils.isEmpty(this.hadoopSecurityCredentialPath)
         && getContextFactory() != null) {
       ((JndiLdapContextFactory) getContextFactory()).setSystemPassword(
           getSystemPassword(this.hadoopSecurityCredentialPath, keystorePass));
@@ -238,7 +238,7 @@ public class LdapRealm extends JndiLdapRealm {
     } catch (IOException e) {
       throw new ShiroException("Error from getting credential entry from keystore", e);
     }
-    if (org.apache.commons.lang.StringUtils.isEmpty(password)) {
+    if (org.apache.commons.lang3.StringUtils.isEmpty(password)) {
       throw new ShiroException("Error getting SystemPassword from the provided keystore:"
           + keystorePass + ", in path:" + hadoopSecurityCredentialPath);
     }
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/AdminRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/AdminRestApi.java
index e927ba6..506ada9 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/AdminRestApi.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/AdminRestApi.java
@@ -26,7 +26,7 @@ import javax.ws.rs.GET;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.QueryParam;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.annotation.ZeppelinApi;
 import org.apache.zeppelin.rest.message.LoggerRequest;
 import org.apache.zeppelin.service.AdminService;
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/HeliumRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/HeliumRestApi.java
index 05b5e77..c206dc7 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/HeliumRestApi.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/HeliumRestApi.java
@@ -23,7 +23,7 @@ import com.google.gson.reflect.TypeToken;
 import javax.inject.Inject;
 import javax.inject.Singleton;
 import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/InterpreterRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/InterpreterRestApi.java
index bba8fbf..a25fa06 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/InterpreterRestApi.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/InterpreterRestApi.java
@@ -20,7 +20,7 @@ package org.apache.zeppelin.rest;
 import com.google.common.collect.Maps;
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.zeppelin.annotation.ZeppelinApi;
 import org.apache.zeppelin.dep.Repository;
 import org.apache.zeppelin.interpreter.InterpreterException;
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRepoRestApi.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRepoRestApi.java
index a93a139..06c6459 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRepoRestApi.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/NotebookRepoRestApi.java
@@ -22,7 +22,7 @@ import com.google.gson.JsonSyntaxException;
 
 import javax.inject.Inject;
 import javax.inject.Singleton;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.service.AuthenticationService;
 import org.apache.zeppelin.service.ServiceContext;
 import org.slf4j.Logger;
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NotebookRepoSettingsRequest.java b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NotebookRepoSettingsRequest.java
index 31f3be8..89744de 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NotebookRepoSettingsRequest.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/rest/message/NotebookRepoSettingsRequest.java
@@ -18,7 +18,7 @@ package org.apache.zeppelin.rest.message;
 
 import com.google.gson.Gson;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 import java.util.Collections;
 import java.util.Map;
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java
index b231fd4..2097b05 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/server/ZeppelinServer.java
@@ -32,7 +32,7 @@ import javax.management.remote.JMXServiceURL;
 import javax.servlet.DispatcherType;
 import javax.servlet.ServletContextEvent;
 import javax.servlet.ServletContextListener;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.directory.api.util.Strings;
 import org.apache.shiro.web.env.EnvironmentLoaderListener;
 import org.apache.shiro.web.servlet.ShiroFilter;
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/service/NotebookService.java b/zeppelin-server/src/main/java/org/apache/zeppelin/service/NotebookService.java
index e6a7cab..a844507 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/service/NotebookService.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/service/NotebookService.java
@@ -35,7 +35,7 @@ import java.util.Set;
 import javax.inject.Inject;
 
 import java.util.stream.Collectors;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.conf.ZeppelinConfiguration;
 import org.apache.zeppelin.display.AngularObject;
 import org.apache.zeppelin.display.AngularObjectRegistry;
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/ConnectionManager.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/ConnectionManager.java
index 906ee0f..d44c656 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/ConnectionManager.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/ConnectionManager.java
@@ -22,7 +22,7 @@ import com.google.common.collect.Queues;
 import com.google.common.collect.Sets;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.conf.ZeppelinConfiguration;
 import org.apache.zeppelin.display.GUI;
 import org.apache.zeppelin.display.Input;
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
index c0c6bd6..0bef18a 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
@@ -39,7 +39,7 @@ import java.util.concurrent.atomic.AtomicReference;
 import javax.inject.Inject;
 import javax.inject.Provider;
 import javax.servlet.http.HttpServletRequest;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.thrift.TException;
 import org.apache.zeppelin.cluster.ClusterManagerServer;
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookSocket.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookSocket.java
index 65740ff..d69be98 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookSocket.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookSocket.java
@@ -16,7 +16,7 @@
  */
 package org.apache.zeppelin.socket;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.eclipse.jetty.websocket.api.Session;
 import org.eclipse.jetty.websocket.api.WebSocketAdapter;
 
diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/configuration/RequestHeaderSizeTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/configuration/RequestHeaderSizeTest.java
index de21aa8..42018ec 100644
--- a/zeppelin-server/src/test/java/org/apache/zeppelin/configuration/RequestHeaderSizeTest.java
+++ b/zeppelin-server/src/test/java/org/apache/zeppelin/configuration/RequestHeaderSizeTest.java
@@ -21,7 +21,7 @@ import static org.hamcrest.MatcherAssert.assertThat;
 
 import org.apache.commons.httpclient.HttpClient;
 import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.lang.RandomStringUtils;
+import org.apache.commons.lang3.RandomStringUtils;
 import org.eclipse.jetty.http.HttpStatus;
 import org.junit.After;
 import org.junit.Before;
diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/NotebookRepoRestApiTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/NotebookRepoRestApiTest.java
index 34b85ae..46ea712 100644
--- a/zeppelin-server/src/test/java/org/apache/zeppelin/rest/NotebookRepoRestApiTest.java
+++ b/zeppelin-server/src/test/java/org/apache/zeppelin/rest/NotebookRepoRestApiTest.java
@@ -26,7 +26,7 @@ import com.google.gson.reflect.TypeToken;
 
 import org.apache.commons.httpclient.methods.GetMethod;
 import org.apache.commons.httpclient.methods.PutMethod;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
diff --git a/zeppelin-server/src/test/java/org/apache/zeppelin/service/NotebookServiceTest.java b/zeppelin-server/src/test/java/org/apache/zeppelin/service/NotebookServiceTest.java
index 44a0e6f..47bbfde 100644
--- a/zeppelin-server/src/test/java/org/apache/zeppelin/service/NotebookServiceTest.java
+++ b/zeppelin-server/src/test/java/org/apache/zeppelin/service/NotebookServiceTest.java
@@ -42,7 +42,7 @@ import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
 import com.google.common.io.Files;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.conf.ZeppelinConfiguration;
 import org.apache.zeppelin.interpreter.Interpreter;
 import org.apache.zeppelin.interpreter.Interpreter.FormType;
diff --git a/zeppelin-zengine/pom.xml b/zeppelin-zengine/pom.xml
index da320a8..9c9426a 100644
--- a/zeppelin-zengine/pom.xml
+++ b/zeppelin-zengine/pom.xml
@@ -38,7 +38,6 @@
   <properties>
     <!--library versions-->
     <hadoop.version>2.7.3</hadoop.version>
-    <commons.lang3.version>3.7</commons.lang3.version>
     <jackrabbit.webdav.version>1.5.2</jackrabbit.webdav.version>
     <quartz.scheduler.version>2.2.1</quartz.scheduler.version>
     <lucene.version>5.3.1</lucene.version>
@@ -264,7 +263,6 @@
     <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
-      <version>${commons.lang3.version}</version>
     </dependency>
 
     <dependency>
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumBundleFactory.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumBundleFactory.java
index 61e8897..fb419fb 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumBundleFactory.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumBundleFactory.java
@@ -55,7 +55,7 @@ import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
 import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.log4j.Appender;
 import org.apache.log4j.PatternLayout;
 import org.apache.log4j.WriterAppender;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumOnlineRegistry.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumOnlineRegistry.java
index e54687a..58ddcd8 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumOnlineRegistry.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/helium/HeliumOnlineRegistry.java
@@ -19,7 +19,7 @@ package org.apache.zeppelin.helium;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
 import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.http.HttpHost;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.config.RequestConfig;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/ConfInterpreter.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/ConfInterpreter.java
index 137ebed..0a95df1 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/ConfInterpreter.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/ConfInterpreter.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.interpreter;
 
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java
index 7721808..62e7c05 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterFactory.java
@@ -19,7 +19,7 @@ package org.apache.zeppelin.interpreter;
 
 import com.google.common.base.Preconditions;
 import javax.inject.Inject;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSetting.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSetting.java
index f677586..9a179cd 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSetting.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSetting.java
@@ -31,7 +31,7 @@ import com.google.gson.reflect.TypeToken;
 import com.google.gson.stream.JsonReader;
 import com.google.gson.stream.JsonWriter;
 import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.conf.ZeppelinConfiguration;
 import org.apache.zeppelin.dep.Dependency;
 import org.apache.zeppelin.dep.DependencyResolver;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSettingManager.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSettingManager.java
index 69bdf9d..85ab17e 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSettingManager.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/InterpreterSettingManager.java
@@ -32,8 +32,8 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import javax.inject.Inject;
 import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang.ArrayUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.cluster.ClusterManagerServer;
 import org.apache.zeppelin.cluster.event.ClusterEvent;
 import org.apache.zeppelin.cluster.event.ClusterEventListener;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/SessionConfInterpreter.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/SessionConfInterpreter.java
index e303ee6..a5f580f 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/SessionConfInterpreter.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/SessionConfInterpreter.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.interpreter;
 
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.zeppelin.interpreter.remote.RemoteInterpreter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/launcher/StandardInterpreterLauncher.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/launcher/StandardInterpreterLauncher.java
index 98485f6..677cbd0 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/launcher/StandardInterpreterLauncher.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/launcher/StandardInterpreterLauncher.java
@@ -18,7 +18,7 @@
 
 package org.apache.zeppelin.interpreter.launcher;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.conf.ZeppelinConfiguration;
 import org.apache.zeppelin.interpreter.InterpreterOption;
 import org.apache.zeppelin.interpreter.InterpreterRunner;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/recovery/FileSystemRecoveryStorage.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/recovery/FileSystemRecoveryStorage.java
index 4dffff1..bef2c8f 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/recovery/FileSystemRecoveryStorage.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/recovery/FileSystemRecoveryStorage.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.interpreter.recovery;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.hadoop.fs.Path;
 import org.apache.zeppelin.conf.ZeppelinConfiguration;
 import org.apache.zeppelin.interpreter.InterpreterSetting;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterManagedProcess.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterManagedProcess.java
index 25255a4..d6e2c52 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterManagedProcess.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterManagedProcess.java
@@ -21,7 +21,7 @@ import com.google.common.annotations.VisibleForTesting;
 import org.apache.commons.exec.CommandLine;
 import org.apache.commons.exec.ExecuteException;
 import org.apache.commons.exec.environment.EnvironmentUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.hadoop.yarn.util.ConverterUtils;
 import org.apache.zeppelin.interpreter.YarnAppMonitor;
 import org.apache.zeppelin.interpreter.thrift.RemoteInterpreterService;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/AuthorizationService.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/AuthorizationService.java
index a4ef3e6..ecdafe2 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/AuthorizationService.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/AuthorizationService.java
@@ -20,7 +20,7 @@ package org.apache.zeppelin.notebook;
 import com.google.common.collect.Sets;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.cluster.ClusterManagerServer;
 import org.apache.zeppelin.cluster.event.ClusterEvent;
 import org.apache.zeppelin.cluster.event.ClusterEventListener;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/FileSystemStorage.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/FileSystemStorage.java
index f47cf65..ddf28be 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/FileSystemStorage.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/FileSystemStorage.java
@@ -1,6 +1,6 @@
 package org.apache.zeppelin.notebook;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java
index 1c08fb1..5b38895 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Note.java
@@ -23,7 +23,7 @@ import com.google.gson.ExclusionStrategy;
 import com.google.gson.FieldAttributes;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.common.JsonSerializable;
 import org.apache.zeppelin.conf.ZeppelinConfiguration;
 import org.apache.zeppelin.display.AngularObject;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java
index d483f6a..00de528 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Paragraph.java
@@ -31,8 +31,8 @@ import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.zeppelin.common.JsonSerializable;
 import org.apache.zeppelin.display.AngularObject;
 import org.apache.zeppelin.display.AngularObjectRegistry;
@@ -77,7 +77,7 @@ public class Paragraph extends JobWithProgressPoller<InterpreterResult> implemen
   private static Logger LOGGER = LoggerFactory.getLogger(Paragraph.class);
   private static Pattern REPL_PATTERN =
       Pattern.compile("(\\s*)%([\\w\\.]+)(\\(.*?\\))?.*", Pattern.DOTALL);
-  
+
   private String title;
   // text is composed of intpText and scriptText.
   private String text;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/ParagraphTextParser.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/ParagraphTextParser.java
index b251e18..5ee7261 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/ParagraphTextParser.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/ParagraphTextParser.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.notebook;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoWithSettings.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoWithSettings.java
index e5f59da..6be574f 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoWithSettings.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoWithSettings.java
@@ -19,7 +19,7 @@ package org.apache.zeppelin.notebook.repo;
 import java.util.Collections;
 import java.util.List;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 /**
  * Representation of a notebook repo with settings. This is mostly a Wrapper around notebook repo
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoWithVersionControl.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoWithVersionControl.java
index a734c1a..d9a31b3 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoWithVersionControl.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/NotebookRepoWithVersionControl.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.notebook.repo;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.annotation.ZeppelinApi;
 import org.apache.zeppelin.notebook.Note;
 import org.apache.zeppelin.notebook.NoteInfo;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/OldNotebookRepoWithVersionControl.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/OldNotebookRepoWithVersionControl.java
index b85a0f9..62fdc09 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/OldNotebookRepoWithVersionControl.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/OldNotebookRepoWithVersionControl.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.notebook.repo;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.annotation.ZeppelinApi;
 import org.apache.zeppelin.notebook.Note;
 import org.apache.zeppelin.user.AuthenticationInfo;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/OldVFSNotebookRepo.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/OldVFSNotebookRepo.java
index aa1f449..7a1436a 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/OldVFSNotebookRepo.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/OldVFSNotebookRepo.java
@@ -18,7 +18,7 @@
 package org.apache.zeppelin.notebook.repo;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.vfs2.FileContent;
 import org.apache.commons.vfs2.FileObject;
 import org.apache.commons.vfs2.FileSystemManager;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java
index 50fffaf..2d2fbc2 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/VFSNotebookRepo.java
@@ -28,7 +28,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.vfs2.FileObject;
 import org.apache.commons.vfs2.FileSystemManager;
 import org.apache.commons.vfs2.NameScope;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/model/UserSessionContainer.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/model/UserSessionContainer.java
index 7f035b1..4dc68c0 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/model/UserSessionContainer.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/model/UserSessionContainer.java
@@ -19,7 +19,7 @@ package org.apache.zeppelin.notebook.repo.zeppelinhub.model;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 /**
  * Simple and yet dummy container for zeppelinhub session.
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/model/UserTokenContainer.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/model/UserTokenContainer.java
index b594f89..d3ce2cc 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/model/UserTokenContainer.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/model/UserTokenContainer.java
@@ -25,7 +25,7 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.notebook.repo.zeppelinhub.rest.ZeppelinhubRestApiHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/rest/HttpProxyClient.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/rest/HttpProxyClient.java
index 690a8b6..abdfcf2 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/rest/HttpProxyClient.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/rest/HttpProxyClient.java
@@ -26,7 +26,7 @@ import java.util.concurrent.TimeoutException;
 import javax.net.ssl.SSLContext;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.http.HttpHost;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.methods.HttpDelete;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/rest/ZeppelinhubRestApiHandler.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/rest/ZeppelinhubRestApiHandler.java
index 437386c..405ea68 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/rest/ZeppelinhubRestApiHandler.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/rest/ZeppelinhubRestApiHandler.java
@@ -28,7 +28,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.http.client.methods.HttpDelete;
 import org.apache.http.client.methods.HttpGet;
 import org.apache.http.client.methods.HttpPost;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/ZeppelinhubClient.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/ZeppelinhubClient.java
index 0a14393..e747900 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/ZeppelinhubClient.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/ZeppelinhubClient.java
@@ -26,7 +26,7 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.listener.ZeppelinhubWebsocket;
 import org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.protocol.ZeppelinHubOp;
 import org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.protocol.ZeppelinhubMessage;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/listener/WatcherWebsocket.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/listener/WatcherWebsocket.java
index 43adf4a..9a356e3 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/listener/WatcherWebsocket.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/listener/WatcherWebsocket.java
@@ -16,7 +16,7 @@
  */
 package org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.listener;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.ZeppelinClient;
 import org.apache.zeppelin.notebook.socket.Message;
 import org.apache.zeppelin.notebook.socket.Message.OP;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/protocol/ZeppelinhubMessage.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/protocol/ZeppelinhubMessage.java
index 4f7c652..aa14cd2 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/protocol/ZeppelinhubMessage.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/protocol/ZeppelinhubMessage.java
@@ -18,7 +18,7 @@ package org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.protocol;
 
 import java.util.Map;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.common.JsonSerializable;
 import org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.Client;
 import org.apache.zeppelin.notebook.socket.Message;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/session/ZeppelinhubSession.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/session/ZeppelinhubSession.java
index 86cd4ad..568c398 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/session/ZeppelinhubSession.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/session/ZeppelinhubSession.java
@@ -16,7 +16,7 @@
  */
 package org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.session;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.eclipse.jetty.websocket.api.Session;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/utils/ZeppelinhubUtils.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/utils/ZeppelinhubUtils.java
index 50da343..2ab8d0e 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/utils/ZeppelinhubUtils.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/repo/zeppelinhub/websocket/utils/ZeppelinhubUtils.java
@@ -18,7 +18,7 @@ package org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.utils;
 
 import java.util.HashMap;
 
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.notebook.repo.zeppelinhub.model.UserTokenContainer;
 import org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.ZeppelinhubClient;
 import org.apache.zeppelin.notebook.repo.zeppelinhub.websocket.protocol.ZeppelinHubOp;
diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterTest.java
index 9beaaeb..da6a251 100644
--- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterTest.java
+++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterTest.java
@@ -17,7 +17,7 @@
 
 package org.apache.zeppelin.interpreter.remote;
 
-import org.apache.commons.lang.exception.ExceptionUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.thrift.transport.TTransportException;
 import org.apache.zeppelin.conf.ZeppelinConfiguration;
 import org.apache.zeppelin.display.AngularObjectRegistry;
diff --git a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/GitNotebookRepoTest.java b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/GitNotebookRepoTest.java
index 7a4b5c7..3febfb4 100644
--- a/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/GitNotebookRepoTest.java
+++ b/zeppelin-zengine/src/test/java/org/apache/zeppelin/notebook/repo/GitNotebookRepoTest.java
@@ -27,7 +27,7 @@ import java.util.Map;
 
 import com.google.common.truth.Truth;
 import org.apache.commons.io.FileUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.zeppelin.conf.ZeppelinConfiguration;
 import org.apache.zeppelin.conf.ZeppelinConfiguration.ConfVars;
 import org.apache.zeppelin.interpreter.InterpreterFactory;


[zeppelin] 03/03: [ZEPPELIN-4687]. Allow to run multiple sql as one flink job

Posted by zj...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

zjffdu pushed a commit to branch branch-0.9
in repository https://gitbox.apache.org/repos/asf/zeppelin.git

commit 2a0141d0604627ff9f55879ff911ac2d74742602
Author: Jeff Zhang <zj...@apache.org>
AuthorDate: Wed Mar 18 16:11:40 2020 +0800

    [ZEPPELIN-4687]. Allow to run multiple sql as one flink job
    
    ### What is this PR for?
    
    This PR is to allow user to run multiple sql as one flink job in one paragraph. User can just specify paragraph local properties `runAsOne` to be `true` to enable this feature.
    
    ### What type of PR is it?
    [Improvement]
    
    ### Todos
    * [ ] - Task
    
    ### What is the Jira issue?
    * https://issues.apache.org/jira/browse/ZEPPELIN-4687
    
    ### How should this be tested?
    * CI pass
    
    ### Screenshots (if appropriate)
    
    ![image](https://user-images.githubusercontent.com/164491/76941313-c3105780-6936-11ea-9b5b-bc58d8205792.png)
    
    ![image](https://user-images.githubusercontent.com/164491/76941325-c9063880-6936-11ea-8be4-1b87577ea086.png)
    
    ### Questions:
    * Does the licenses files need update? No
    * Is there breaking changes for older versions? No
    * Does this needs documentation? No
    
    Author: Jeff Zhang <zj...@apache.org>
    
    Closes #3692 from zjffdu/ZEPPELIN-4687 and squashes the following commits:
    
    f66b8793e [Jeff Zhang] [ZEPPELIN-4687]. Allow to run multiple sql as one job
    
    (cherry picked from commit 3c9322cd48df805b70ef80f4212f57efaf95689b)
---
 .../apache/zeppelin/flink/FlinkSqlInterrpeter.java | 31 +++++++-
 .../zeppelin/flink/sql/AppendStreamSqlJob.java     |  4 +-
 .../zeppelin/flink/sql/SingleRowStreamSqlJob.java  |  5 +-
 .../zeppelin/flink/sql/UpdateStreamSqlJob.java     |  6 +-
 .../flink/FlinkBatchSqlInterpreterTest.java        | 86 +++++++++++++++++++++-
 .../flink/FlinkStreamSqlInterpreterTest.java       | 44 +++++++++++
 6 files changed, 166 insertions(+), 10 deletions(-)

diff --git a/flink/src/main/java/org/apache/zeppelin/flink/FlinkSqlInterrpeter.java b/flink/src/main/java/org/apache/zeppelin/flink/FlinkSqlInterrpeter.java
index 82ac50e..c85dbf4 100644
--- a/flink/src/main/java/org/apache/zeppelin/flink/FlinkSqlInterrpeter.java
+++ b/flink/src/main/java/org/apache/zeppelin/flink/FlinkSqlInterrpeter.java
@@ -202,6 +202,30 @@ public abstract class FlinkSqlInterrpeter extends Interpreter {
       }
     }
 
+    boolean runAsOne = Boolean.parseBoolean(context.getStringLocalProperty("runAsOne", "false"));
+    if (runAsOne) {
+      try {
+        lock.lock();
+        if (context.getLocalProperties().containsKey("parallelism")) {
+          this.tbenv.getConfig().getConfiguration()
+                  .set(ExecutionConfigOptions.TABLE_EXEC_RESOURCE_DEFAULT_PARALLELISM,
+                          Integer.parseInt(context.getLocalProperties().get("parallelism")));
+        }
+        this.tbenv.execute(st);
+        context.out.write("Insertion successfully.\n");
+      } catch (Exception e) {
+        LOGGER.error("Fail to execute sql as one job", e);
+        return new InterpreterResult(InterpreterResult.Code.ERROR, ExceptionUtils.getStackTrace(e));
+      } finally {
+        if (lock.isHeldByCurrentThread()) {
+          lock.unlock();
+        }
+        this.tbenv.getConfig().getConfiguration()
+                .set(ExecutionConfigOptions.TABLE_EXEC_RESOURCE_DEFAULT_PARALLELISM,
+                        defaultSqlParallelism);
+      }
+    }
+
     return new InterpreterResult(InterpreterResult.Code.SUCCESS);
   }
 
@@ -498,7 +522,11 @@ public abstract class FlinkSqlInterrpeter extends Interpreter {
        }
 
        this.tbenv.sqlUpdate(sql);
-       this.tbenv.execute(sql);
+       boolean runAsOne = Boolean.parseBoolean(context.getStringLocalProperty("runAsOne", "false"));
+       if (!runAsOne) {
+         this.tbenv.execute(sql);
+         context.out.write("Insertion successfully.\n");
+       }
      } catch (Exception e) {
        throw new IOException(e);
      } finally {
@@ -519,7 +547,6 @@ public abstract class FlinkSqlInterrpeter extends Interpreter {
        }
        this.tbenv.getConfig().getConfiguration().addAll(flinkInterpreter.getFlinkConfiguration());
      }
-     context.out.write("Insertion successfully.\n");
   }
 
   private static AttributedString formatCommand(SqlCommand cmd, String description) {
diff --git a/flink/src/main/java/org/apache/zeppelin/flink/sql/AppendStreamSqlJob.java b/flink/src/main/java/org/apache/zeppelin/flink/sql/AppendStreamSqlJob.java
index 2b6add4..25b2064 100644
--- a/flink/src/main/java/org/apache/zeppelin/flink/sql/AppendStreamSqlJob.java
+++ b/flink/src/main/java/org/apache/zeppelin/flink/sql/AppendStreamSqlJob.java
@@ -90,8 +90,8 @@ public class AppendStreamSqlJob extends AbstractStreamSqlJob {
 
     // sort it by the first column
     materializedTable.sort((r1, r2) -> {
-      String f1 = r1.getField(0).toString();
-      String f2 = r2.getField(0).toString();
+      String f1 = TableDataUtils.normalizeColumn(StringUtils.arrayAwareToString(r1.getField(0)));
+      String f2 = TableDataUtils.normalizeColumn(StringUtils.arrayAwareToString(r2.getField(0)));
       return f1.compareTo(f2);
     });
 
diff --git a/flink/src/main/java/org/apache/zeppelin/flink/sql/SingleRowStreamSqlJob.java b/flink/src/main/java/org/apache/zeppelin/flink/sql/SingleRowStreamSqlJob.java
index b5d7824..8dd2bec 100644
--- a/flink/src/main/java/org/apache/zeppelin/flink/sql/SingleRowStreamSqlJob.java
+++ b/flink/src/main/java/org/apache/zeppelin/flink/sql/SingleRowStreamSqlJob.java
@@ -22,8 +22,10 @@ import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment;
 import org.apache.flink.table.api.TableEnvironment;
 import org.apache.flink.table.api.scala.StreamTableEnvironment;
 import org.apache.flink.types.Row;
+import org.apache.flink.util.StringUtils;
 import org.apache.zeppelin.flink.JobManager;
 import org.apache.zeppelin.interpreter.InterpreterContext;
+import org.apache.zeppelin.tabledata.TableDataUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -65,7 +67,8 @@ public class SingleRowStreamSqlJob extends AbstractStreamSqlJob {
     builder.append("%html\n");
     String outputText = template;
     for (int i = 0; i < latestRow.getArity(); ++i) {
-      outputText = outputText.replace("{" + i + "}", latestRow.getField(i).toString());
+      outputText = outputText.replace("{" + i + "}",
+              TableDataUtils.normalizeColumn(StringUtils.arrayAwareToString(latestRow.getField(i))));
     }
     builder.append(outputText);
     return builder.toString();
diff --git a/flink/src/main/java/org/apache/zeppelin/flink/sql/UpdateStreamSqlJob.java b/flink/src/main/java/org/apache/zeppelin/flink/sql/UpdateStreamSqlJob.java
index 65f3d86..bfcbce7 100644
--- a/flink/src/main/java/org/apache/zeppelin/flink/sql/UpdateStreamSqlJob.java
+++ b/flink/src/main/java/org/apache/zeppelin/flink/sql/UpdateStreamSqlJob.java
@@ -75,7 +75,7 @@ public class UpdateStreamSqlJob extends AbstractStreamSqlJob {
     StringBuilder builder = new StringBuilder();
     builder.append("%table\n");
     for (int i = 0; i < schema.getFieldCount(); ++i) {
-      String field = schema.getFieldName(i).get();
+      String field = schema.getFieldNames()[i];
       builder.append(field);
       if (i != (schema.getFieldCount() - 1)) {
         builder.append("\t");
@@ -84,8 +84,8 @@ public class UpdateStreamSqlJob extends AbstractStreamSqlJob {
     builder.append("\n");
     // sort it by the first column
     materializedTable.sort((r1, r2) -> {
-      String f1 = r1.getField(0).toString();
-      String f2 = r2.getField(0).toString();
+      String f1 = TableDataUtils.normalizeColumn(StringUtils.arrayAwareToString(r1.getField(0)));
+      String f2 = TableDataUtils.normalizeColumn(StringUtils.arrayAwareToString(r2.getField(0)));
       return f1.compareTo(f2);
     });
     for (Row row : materializedTable) {
diff --git a/flink/src/test/java/org/apache/zeppelin/flink/FlinkBatchSqlInterpreterTest.java b/flink/src/test/java/org/apache/zeppelin/flink/FlinkBatchSqlInterpreterTest.java
index c75d7fe..651645b 100644
--- a/flink/src/test/java/org/apache/zeppelin/flink/FlinkBatchSqlInterpreterTest.java
+++ b/flink/src/test/java/org/apache/zeppelin/flink/FlinkBatchSqlInterpreterTest.java
@@ -259,12 +259,12 @@ public class FlinkBatchSqlInterpreterTest extends SqlInterpreterTest {
                     "'format.type'='csv'\n" +
                     ");", getInterpreterContext());
     assertEquals(InterpreterResult.Code.SUCCESS, result.code());
-
+    
     // set parallelism then insert into
     InterpreterContext context = getInterpreterContext();
     result = sqlInterpreter.interpret(
             "set table.exec.resource.default-parallelism=10;" +
-            "insert into sink_table select * from source_table", context);
+                    "insert into sink_table select * from source_table", context);
     assertEquals(InterpreterResult.Code.SUCCESS, result.code());
     List<InterpreterResultMessage> resultMessages = context.out.toInterpreterResultMessage();
     assertEquals("Insertion successfully.\n", resultMessages.get(0).getData());
@@ -296,4 +296,86 @@ public class FlinkBatchSqlInterpreterTest extends SqlInterpreterTest {
     assertTrue(resultMessages.get(0).getData(),
             resultMessages.get(0).getData().contains("table.invalid_config is not a valid table/sql config"));
   }
+
+  @Test
+  public void testMultipleInsertInto() throws InterpreterException, IOException {
+    hiveShell.execute("create table source_table (id int, name string)");
+    hiveShell.execute("insert into source_table values(1, 'a'), (2, 'b')");
+
+    File destDir = Files.createTempDirectory("flink_test").toFile();
+    FileUtils.deleteDirectory(destDir);
+    InterpreterResult result = sqlInterpreter.interpret(
+            "CREATE TABLE sink_table (\n" +
+                    "id int,\n" +
+                    "name string" +
+                    ") WITH (\n" +
+                    "'format.field-delimiter'=',',\n" +
+                    "'connector.type'='filesystem',\n" +
+                    "'format.derive-schema'='true',\n" +
+                    "'connector.path'='" + destDir.getAbsolutePath() + "',\n" +
+                    "'format.type'='csv'\n" +
+                    ");", getInterpreterContext());
+    assertEquals(InterpreterResult.Code.SUCCESS, result.code());
+
+    File destDir2 = Files.createTempDirectory("flink_test").toFile();
+    FileUtils.deleteDirectory(destDir2);
+    result = sqlInterpreter.interpret(
+            "CREATE TABLE sink_table2 (\n" +
+                    "id int,\n" +
+                    "name string" +
+                    ") WITH (\n" +
+                    "'format.field-delimiter'=',',\n" +
+                    "'connector.type'='filesystem',\n" +
+                    "'format.derive-schema'='true',\n" +
+                    "'connector.path'='" + destDir2.getAbsolutePath() + "',\n" +
+                    "'format.type'='csv'\n" +
+                    ");", getInterpreterContext());
+    assertEquals(InterpreterResult.Code.SUCCESS, result.code());
+
+    // insert into
+    InterpreterContext context = getInterpreterContext();
+    result = sqlInterpreter.interpret(
+            "insert into sink_table select * from source_table;insert into sink_table2 select * from source_table", context);
+    assertEquals(InterpreterResult.Code.SUCCESS, result.code());
+    List<InterpreterResultMessage> resultMessages = context.out.toInterpreterResultMessage();
+    assertEquals("Insertion successfully.\nInsertion successfully.\n", resultMessages.get(0).getData());
+
+    // verify insert into via select from sink_table
+    context = getInterpreterContext();
+    result = sqlInterpreter.interpret("select * from sink_table", context);
+    assertEquals(InterpreterResult.Code.SUCCESS, result.code());
+    resultMessages = context.out.toInterpreterResultMessage();
+    assertEquals("id\tname\n1\ta\n2\tb\n", resultMessages.get(0).getData());
+
+    context = getInterpreterContext();
+    result = sqlInterpreter.interpret("select * from sink_table2", context);
+    assertEquals(InterpreterResult.Code.SUCCESS, result.code());
+    resultMessages = context.out.toInterpreterResultMessage();
+    assertEquals("id\tname\n1\ta\n2\tb\n", resultMessages.get(0).getData());
+
+    // insert into (runAsOne)
+    destDir.delete();
+    destDir2.delete();
+
+    context = getInterpreterContext();
+    context.getLocalProperties().put("runAsOne", "true");
+    result = sqlInterpreter.interpret(
+            "insert into sink_table select * from source_table;insert into sink_table2 select * from source_table", context);
+    assertEquals(InterpreterResult.Code.SUCCESS, result.code());
+    resultMessages = context.out.toInterpreterResultMessage();
+    assertEquals("Insertion successfully.\n", resultMessages.get(0).getData());
+
+    // verify insert into via select from sink_table
+    context = getInterpreterContext();
+    result = sqlInterpreter.interpret("select * from sink_table", context);
+    assertEquals(InterpreterResult.Code.SUCCESS, result.code());
+    resultMessages = context.out.toInterpreterResultMessage();
+    assertEquals("id\tname\n1\ta\n2\tb\n", resultMessages.get(0).getData());
+
+    context = getInterpreterContext();
+    result = sqlInterpreter.interpret("select * from sink_table2", context);
+    assertEquals(InterpreterResult.Code.SUCCESS, result.code());
+    resultMessages = context.out.toInterpreterResultMessage();
+    assertEquals("id\tname\n1\ta\n2\tb\n", resultMessages.get(0).getData());
+  }
 }
diff --git a/flink/src/test/java/org/apache/zeppelin/flink/FlinkStreamSqlInterpreterTest.java b/flink/src/test/java/org/apache/zeppelin/flink/FlinkStreamSqlInterpreterTest.java
index baa0f5e..c01dbff 100644
--- a/flink/src/test/java/org/apache/zeppelin/flink/FlinkStreamSqlInterpreterTest.java
+++ b/flink/src/test/java/org/apache/zeppelin/flink/FlinkStreamSqlInterpreterTest.java
@@ -152,6 +152,50 @@ public class FlinkStreamSqlInterpreterTest extends SqlInterpreterTest {
   }
 
   @Test
+  public void testMultipleInsertInto() throws InterpreterException, IOException {
+    hiveShell.execute("create table source_table (id int, name string)");
+
+    File destDir = Files.createTempDirectory("flink_test").toFile();
+    FileUtils.deleteDirectory(destDir);
+    InterpreterResult result = sqlInterpreter.interpret(
+            "CREATE TABLE dest_table (\n" +
+                    "id int,\n" +
+                    "name string" +
+                    ") WITH (\n" +
+                    "'format.field-delimiter'=',',\n" +
+                    "'connector.type'='filesystem',\n" +
+                    "'format.derive-schema'='true',\n" +
+                    "'connector.path'='" + destDir.getAbsolutePath() + "',\n" +
+                    "'format.type'='csv'\n" +
+                    ");", getInterpreterContext());
+
+    assertEquals(InterpreterResult.Code.SUCCESS, result.code());
+
+    File destDir2 = Files.createTempDirectory("flink_test").toFile();
+    FileUtils.deleteDirectory(destDir2);
+    result = sqlInterpreter.interpret(
+            "CREATE TABLE dest_table2 (\n" +
+                    "id int,\n" +
+                    "name string" +
+                    ") WITH (\n" +
+                    "'format.field-delimiter'=',',\n" +
+                    "'connector.type'='filesystem',\n" +
+                    "'format.derive-schema'='true',\n" +
+                    "'connector.path'='" + destDir2.getAbsolutePath() + "',\n" +
+                    "'format.type'='csv'\n" +
+                    ");", getInterpreterContext());
+    assertEquals(InterpreterResult.Code.SUCCESS, result.code());
+
+    InterpreterContext context = getInterpreterContext();
+    context.getLocalProperties().put("runAsOne", "true");
+    result = sqlInterpreter.interpret(
+            "insert into dest_table select * from source_table;insert into dest_table2 select * from source_table",
+            context);
+
+    assertEquals(InterpreterResult.Code.SUCCESS, result.code());
+  }
+
+  @Test
   public void testCreateTableWithWaterMark() throws InterpreterException, IOException {
     // create table
     InterpreterContext context = getInterpreterContext();