You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@zeppelin.apache.org by emmanuel warreng <em...@gmail.com> on 2022/07/20 17:33:52 UTC
Re: [zeppelin] branch master updated: [ZEPPELIN-5723] Remove Kylin interpreter (#4406)
Unsubscribe
On Wed, Jul 13, 2022, 18:08 <jo...@apache.org> wrote:
> This is an automated email from the ASF dual-hosted git repository.
>
> jongyoul pushed a commit to branch master
> in repository https://gitbox.apache.org/repos/asf/zeppelin.git
>
>
> The following commit(s) were added to refs/heads/master by this push:
> new f24a43f415 [ZEPPELIN-5723] Remove Kylin interpreter (#4406)
> f24a43f415 is described below
>
> commit f24a43f415696f859fc67fe8c167c66f1e796121
> Author: yaini <80...@users.noreply.github.com>
> AuthorDate: Thu Jul 14 01:07:59 2022 +0900
>
> [ZEPPELIN-5723] Remove Kylin interpreter (#4406)
> ---
> .github/workflows/core.yml | 2 +-
> .github/workflows/frontend.yml | 2 +-
> Dockerfile | 2 +-
> conf/interpreter-list | 1 -
> dev/create_release.sh | 2 +-
> docs/_includes/themes/zeppelin/_navigation.html | 1 -
> docs/index.md | 1 -
> docs/interpreter/kylin.md | 82 ------
> docs/interpreter/submarine.md | 2 +-
> docs/quickstart/sql_with_zeppelin.md | 1 -
> docs/usage/interpreter/installation.md | 5 -
> docs/usage/other_features/zeppelin_context.md | 2 +-
> kylin/pom.xml | 79 ------
> .../apache/zeppelin/kylin/KylinErrorResponse.java | 62 -----
> .../apache/zeppelin/kylin/KylinInterpreter.java | 237 -----------------
> kylin/src/main/resources/interpreter-setting.json | 63 -----
> .../zeppelin/kylin/KylinInterpreterTest.java | 295
> ---------------------
> pom.xml | 1 -
> zeppelin-distribution/src/bin_license/LICENSE | 1 -
> 19 files changed, 6 insertions(+), 835 deletions(-)
>
> diff --git a/.github/workflows/core.yml b/.github/workflows/core.yml
> index aceaf9fa11..4b3e42a369 100644
> --- a/.github/workflows/core.yml
> +++ b/.github/workflows/core.yml
> @@ -82,7 +82,7 @@ jobs:
> interpreter-test-non-core:
> runs-on: ubuntu-20.04
> env:
> - INTERPRETERS:
> 'beam,hbase,pig,jdbc,file,flink-cmd,ignite,kylin,cassandra,elasticsearch,bigquery,alluxio,scio,livy,groovy,sap,java,geode,neo4j,hazelcastjet,submarine,sparql,mongodb,influxdb,ksql,scalding'
> + INTERPRETERS:
> 'beam,hbase,pig,jdbc,file,flink-cmd,ignite,cassandra,elasticsearch,bigquery,alluxio,scio,livy,groovy,sap,java,geode,neo4j,hazelcastjet,submarine,sparql,mongodb,influxdb,ksql,scalding'
> steps:
> - name: Checkout
> uses: actions/checkout@v2
> diff --git a/.github/workflows/frontend.yml
> b/.github/workflows/frontend.yml
> index 34cdef2b0f..11624c66b9 100644
> --- a/.github/workflows/frontend.yml
> +++ b/.github/workflows/frontend.yml
> @@ -19,7 +19,7 @@ env:
> SPARK_PRINT_LAUNCH_COMMAND: "true"
> SPARK_LOCAL_IP: 127.0.0.1
> ZEPPELIN_LOCAL_IP: 127.0.0.1
> - INTERPRETERS:
> '!beam,!hbase,!pig,!jdbc,!file,!flink,!ignite,!kylin,!cassandra,!elasticsearch,!bigquery,!alluxio,!scio,!livy,!groovy,!sap,!java,!geode,!neo4j,!hazelcastjet,!submarine,!sparql,!mongodb'
> + INTERPRETERS:
> '!beam,!hbase,!pig,!jdbc,!file,!flink,!ignite,!cassandra,!elasticsearch,!bigquery,!alluxio,!scio,!livy,!groovy,!sap,!java,!geode,!neo4j,!hazelcastjet,!submarine,!sparql,!mongodb'
>
> jobs:
> run-e2e-tests-in-zeppelin-web:
> diff --git a/Dockerfile b/Dockerfile
> index 431b89c8cb..2aef45aa86 100644
> --- a/Dockerfile
> +++ b/Dockerfile
> @@ -23,7 +23,7 @@ RUN echo "unsafe-perm=true" > ~/.npmrc && \
> echo '{ "allow_root": true }' > ~/.bowerrc && \
> ./mvnw -B package -DskipTests -Pbuild-distr -Pspark-3.2
> -Pinclude-hadoop -Phadoop3 -Pspark-scala-2.12 -Pweb-angular && \
> # Example with doesn't compile all interpreters
> - # ./mvnw -B package -DskipTests -Pbuild-distr -Pspark-3.2
> -Pinclude-hadoop -Phadoop3 -Pspark-scala-2.12 -Pweb-angular -pl
> '!groovy,!submarine,!livy,!hbase,!pig,!file,!flink,!ignite,!kylin' && \
> + # ./mvnw -B package -DskipTests -Pbuild-distr -Pspark-3.2
> -Pinclude-hadoop -Phadoop3 -Pspark-scala-2.12 -Pweb-angular -pl
> '!groovy,!submarine,!livy,!hbase,!pig,!file,!flink,!ignite' && \
> mv
> /workspace/zeppelin/zeppelin-distribution/target/zeppelin-*/zeppelin-*
> /opt/zeppelin/ && \
> # Removing stuff saves time, because docker creates a temporary layer
> rm -rf ~/.m2 && \
> diff --git a/conf/interpreter-list b/conf/interpreter-list
> index c5e1dd8045..76584969c0 100644
> --- a/conf/interpreter-list
> +++ b/conf/interpreter-list
> @@ -33,7 +33,6 @@ ignite
> org.apache.zeppelin:zeppelin-ignite:0.10.0 Ignite
> java org.apache.zeppelin:zeppelin-java:0.10.0
> Java interpreter
> jdbc org.apache.zeppelin:zeppelin-jdbc:0.10.0
> Jdbc interpreter
> kotlin org.apache.zeppelin:zeppelin-kotlin:0.10.0
> Kotlin interpreter
> -kylin org.apache.zeppelin:zeppelin-kylin:0.10.0
> Kylin interpreter
> livy org.apache.zeppelin:zeppelin-livy:0.10.0
> Livy interpreter
> md org.apache.zeppelin:zeppelin-markdown:0.10.0
> Markdown support
> neo4j org.apache.zeppelin:zeppelin-neo4j:0.10.0
> Neo4j interpreter
> diff --git a/dev/create_release.sh b/dev/create_release.sh
> index 1f0c7ba6d9..a3bef0d1d5 100755
> --- a/dev/create_release.sh
> +++ b/dev/create_release.sh
> @@ -97,7 +97,7 @@ function make_binary_release() {
>
> git_clone
> make_source_package
> -make_binary_release netinst "-Pweb-angular -Phadoop-2.6 -pl
> !beam,!hbase,!pig,!jdbc,!file,!flink,!ignite,!kylin,!cassandra,!elasticsearch,!bigquery,!alluxio,!scio,!livy,!groovy,!sap,!java,!geode,!neo4j,!hazelcastjet,!submarine,!sparql,!mongodb,!ksql,!scalding
> -am"
> +make_binary_release netinst "-Pweb-angular -Phadoop-2.6 -pl
> !beam,!hbase,!pig,!jdbc,!file,!flink,!ignite,!cassandra,!elasticsearch,!bigquery,!alluxio,!scio,!livy,!groovy,!sap,!java,!geode,!neo4j,!hazelcastjet,!submarine,!sparql,!mongodb,!ksql,!scalding
> -am"
> make_binary_release all "-Pweb-angular -Phadoop-2.6"
>
> # remove non release files and dirs
> diff --git a/docs/_includes/themes/zeppelin/_navigation.html
> b/docs/_includes/themes/zeppelin/_navigation.html
> index f7d8e08ae8..205e8fc7fc 100644
> --- a/docs/_includes/themes/zeppelin/_navigation.html
> +++ b/docs/_includes/themes/zeppelin/_navigation.html
> @@ -155,7 +155,6 @@
> <li><a
> href="{{BASE_PATH}}/interpreter/jupyter.html">Jupyter</a></li>
> <li><a
> href="{{BASE_PATH}}/interpreter/kotlin.html">Kotlin</a></li>
> <li><a
> href="{{BASE_PATH}}/interpreter/ksql.html">KSQL</a></li>
> - <li><a
> href="{{BASE_PATH}}/interpreter/kylin.html">Kylin</a></li>
> <li><a
> href="{{BASE_PATH}}/interpreter/livy.html">Livy</a></li>
> <li><a
> href="{{BASE_PATH}}/interpreter/mahout.html">Mahout</a></li>
> <li><a
> href="{{BASE_PATH}}/interpreter/markdown.html">Markdown</a></li>
> diff --git a/docs/index.md b/docs/index.md
> index 0b0cb8f41b..d955496160 100644
> --- a/docs/index.md
> +++ b/docs/index.md
> @@ -153,7 +153,6 @@ limitations under the License.
> * [Jupyter](./interpreter/jupyter.html)
> * [Kotlin](./interpreter/kotlin.html)
> * [KSQL](./interpreter/ksql.html)
> - * [Kylin](./interpreter/kylin.html)
> * [Livy](./interpreter/livy.html)
> * [Mahout](./interpreter/mahout.html)
> * [Markdown](./interpreter/markdown.html)
> diff --git a/docs/interpreter/kylin.md b/docs/interpreter/kylin.md
> deleted file mode 100644
> index 1f2b0f3ab4..0000000000
> --- a/docs/interpreter/kylin.md
> +++ /dev/null
> @@ -1,82 +0,0 @@
> ----
> -layout: page
> -title: "Apache Kylin Interpreter for Apache Zeppelin"
> -description: "Apache Kylin™ is an open source Distributed Analytics
> Engine designed to provide SQL interface and multi-dimensional analysis
> (OLAP) on Hadoop supporting extremely large datasets, original contributed
> from eBay Inc.
> -."
> -group: interpreter
> ----
> -<!--
> -Licensed under the Apache License, Version 2.0 (the "License");
> -you may not use this file except in compliance with the License.
> -You may obtain a copy of the License at
> -
> -http://www.apache.org/licenses/LICENSE-2.0
> -
> -Unless required by applicable law or agreed to in writing, software
> -distributed under the License is distributed on an "AS IS" BASIS,
> -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> -See the License for the specific language governing permissions and
> -limitations under the License.
> --->
> -{% include JB/setup %}
> -
> -# Apache Kylin Interpreter for Apache Zeppelin
> -
> -<div id="toc"></div>
> -
> -## Overview
> -[Apache Kylin](https://kylin.apache.org/) is an open source Distributed
> Analytics Engine designed to provide SQL interface and multi-dimensional
> analysis (OLAP) on Hadoop supporting extremely large datasets, original
> contributed from eBay Inc. The interpreter assumes that Apache Kylin has
> been installed and you can connect to Apache Kylin from the machine Apache
> Zeppelin is installed.
> -To get start with Apache Kylin, please see [Apache Kylin Quickstart](
> https://kylin.apache.org/docs15/index.html).
> -
> -## Configuration
> -<table class="table-configuration">
> - <tr>
> - <th>Name</th>
> - <th>Default</th>
> - <th>Description</th>
> - </tr>
> - <tr>
> - <td>kylin.api.url </td>
> - <td>http://localhost:7070/kylin/api/query</td>
> - <td>kylin query POST API <br/> The format can be like http://
> <host>:<port>/kylin/api/query</td>
> - </tr>
> - <tr>
> - <td>kylin.api.user</td>
> - <td>ADMIN</td>
> - <td>kylin user</td>
> - </tr>
> - <tr>
> - <td>kylin.api.password</td>
> - <td>KYLIN</td>
> - <td>kylin password</td>
> - </tr>
> - <tr>
> - <td>kylin.query.project</td>
> - <td>learn_kylin</td>
> - <td>String, Project to perform query. Could update at notebook
> level</td>
> - </tr>
> - <tr>
> - <td>kylin.query.ispartial</td>
> - <td>true</td>
> - <td>true|false <br/> (@Deprecated since Apache Kylin V1.5) <br/>
> Whether accept a partial result or not, default be “false”. Set to “false”
> for production use.</td>
> - </tr>
> - <tr>
> - <td>kylin.query.limit</td>
> - <td>5000</td>
> - <td>int, Query limit <br/> If limit is set in sql, perPage will be
> ignored.</td>
> - </tr>
> - <tr>
> - <td>kylin.query.offset</td>
> - <td>0</td>
> - <td>int, Query offset <br/> If offset is set in sql, curIndex will be
> ignored.</td>
> - </tr>
> -</table>
> -
> -## Using the Apache Kylin Interpreter
> -In a paragraph, use `%kylin(project_name)` to select the **kylin**
> interpreter, **project name** and then input **sql**. If no project name
> defined, will use the default project name from the above configuration.
> -
> -```sql
> -%kylin(learn_project)
> -select count(*) from kylin_sales group by part_dt
> -```
> -
> diff --git a/docs/interpreter/submarine.md b/docs/interpreter/submarine.md
> index 97be1bb7e0..cfad6255fc 100644
> --- a/docs/interpreter/submarine.md
> +++ b/docs/interpreter/submarine.md
> @@ -27,7 +27,7 @@ limitations under the License.
>
> A deep learning algorithm project requires data acquisition, data
> processing, data cleaning, interactive visual programming adjustment
> parameters, algorithm testing, algorithm publishing, algorithm job
> scheduling, offline model training, model online services and many other
> processes and processes. Zeppelin is a web-based notebook that supports
> interactive data analysis. You can use SQL, Scala, Python, etc. to make
> data-driven, interactive, collaborative documents.
>
> -You can use the more than 20 interpreters in zeppelin (for example:
> spark, hive, Cassandra, Elasticsearch, Kylin, HBase, etc.) to collect data,
> clean data, feature extraction, etc. in the data in Hadoop before
> completing the machine learning model training. The data preprocessing
> process.
> +You can use the more than 20 interpreters in zeppelin (for example:
> spark, hive, Cassandra, Elasticsearch, HBase, etc.) to collect data, clean
> data, feature extraction, etc. in the data in Hadoop before completing the
> machine learning model training. The data preprocessing process.
>
> By integrating submarine in zeppelin, we use zeppelin's data discovery,
> data analysis and data visualization and collaboration capabilities to
> visualize the results of algorithm development and parameter adjustment
> during machine learning model training.
>
> diff --git a/docs/quickstart/sql_with_zeppelin.md
> b/docs/quickstart/sql_with_zeppelin.md
> index da709d5b94..39d57291a3 100644
> --- a/docs/quickstart/sql_with_zeppelin.md
> +++ b/docs/quickstart/sql_with_zeppelin.md
> @@ -63,7 +63,6 @@ For the further information about SQL support in
> Zeppelin, please check
> - [Flink Interpreter](../interpreter/flink.html)
> - [Python Interpreter](../interpreter/python.html)
> - [IgniteSQL
> Interpreter](../interpreter/ignite.html#ignite-sql-interpreter) for [Apache
> Ignite](https://ignite.apache.org/)
> -- [Kylin Interpreter](../interpreter/kylin.html) for [Apache Kylin](
> http://kylin.apache.org/)
>
>
>
> diff --git a/docs/usage/interpreter/installation.md
> b/docs/usage/interpreter/installation.md
> index 3aec553c17..2e26b19896 100644
> --- a/docs/usage/interpreter/installation.md
> +++ b/docs/usage/interpreter/installation.md
> @@ -193,11 +193,6 @@ You can also find the below community managed
> interpreter list in `conf/interpre
> <td>org.apache.zeppelin:zeppelin-kotlin:0.7.0</td>
> <td>Kotlin interpreter</td>
> </tr>
> - <tr>
> - <td>kylin</td>
> - <td>org.apache.zeppelin:zeppelin-kylin:0.10.0</td>
> - <td>Kylin interpreter</td>
> - </tr>
> <tr>
> <td>livy</td>
> <td>org.apache.zeppelin:zeppelin-livy:0.10.0</td>
> diff --git a/docs/usage/other_features/zeppelin_context.md
> b/docs/usage/other_features/zeppelin_context.md
> index 7b251719c3..784e1f34b8 100644
> --- a/docs/usage/other_features/zeppelin_context.md
> +++ b/docs/usage/other_features/zeppelin_context.md
> @@ -235,7 +235,7 @@ dynamic-forms and object-interpolation as described
> below.
>
> | Interpreters that use Embedded Commands |
> |-------------------------------------------------------------------|
> -|spark.sql (\*), bigquery, cassandra, elasticsearch, file, hbase, ignite,
> jdbc (\*), kylin, livy, markdown, neo4j, pig, python, shell (\*), zengine |
> +|spark.sql (\*), bigquery, cassandra, elasticsearch, file, hbase, ignite,
> jdbc (\*), livy, markdown, neo4j, pig, python, shell (\*), zengine |
>
> Dynamic forms are available in all of the interpreters in the table
> above,
> but object interpolation is only available in a small, but growing, list
> of interpreters
> diff --git a/kylin/pom.xml b/kylin/pom.xml
> deleted file mode 100644
> index e21a6892ed..0000000000
> --- a/kylin/pom.xml
> +++ /dev/null
> @@ -1,79 +0,0 @@
> -<?xml version="1.0" encoding="UTF-8"?>
> -<!--
> - ~ Licensed to the Apache Software Foundation (ASF) under one or more
> - ~ contributor license agreements. See the NOTICE file distributed with
> - ~ this work for additional information regarding copyright ownership.
> - ~ The ASF licenses this file to You under the Apache License, Version
> 2.0
> - ~ (the "License"); you may not use this file except in compliance with
> - ~ the License. You may obtain a copy of the License at
> - ~
> - ~ http://www.apache.org/licenses/LICENSE-2.0
> - ~
> - ~ Unless required by applicable law or agreed to in writing, software
> - ~ distributed under the License is distributed on an "AS IS" BASIS,
> - ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> - ~ See the License for the specific language governing permissions and
> - ~ limitations under the License.
> - -->
> -
> -
> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="
> http://www.w3.org/2001/XMLSchema-instance"
> - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
> https://maven.apache.org/xsd/maven-4.0.0.xsd">
> - <modelVersion>4.0.0</modelVersion>
> -
> - <parent>
> - <artifactId>zeppelin-interpreter-parent</artifactId>
> - <groupId>org.apache.zeppelin</groupId>
> - <version>0.11.0-SNAPSHOT</version>
> -
> <relativePath>../zeppelin-interpreter-parent/pom.xml</relativePath>
> - </parent>
> -
> - <artifactId>zeppelin-kylin</artifactId>
> - <packaging>jar</packaging>
> - <name>Zeppelin: Kylin interpreter</name>
> -
> - <properties>
> - <interpreter.name>kylin</interpreter.name>
> - </properties>
> -
> - <dependencies>
> - <dependency>
> - <groupId>com.google.code.gson</groupId>
> - <artifactId>gson</artifactId>
> - </dependency>
> -
> - <dependency>
> - <groupId>org.apache.httpcomponents</groupId>
> - <artifactId>httpclient</artifactId>
> - </dependency>
> - <dependency>
> - <groupId>commons-codec</groupId>
> - <artifactId>commons-codec</artifactId>
> - </dependency>
> - <dependency>
> - <groupId>commons-io</groupId>
> - <artifactId>commons-io</artifactId>
> - </dependency>
> - </dependencies>
> -
> - <build>
> - <plugins>
> - <plugin>
> - <artifactId>maven-enforcer-plugin</artifactId>
> - </plugin>
> - <plugin>
> - <artifactId>maven-resources-plugin</artifactId>
> - </plugin>
> - <plugin>
> - <artifactId>maven-shade-plugin</artifactId>
> - </plugin>
> - <plugin>
> - <groupId>org.apache.maven.plugins</groupId>
> - <artifactId>maven-checkstyle-plugin</artifactId>
> - <configuration>
> - <skip>false</skip>
> - </configuration>
> - </plugin>
> - </plugins>
> - </build>
> -</project>
> diff --git
> a/kylin/src/main/java/org/apache/zeppelin/kylin/KylinErrorResponse.java
> b/kylin/src/main/java/org/apache/zeppelin/kylin/KylinErrorResponse.java
> deleted file mode 100644
> index 04d04797cc..0000000000
> --- a/kylin/src/main/java/org/apache/zeppelin/kylin/KylinErrorResponse.java
> +++ /dev/null
> @@ -1,62 +0,0 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements. See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You under the Apache License, Version 2.0
> - * (the "License"); you may not use this file except in compliance with
> - * the License. You may obtain a copy of the License at
> - *
> - * http://www.apache.org/licenses/LICENSE-2.0
> - *
> - * Unless required by applicable law or agreed to in writing, software
> - * distributed under the License is distributed on an "AS IS" BASIS,
> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> - * See the License for the specific language governing permissions and
> - * limitations under the License.
> - */
> -
> -package org.apache.zeppelin.kylin;
> -
> -import com.google.gson.Gson;
> -import com.google.gson.JsonSyntaxException;
> -import org.apache.zeppelin.common.JsonSerializable;
> -
> -/**
> - * class for Kylin Error Response.
> - */
> -class KylinErrorResponse implements JsonSerializable {
> - private static final Gson gson = new Gson();
> -
> - private String stacktrace;
> - private String exception;
> - private String url;
> - private String code;
> - private Object data;
> - private String msg;
> -
> - KylinErrorResponse(String stacktrace, String exception, String url,
> - String code, Object data, String msg) {
> - this.stacktrace = stacktrace;
> - this.exception = exception;
> - this.url = url;
> - this.code = code;
> - this.data = data;
> - this.msg = msg;
> - }
> -
> - public String getException() {
> - return exception;
> - }
> -
> - public String toJson() {
> - return gson.toJson(this);
> - }
> -
> - public static KylinErrorResponse fromJson(String json) {
> - try {
> - return gson.fromJson(json, KylinErrorResponse.class);
> - } catch (JsonSyntaxException ex) {
> - return null;
> - }
> - }
> -}
> diff --git
> a/kylin/src/main/java/org/apache/zeppelin/kylin/KylinInterpreter.java
> b/kylin/src/main/java/org/apache/zeppelin/kylin/KylinInterpreter.java
> deleted file mode 100755
> index 444f5cbc28..0000000000
> --- a/kylin/src/main/java/org/apache/zeppelin/kylin/KylinInterpreter.java
> +++ /dev/null
> @@ -1,237 +0,0 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements. See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You under the Apache License, Version 2.0
> - * (the "License"); you may not use this file except in compliance with
> - * the License. You may obtain a copy of the License at
> - *
> - * http://www.apache.org/licenses/LICENSE-2.0
> - *
> - * Unless required by applicable law or agreed to in writing, software
> - * distributed under the License is distributed on an "AS IS" BASIS,
> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> - * See the License for the specific language governing permissions and
> - * limitations under the License.
> - */
> -
> -package org.apache.zeppelin.kylin;
> -
> -import org.apache.commons.codec.binary.Base64;
> -import org.apache.commons.io.IOUtils;
> -import org.apache.http.HttpResponse;
> -import org.apache.http.client.HttpClient;
> -import org.apache.http.client.methods.HttpPost;
> -import org.apache.http.entity.StringEntity;
> -import org.apache.http.impl.client.HttpClientBuilder;
> -import org.slf4j.Logger;
> -import org.slf4j.LoggerFactory;
> -
> -import java.io.IOException;
> -import java.util.List;
> -import java.util.Properties;
> -import java.util.regex.Matcher;
> -import java.util.regex.Pattern;
> -
> -import org.apache.zeppelin.interpreter.Interpreter;
> -import org.apache.zeppelin.interpreter.InterpreterContext;
> -import org.apache.zeppelin.interpreter.InterpreterResult;
> -import org.apache.zeppelin.interpreter.thrift.InterpreterCompletion;
> -
> -/**
> - * Kylin interpreter for Zeppelin. (http://kylin.apache.org)
> - */
> -public class KylinInterpreter extends Interpreter {
> - Logger logger = LoggerFactory.getLogger(KylinInterpreter.class);
> -
> - static final String KYLIN_QUERY_API_URL = "kylin.api.url";
> - static final String KYLIN_USERNAME = "kylin.api.user";
> - static final String KYLIN_PASSWORD = "kylin.api.password";
> - static final String KYLIN_QUERY_PROJECT = "kylin.query.project";
> - static final String KYLIN_QUERY_OFFSET = "kylin.query.offset";
> - static final String KYLIN_QUERY_LIMIT = "kylin.query.limit";
> - static final String KYLIN_QUERY_ACCEPT_PARTIAL =
> "kylin.query.ispartial";
> - static final Pattern KYLIN_TABLE_FORMAT_REGEX_LABEL =
> Pattern.compile("\"label\":\"(.*?)\"");
> - static final Pattern KYLIN_TABLE_FORMAT_REGEX_RESULTS =
> - Pattern.compile("\"results\":\\[\\[(.*?)]]");
> -
> - public KylinInterpreter(Properties property) {
> - super(property);
> - }
> -
> - @Override
> - public void open() {
> -
> - }
> -
> - @Override
> - public void close() {
> -
> - }
> -
> - @Override
> - public InterpreterResult interpret(String st, InterpreterContext
> context) {
> - try {
> - return executeQuery(st);
> - } catch (IOException e) {
> - logger.error("failed to query data in kylin ", e);
> - return new InterpreterResult(InterpreterResult.Code.ERROR,
> e.getMessage());
> - }
> - }
> -
> - @Override
> - public void cancel(InterpreterContext context) {
> -
> - }
> -
> - @Override
> - public FormType getFormType() {
> - return FormType.SIMPLE;
> - }
> -
> - @Override
> - public int getProgress(InterpreterContext context) {
> - return 0;
> - }
> -
> - @Override
> - public List<InterpreterCompletion> completion(String buf, int cursor,
> - InterpreterContext interpreterContext) {
> - return null;
> - }
> -
> - public HttpResponse prepareRequest(String sql) throws IOException {
> - String kylinProject = getProject(sql);
> - String kylinSql = getSQL(sql);
> -
> - logger.info("project:" + kylinProject);
> - logger.info("sql:" + kylinSql);
> - logger.info("acceptPartial:" +
> getProperty(KYLIN_QUERY_ACCEPT_PARTIAL));
> - logger.info("limit:" + getProperty(KYLIN_QUERY_LIMIT));
> - logger.info("offset:" + getProperty(KYLIN_QUERY_OFFSET));
> - byte[] encodeBytes = Base64.encodeBase64(new
> String(getProperty(KYLIN_USERNAME)
> - + ":" + getProperty(KYLIN_PASSWORD)).getBytes("UTF-8"));
> -
> - String postContent = new String("{\"project\":" + "\"" + kylinProject
> + "\""
> - + "," + "\"sql\":" + "\"" + kylinSql + "\""
> - + "," + "\"acceptPartial\":" + "\"" +
> getProperty(KYLIN_QUERY_ACCEPT_PARTIAL) + "\""
> - + "," + "\"offset\":" + "\"" + getProperty(KYLIN_QUERY_OFFSET) +
> "\""
> - + "," + "\"limit\":" + "\"" + getProperty(KYLIN_QUERY_LIMIT) +
> "\"" + "}");
> - logger.info("post:" + postContent);
> - postContent = postContent.replaceAll("[\u0000-\u001f]", " ");
> - StringEntity entity = new StringEntity(postContent, "UTF-8");
> - entity.setContentType("application/json; charset=UTF-8");
> -
> - logger.info("post url:" + getProperty(KYLIN_QUERY_API_URL));
> -
> - HttpPost postRequest = new HttpPost(getProperty(KYLIN_QUERY_API_URL));
> - postRequest.setEntity(entity);
> - postRequest.addHeader("Authorization", "Basic " + new
> String(encodeBytes));
> - postRequest.addHeader("Accept-Encoding", "UTF-8");
> -
> - HttpClient httpClient = HttpClientBuilder.create().build();
> - return httpClient.execute(postRequest);
> - }
> -
> - public String getProject(String cmd) {
> - boolean isFirstLineProject = cmd.startsWith("(");
> -
> - if (isFirstLineProject) {
> - int projectStartIndex = cmd.indexOf("(");
> - int projectEndIndex = cmd.indexOf(")");
> - if (projectStartIndex != -1 && projectEndIndex != -1) {
> - return cmd.substring(projectStartIndex + 1, projectEndIndex);
> - } else {
> - return getProperty(KYLIN_QUERY_PROJECT);
> - }
> - } else {
> - return getProperty(KYLIN_QUERY_PROJECT);
> - }
> - }
> -
> - public String getSQL(String cmd) {
> - boolean isFirstLineProject = cmd.startsWith("(");
> -
> - if (isFirstLineProject) {
> - int projectStartIndex = cmd.indexOf("(");
> - int projectEndIndex = cmd.indexOf(")");
> - if (projectStartIndex != -1 && projectEndIndex != -1) {
> - return cmd.substring(projectEndIndex + 1);
> - } else {
> - return cmd;
> - }
> - } else {
> - return cmd;
> - }
> - }
> -
> - private InterpreterResult executeQuery(String sql) throws IOException {
> - HttpResponse response = prepareRequest(sql);
> - String result;
> -
> - try {
> - int code = response.getStatusLine().getStatusCode();
> - result = IOUtils.toString(response.getEntity().getContent(),
> "UTF-8");
> -
> - if (code != 200) {
> - StringBuilder errorMessage = new StringBuilder("Failed : HTTP
> error code " + code + " .");
> - logger.error("Failed to execute query: " + result);
> -
> - KylinErrorResponse kylinErrorResponse =
> KylinErrorResponse.fromJson(result);
> - if (kylinErrorResponse == null) {
> - logger.error("Cannot get json from string: " + result);
> - // when code is 401, the response is html, not json
> - if (code == 401) {
> - errorMessage.append(" Error message: Unauthorized. This
> request requires "
> - + "HTTP authentication. Please make sure your have set
> your credentials "
> - + "correctly.");
> - } else {
> - errorMessage.append(" Error message: " + result + " .");
> - }
> - } else {
> - String exception = kylinErrorResponse.getException();
> - logger.error("The exception is " + exception);
> - errorMessage.append(" Error message: " + exception + " .");
> - }
> -
> - return new InterpreterResult(InterpreterResult.Code.ERROR,
> errorMessage.toString());
> - }
> - } catch (NullPointerException | IOException e) {
> - throw new IOException(e);
> - }
> -
> - return new InterpreterResult(InterpreterResult.Code.SUCCESS,
> - formatResult(result));
> - }
> -
> - String formatResult(String msg) {
> - StringBuilder res = new StringBuilder("%table ");
> -
> - Matcher ml = KYLIN_TABLE_FORMAT_REGEX_LABEL.matcher(msg);
> - while (!ml.hitEnd() && ml.find()) {
> - res.append(ml.group(1) + " \t");
> - }
> - res.append(" \n");
> -
> - Matcher mr = KYLIN_TABLE_FORMAT_REGEX_RESULTS.matcher(msg);
> - String table = null;
> - while (!mr.hitEnd() && mr.find()) {
> - table = mr.group(1);
> - }
> -
> - if (table != null && !table.isEmpty()) {
> - String[] row = table.split("],\\[");
> - for (int i = 0; i < row.length; i++) {
> - String[] col = row[i].split(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)",
> -1);
> - for (int j = 0; j < col.length; j++) {
> - if (col[j] != null) {
> - col[j] = col[j].replaceAll("^\"|\"$", "");
> - }
> - res.append(col[j] + " \t");
> - }
> - res.append(" \n");
> - }
> - }
> - return res.toString();
> - }
> -}
> diff --git a/kylin/src/main/resources/interpreter-setting.json
> b/kylin/src/main/resources/interpreter-setting.json
> deleted file mode 100644
> index 88cf369692..0000000000
> --- a/kylin/src/main/resources/interpreter-setting.json
> +++ /dev/null
> @@ -1,63 +0,0 @@
> -[
> - {
> - "group": "kylin",
> - "name": "kylin",
> - "className": "org.apache.zeppelin.kylin.KylinInterpreter",
> - "properties": {
> - "kylin.api.url": {
> - "envName": null,
> - "propertyName": "kylin.api.url",
> - "defaultValue": "http://localhost:7070/kylin/api/query",
> - "description": "Kylin API",
> - "type": "url"
> - },
> - "kylin.api.user": {
> - "envName": null,
> - "propertyName": "kylin.api.user",
> - "defaultValue": "ADMIN",
> - "description": "Kylin username",
> - "type": "string"
> - },
> - "kylin.api.password": {
> - "envName": null,
> - "propertyName": "kylin.api.password",
> - "defaultValue": "KYLIN",
> - "description": "Kylin password",
> - "type": "password"
> - },
> - "kylin.query.project": {
> - "envName": null,
> - "propertyName": "kylin.query.project",
> - "defaultValue": "learn_kylin",
> - "description": "Default Kylin project name",
> - "type": "textarea"
> - },
> - "kylin.query.offset": {
> - "envName": null,
> - "propertyName": "kylin.query.offset",
> - "defaultValue": "0",
> - "description": "Kylin query offset",
> - "type": "number"
> - },
> - "kylin.query.limit": {
> - "envName": null,
> - "propertyName": "kylin.query.limit",
> - "defaultValue": "5000",
> - "description": "Kylin query limit",
> - "type": "number"
> - },
> - "kylin.query.ispartial": {
> - "envName": null,
> - "propertyName": "kylin.query.ispartial",
> - "defaultValue": true,
> - "description": "Kylin query partial flag, deprecated",
> - "type": "checkbox"
> - }
> - },
> - "editor": {
> - "language": "sql",
> - "editOnDblClick": false,
> - "completionSupport": true
> - }
> - }
> -]
> diff --git
> a/kylin/src/test/java/org/apache/zeppelin/kylin/KylinInterpreterTest.java
> b/kylin/src/test/java/org/apache/zeppelin/kylin/KylinInterpreterTest.java
> deleted file mode 100755
> index 66b6f9afb3..0000000000
> ---
> a/kylin/src/test/java/org/apache/zeppelin/kylin/KylinInterpreterTest.java
> +++ /dev/null
> @@ -1,295 +0,0 @@
> -/*
> - * Licensed to the Apache Software Foundation (ASF) under one or more
> - * contributor license agreements. See the NOTICE file distributed with
> - * this work for additional information regarding copyright ownership.
> - * The ASF licenses this file to You under the Apache License, Version 2.0
> - * (the "License"); you may not use this file except in compliance with
> - * the License. You may obtain a copy of the License at
> - *
> - * http://www.apache.org/licenses/LICENSE-2.0
> - *
> - * Unless required by applicable law or agreed to in writing, software
> - * distributed under the License is distributed on an "AS IS" BASIS,
> - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> - * See the License for the specific language governing permissions and
> - * limitations under the License.
> - */
> -
> -package org.apache.zeppelin.kylin;
> -
> -import static org.junit.Assert.assertEquals;
> -
> -import org.apache.http.Header;
> -import org.apache.http.HttpEntity;
> -import org.apache.http.HttpResponse;
> -import org.apache.http.ProtocolVersion;
> -import org.apache.http.StatusLine;
> -import org.apache.http.client.methods.HttpPost;
> -import org.apache.http.message.AbstractHttpMessage;
> -import org.junit.Assert;
> -import org.junit.BeforeClass;
> -import org.junit.Test;
> -
> -import java.io.ByteArrayInputStream;
> -import java.io.IOException;
> -import java.io.InputStream;
> -import java.io.OutputStream;
> -import java.util.Locale;
> -import java.util.Properties;
> -
> -import org.apache.zeppelin.interpreter.InterpreterResult;
> -
> -public class KylinInterpreterTest {
> - static final Properties KYLIN_PROPERTIES = new Properties();
> -
> - @BeforeClass
> - public static void setUpClass() {
> - KYLIN_PROPERTIES.put("kylin.api.url", "
> http://localhost:7070/kylin/api/query");
> - KYLIN_PROPERTIES.put("kylin.api.user", "ADMIN");
> - KYLIN_PROPERTIES.put("kylin.api.password", "KYLIN");
> - KYLIN_PROPERTIES.put("kylin.query.project", "default");
> - KYLIN_PROPERTIES.put("kylin.query.offset", "0");
> - KYLIN_PROPERTIES.put("kylin.query.limit", "5000");
> - KYLIN_PROPERTIES.put("kylin.query.ispartial", "true");
> - }
> -
> - @Test
> - public void testWithDefault() {
> - KylinInterpreter t = new MockKylinInterpreter(getDefaultProperties());
> - InterpreterResult result = t.interpret(
> - "select a.date,sum(b.measure) as measure from kylin_fact_table a
> " +
> - "inner join kylin_lookup_table b on a.date=b.date group by
> a.date", null);
> - assertEquals("default", t.getProject("select a.date,sum(b.measure) as
> measure "
> - + "from kylin_fact_table a inner join kylin_lookup_table b on
> a.date=b.date "
> - + "group by a.date"));
> - assertEquals(InterpreterResult.Type.TABLE,
> result.message().get(0).getType());
> - }
> -
> - @Test
> - public void testWithProject() {
> - KylinInterpreter t = new MockKylinInterpreter(getDefaultProperties());
> - assertEquals("project2", t.getProject("(project2)\n select
> a.date,sum(b.measure) "
> - + "as measure from kylin_fact_table a inner join
> kylin_lookup_table b on "
> - + "a.date=b.date group by a.date"));
> - assertEquals("", t.getProject("()\n select a.date,sum(b.measure) as
> measure "
> - + "from kylin_fact_table a inner join kylin_lookup_table b on
> a.date=b.date "
> - + "group by a.date"));
> - assertEquals("\n select a.date,sum(b.measure) as measure from
> kylin_fact_table a "
> - + "inner join kylin_lookup_table b on a.date=b.date group by
> a.date",
> - t.getSQL("(project2)\n select a.date,sum(b.measure) as
> measure "
> - + "from kylin_fact_table a inner join
> kylin_lookup_table b on a.date=b.date "
> - + "group by a.date"));
> - assertEquals("\n select a.date,sum(b.measure) as measure from
> kylin_fact_table a "
> - + "inner join kylin_lookup_table b on a.date=b.date group by
> a.date",
> - t.getSQL("()\n select a.date,sum(b.measure) as measure from
> kylin_fact_table a "
> - + "inner join kylin_lookup_table b on a.date=b.date
> group by a.date"));
> - }
> -
> - @Test
> - public void testParseResult() {
> - String msg =
> "{\"columnMetas\":[{\"isNullable\":1,\"displaySize\":256,\"label\":\"COUNTRY\","
> - +
> "\"name\":\"COUNTRY\",\"schemaName\":\"DEFAULT\",\"catelogName\":null,"
> - +
> "\"tableName\":\"SALES_TABLE\",\"precision\":256,\"scale\":0,\"columnType\":12,"
> - +
> "\"columnTypeName\":\"VARCHAR\",\"writable\":false,\"readOnly\":true,"
> - +
> "\"definitelyWritable\":false,\"autoIncrement\":false,\"caseSensitive\":true,"
> - +
> "\"searchable\":false,\"currency\":false,\"signed\":true},{\"isNullable\":1,"
> - +
> "\"displaySize\":256,\"label\":\"CURRENCY\",\"name\":\"CURRENCY\","
> - +
> "\"schemaName\":\"DEFAULT\",\"catelogName\":null,\"tableName\":\"SALES_TABLE\","
> - +
> "\"precision\":256,\"scale\":0,\"columnType\":12,\"columnTypeName\":\"VARCHAR\","
> - +
> "\"writable\":false,\"readOnly\":true,\"definitelyWritable\":false,"
> - +
> "\"autoIncrement\":false,\"caseSensitive\":true,\"searchable\":false,"
> - +
> "\"currency\":false,\"signed\":true},{\"isNullable\":0,\"displaySize\":19,"
> - +
> "\"label\":\"COUNT__\",\"name\":\"COUNT__\",\"schemaName\":\"DEFAULT\","
> - +
> "\"catelogName\":null,\"tableName\":\"SALES_TABLE\",\"precision\":19,\"scale\":0,"
> - +
> "\"columnType\":-5,\"columnTypeName\":\"BIGINT\",\"writable\":false,"
> - +
> "\"readOnly\":true,\"definitelyWritable\":false,\"autoIncrement\":false,"
> - +
> "\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true}],"
> - +
> "\"results\":[[\"AMERICA\",\"USD\",null],[null,\"RMB\",0],[\"KOR\",null,100],"
> - +
> "[\"\\\"abc\\\"\",\"a,b,c\",-1]],\"cube\":\"Sample_Cube\",\"affectedRowCount\":0,"
> - +
> "\"isException\":false,\"exceptionMessage\":null,\"duration\":134,"
> - +
> "\"totalScanCount\":1,\"hitExceptionCache\":false,\"storageCacheUsed\":false,"
> - + "\"partial\":false}";
> - String expected = "%table COUNTRY \tCURRENCY \tCOUNT__ \t \n" +
> - "AMERICA \tUSD \tnull \t \n" +
> - "null \tRMB \t0 \t \n" +
> - "KOR \tnull \t100 \t \n" +
> - "\\\"abc\\\" \ta,b,c \t-1 \t \n";
> - KylinInterpreter t = new MockKylinInterpreter(getDefaultProperties());
> - String actual = t.formatResult(msg);
> - Assert.assertEquals(expected, actual);
> - }
> -
> - @Test
> - public void testParseEmptyResult() {
> - String msg =
> "{\"columnMetas\":[{\"isNullable\":1,\"displaySize\":256,\"label\":\"COUNTRY\","
> - +
> "\"name\":\"COUNTRY\",\"schemaName\":\"DEFAULT\",\"catelogName\":null,"
> - +
> "\"tableName\":\"SALES_TABLE\",\"precision\":256,\"scale\":0,\"columnType\":12,"
> - +
> "\"columnTypeName\":\"VARCHAR\",\"writable\":false,\"readOnly\":true,"
> - +
> "\"definitelyWritable\":false,\"autoIncrement\":false,\"caseSensitive\":true,"
> - +
> "\"searchable\":false,\"currency\":false,\"signed\":true},{\"isNullable\":1,"
> - +
> "\"displaySize\":256,\"label\":\"CURRENCY\",\"name\":\"CURRENCY\","
> - +
> "\"schemaName\":\"DEFAULT\",\"catelogName\":null,\"tableName\":\"SALES_TABLE\","
> - +
> "\"precision\":256,\"scale\":0,\"columnType\":12,\"columnTypeName\":\"VARCHAR\","
> - +
> "\"writable\":false,\"readOnly\":true,\"definitelyWritable\":false,"
> - +
> "\"autoIncrement\":false,\"caseSensitive\":true,\"searchable\":false,"
> - +
> "\"currency\":false,\"signed\":true},{\"isNullable\":0,\"displaySize\":19,"
> - +
> "\"label\":\"COUNT__\",\"name\":\"COUNT__\",\"schemaName\":\"DEFAULT\","
> - +
> "\"catelogName\":null,\"tableName\":\"SALES_TABLE\",\"precision\":19,\"scale\":0,"
> - +
> "\"columnType\":-5,\"columnTypeName\":\"BIGINT\",\"writable\":false,"
> - +
> "\"readOnly\":true,\"definitelyWritable\":false,\"autoIncrement\":false,"
> - +
> "\"caseSensitive\":true,\"searchable\":false,\"currency\":false,\"signed\":true}],"
> - + "\"results\":[]," +
> "\"cube\":\"Sample_Cube\",\"affectedRowCount\":0,"
> - +
> "\"isException\":false,\"exceptionMessage\":null,\"duration\":134,"
> - +
> "\"totalScanCount\":1,\"hitExceptionCache\":false,\"storageCacheUsed\":false,"
> - + "\"partial\":false}";
> - String expected = "%table COUNTRY \tCURRENCY \tCOUNT__ \t \n";
> - KylinInterpreter t = new MockKylinInterpreter(getDefaultProperties());
> - String actual = t.formatResult(msg);
> - Assert.assertEquals(expected, actual);
> - }
> -
> - private Properties getDefaultProperties() {
> - Properties prop = new Properties();
> - prop.put("kylin.api.username", "ADMIN");
> - prop.put("kylin.api.password", "KYLIN");
> - prop.put("kylin.api.url", "http://<host>:<port>/kylin/api/query");
> - prop.put("kylin.query.project", "default");
> - prop.put("kylin.query.offset", "0");
> - prop.put("kylin.query.limit", "5000");
> - prop.put("kylin.query.ispartial", "true");
> - return prop;
> - }
> -}
> -
> -class MockKylinInterpreter extends KylinInterpreter {
> - MockKylinInterpreter(Properties property) {
> - super(property);
> - }
> -
> - @Override
> - public HttpResponse prepareRequest(String sql) throws IOException {
> - MockHttpClient client = new MockHttpClient();
> - return client.execute(new HttpPost());
> - }
> -}
> -
> -class MockHttpClient{
> - public MockHttpResponse execute(HttpPost post){
> - return new MockHttpResponse();
> - }
> -}
> -
> -class MockHttpResponse extends AbstractHttpMessage implements
> HttpResponse{
> - @Override
> - public StatusLine getStatusLine() {
> - return new MockStatusLine();
> - }
> -
> - @Override
> - public void setStatusLine(StatusLine statusLine) {
> - }
> -
> - @Override
> - public void setStatusLine(ProtocolVersion protocolVersion, int i) {
> - }
> -
> - @Override
> - public void setStatusLine(ProtocolVersion protocolVersion, int i,
> String s) {
> - }
> -
> - @Override
> - public void setStatusCode(int i) throws IllegalStateException {
> - }
> -
> - @Override
> - public void setReasonPhrase(String s) throws IllegalStateException {
> - }
> -
> - @Override
> - public HttpEntity getEntity() {
> - return new MockEntity();
> - }
> -
> - @Override
> - public void setEntity(HttpEntity httpEntity) {
> - }
> -
> - @Override
> - public Locale getLocale() {
> - return null;
> - }
> -
> - @Override
> - public void setLocale(Locale locale) {
> - }
> -
> - @Override
> - public ProtocolVersion getProtocolVersion() {
> - return null;
> - }
> -}
> -
> -class MockStatusLine implements StatusLine{
> - @Override
> - public ProtocolVersion getProtocolVersion() {
> - return null;
> - }
> -
> - @Override
> - public int getStatusCode() {
> - return 200;
> - }
> -
> - @Override
> - public String getReasonPhrase() {
> - return null;
> - }
> -}
> -
> -class MockEntity implements HttpEntity{
> - @Override
> - public boolean isRepeatable() {
> - return false;
> - }
> -
> - @Override
> - public boolean isChunked() {
> - return false;
> - }
> -
> - @Override
> - public long getContentLength() {
> - return 0;
> - }
> -
> - @Override
> - public Header getContentType() {
> - return null;
> - }
> -
> - @Override
> - public Header getContentEncoding() {
> - return null;
> - }
> -
> - @Override
> - public InputStream getContent() throws IOException,
> IllegalStateException {
> - return new ByteArrayInputStream(("{\"columnMetas\":" +
> - "[{\"label\":\"PART_DT\"},{\"label\":\"measure\"}]," +
> - "\"results\":[[\"2012-01-03\",\"917.4138\"]," +
> - "[\"2012-05-06\",\"592.4823\"]]}").getBytes());
> - }
> -
> - @Override
> - public void writeTo(OutputStream outputStream) throws IOException {
> - }
> -
> - @Override
> - public boolean isStreaming() {
> - return false;
> - }
> -
> - @Override
> - public void consumeContent() throws IOException {
> - }
> -}
> diff --git a/pom.xml b/pom.xml
> index 78b011339c..da5b999307 100644
> --- a/pom.xml
> +++ b/pom.xml
> @@ -78,7 +78,6 @@
> <module>flink-cmd</module>
> <module>ignite</module>
> <module>influxdb</module>
> - <module>kylin</module>
> <module>python</module>
> <module>cassandra</module>
> <module>elasticsearch</module>
> diff --git a/zeppelin-distribution/src/bin_license/LICENSE
> b/zeppelin-distribution/src/bin_license/LICENSE
> index 380b0a4349..a80dc4f4ea 100644
> --- a/zeppelin-distribution/src/bin_license/LICENSE
> +++ b/zeppelin-distribution/src/bin_license/LICENSE
> @@ -34,7 +34,6 @@ The following components are provided under Apache
> License.
> (Apache 2.0) Apache Cassandra (http://cassandra.apache.org/)
> (Apache 2.0) Apache HBase (http://hbase.apache.org/)
> (Apache 2.0) Apache Ignite (http://ignite.apache.org/)
> - (Apache 2.0) Apache Kylin (http://kylin.apache.org/)
> (Apache 2.0) Apache Flink (http://flink.apache.org/)
> (Apache 2.0) Apache Jena (https://jena.apache.org/)
> (Apache 2.0) Apache Beam (http://beam.apache.org/)
>
>