mirror of
https://github.com/apache/zeppelin
synced 2026-05-24 09:38:26 +00:00
Hazelcast Jet Interpreter first commit!
This commit is contained in:
parent
593dc83141
commit
36b8a624c7
8 changed files with 336 additions and 0 deletions
|
|
@ -25,6 +25,7 @@ cassandra org.apache.zeppelin:zeppelin-cassandra_2.11:0.9.0 Cassandr
|
|||
elasticsearch org.apache.zeppelin:zeppelin-elasticsearch:0.9.0 Elasticsearch interpreter
|
||||
file org.apache.zeppelin:zeppelin-file:0.9.0 HDFS file interpreter
|
||||
flink org.apache.zeppelin:zeppelin-flink_2.11:0.9.0 Flink interpreter built with Scala 2.11
|
||||
hazelcastjet org.apache.zeppelin:zeppelin-hazelcastjet:0.9.0 Hazelcast Jet interpreter
|
||||
hbase org.apache.zeppelin:zeppelin-hbase:0.9.0 Hbase interpreter
|
||||
ignite org.apache.zeppelin:zeppelin-ignite_2.11:0.9.0 Ignite interpreter built with Scala 2.11
|
||||
jdbc org.apache.zeppelin:zeppelin-jdbc:0.9.0 Jdbc interpreter
|
||||
|
|
|
|||
|
|
@ -132,6 +132,7 @@
|
|||
<li><a href="{{BASE_PATH}}/interpreter/flink.html">Flink</a></li>
|
||||
<li><a href="{{BASE_PATH}}/interpreter/geode.html">Geode</a></li>
|
||||
<li><a href="{{BASE_PATH}}/interpreter/groovy.html">Groovy</a></li>
|
||||
<li><a href="{{BASE_PATH}}/interpreter/hazelcastjet.html">Hazelcast Jet</a></li>
|
||||
<li><a href="{{BASE_PATH}}/interpreter/hbase.html">HBase</a></li>
|
||||
<li><a href="{{BASE_PATH}}/interpreter/hdfs.html">HDFS</a></li>
|
||||
<li><a href="{{BASE_PATH}}/interpreter/hive.html">Hive</a></li>
|
||||
|
|
|
|||
77
docs/interpreter/hazelcastjet.md
Normal file
77
docs/interpreter/hazelcastjet.md
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
---
|
||||
layout: page
|
||||
title: Hazelcast Jet interpreter in Apache Zeppelin
|
||||
description: Build and execture Hazelcast Jet computation jobs.
|
||||
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 %}
|
||||
|
||||
# Hazelcast Jet interpreter for Apache Zeppelin
|
||||
|
||||
<div id="toc"></div>
|
||||
|
||||
## How to use
|
||||
Basically, you can write normal java code. You should write the main method inside a class because the interpreter invoke this main to execute the code. Unlike Zeppelin normal pattern, each paragraph is considered as a separate job, there isn't any relation to any other paragraph. For example, a variable defined in one paragraph cannot be used in another one as each paragraph is a self contained java main class that is executed and the output returned to Zeppelin.
|
||||
|
||||
|
||||
The following is a demonstration of a word count example with the result represented as an Hazelcast IMDG IMap sink and displayed leveraging Zeppelin's built in visualization using the utility method `JavaInterpreterUtils.displayTableFromSimpleMap`.
|
||||
|
||||
|
||||
```java
|
||||
%hazelcastjet
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import org.apache.zeppelin.java.JavaInterpreterUtils;
|
||||
|
||||
public class HelloWorld {
|
||||
|
||||
public static void main(String[] args) {
|
||||
|
||||
// Create the specification of the computation pipeline. Note
|
||||
// it's a pure POJO: no instance of Jet needed to create it.
|
||||
Pipeline p = Pipeline.create();
|
||||
p.drawFrom(Sources.<String>list("text"))
|
||||
.flatMap(word ->
|
||||
traverseArray(word.toLowerCase().split("\\W+")))
|
||||
.filter(word -> !word.isEmpty())
|
||||
.groupingKey(wholeItem())
|
||||
.aggregate(counting())
|
||||
.drainTo(Sinks.map("counts"));
|
||||
|
||||
// Start Jet, populate the input list
|
||||
JetInstance jet = Jet.newJetInstance();
|
||||
try {
|
||||
List<String> text = jet.getList("text");
|
||||
text.add("hello world hello hello world");
|
||||
text.add("world world hello world");
|
||||
|
||||
// Perform the computation
|
||||
jet.newJob(p).join();
|
||||
|
||||
// Diplay the results with Zeppelin %table
|
||||
Map<String, Long> counts = jet.getMap("counts");
|
||||
System.out.println(JavaInterpreterUtils.displayTableFromSimpleMap("Word","Count", counts));
|
||||
|
||||
} finally {
|
||||
Jet.shutdownAll();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
17
hazelcast-jet/README.md
Normal file
17
hazelcast-jet/README.md
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
# Overview
|
||||
Hazelcast Jet interpreter for Apache Zeppelin
|
||||
|
||||
# Architecture
|
||||
Current interpreter implementation supports the static REPL. It compiles the code in memory, execute it and redirect the output to Zeppelin.
|
||||
|
||||
### Technical overview
|
||||
|
||||
* Upon starting an interpreter, an instance of `JavaCompiler` is created.
|
||||
|
||||
* When the user runs commands with java, the `JavaParser` go through the code to get a class that contains the main method.
|
||||
|
||||
* Then it replaces the class name with random class name to avoid overriding while compilation. It creates new out & err stream to get the data in new stream instead of the console, to redirect output to Zeppelin.
|
||||
|
||||
* If there is any error during compilation, it can catch and redirect to Zeppelin.
|
||||
|
||||
* `JavaInterpreterUtils` contains useful methods to print out Java collections and leverage Zeppelin's built in visualization.
|
||||
94
hazelcast-jet/pom.xml
Normal file
94
hazelcast-jet/pom.xml
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
~ Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
~ contributor license agreements. See the NOTICE file distributed with
|
||||
~ this work for additional information regarding copyright ownership.
|
||||
~ The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
~ (the "License"); you may not use this file except in compliance with
|
||||
~ the License. You may obtain a copy of the License at
|
||||
~
|
||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
||||
~
|
||||
~ Unless required by applicable law or agreed to in writing, software
|
||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
~ See the License for the specific language governing permissions and
|
||||
~ limitations under the License.
|
||||
-->
|
||||
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<parent>
|
||||
<artifactId>interpreter-parent</artifactId>
|
||||
<groupId>org.apache.zeppelin</groupId>
|
||||
<version>0.9.0-SNAPSHOT</version>
|
||||
<relativePath>../interpreter-parent</relativePath>
|
||||
</parent>
|
||||
|
||||
<groupId>org.apache.zeppelin</groupId>
|
||||
<artifactId>zeppelin-hazelcastjet</artifactId>
|
||||
<packaging>jar</packaging>
|
||||
<version>0.9.0-SNAPSHOT</version>
|
||||
<name>Zeppelin: Hazelcast Jet interpreter</name>
|
||||
|
||||
<properties>
|
||||
<!--library versions-->
|
||||
<interpreter.name>hazelcast-jet</interpreter.name>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
|
||||
<dependency>
|
||||
<groupId>${project.groupId}</groupId>
|
||||
<artifactId>zeppelin-interpreter</artifactId>
|
||||
<version>${project.version}</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.apache.zeppelin</groupId>
|
||||
<artifactId>zeppelin-java</artifactId>
|
||||
<version>${project.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.hazelcast.jet</groupId>
|
||||
<artifactId>hazelcast-jet</artifactId>
|
||||
<version>0.6.1</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<artifactId>maven-enforcer-plugin</artifactId>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-dependency-plugin</artifactId>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-resources-plugin</artifactId>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-checkstyle-plugin</artifactId>
|
||||
<configuration>
|
||||
<skip>false</skip>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</project>
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
/*
|
||||
* 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.hazelcastjet;
|
||||
|
||||
import org.apache.zeppelin.java.JavaInterpreter;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
/**
|
||||
* Hazelcast Jet interpreter
|
||||
*/
|
||||
public class HazelcastJetInterpreter extends JavaInterpreter {
|
||||
|
||||
public HazelcastJetInterpreter(Properties property) {
|
||||
super(property);
|
||||
}
|
||||
|
||||
}
|
||||
14
hazelcast-jet/src/main/resources/interpreter-setting.json
Normal file
14
hazelcast-jet/src/main/resources/interpreter-setting.json
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
[
|
||||
{
|
||||
"group": "hazelcastjet",
|
||||
"name": "hazelcastjet",
|
||||
"className": "org.apache.zeppelin.java.HazelcastJetInterpreter",
|
||||
"defaultInterpreter": true,
|
||||
"properties": {
|
||||
},
|
||||
"editor": {
|
||||
"language": "java",
|
||||
"editOnDblClick": false
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -0,0 +1,99 @@
|
|||
/*
|
||||
* 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.hazelcastjet;
|
||||
|
||||
import org.apache.zeppelin.interpreter.InterpreterContext;
|
||||
import org.apache.zeppelin.interpreter.InterpreterResult;
|
||||
import org.junit.AfterClass;
|
||||
import org.junit.BeforeClass;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.util.Properties;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
/**
|
||||
* HazelcastJetInterpreterTest
|
||||
*/
|
||||
public class HazelcastJetInterpreterTest {
|
||||
|
||||
private static HazelcastJetInterpreter jet;
|
||||
private static InterpreterContext context;
|
||||
|
||||
@BeforeClass
|
||||
public static void setUp() {
|
||||
Properties p = new Properties();
|
||||
jet = new HazelcastJetInterpreter(p);
|
||||
jet.open();
|
||||
context = InterpreterContext.builder().build();
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
public static void tearDown() {
|
||||
jet.close();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStaticRepl() {
|
||||
|
||||
StringWriter writer = new StringWriter();
|
||||
PrintWriter out = new PrintWriter(writer);
|
||||
out.println("public class HelloWorld {");
|
||||
out.println(" public static void main(String args[]) {");
|
||||
out.println(" System.out.println(\"This is in another java file\");");
|
||||
out.println(" }");
|
||||
out.println("}");
|
||||
out.close();
|
||||
|
||||
InterpreterResult res = jet.interpret(writer.toString(), context);
|
||||
|
||||
assertEquals(InterpreterResult.Code.SUCCESS, res.code());
|
||||
assertEquals(InterpreterResult.Type.TEXT, res.message().get(0).getType());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStaticReplWithoutMain() {
|
||||
|
||||
StringBuffer sourceCode = new StringBuffer();
|
||||
sourceCode.append("package org.mdkt;\n");
|
||||
sourceCode.append("public class HelloClass {\n");
|
||||
sourceCode.append(" public String hello() { return \"hello\"; }");
|
||||
sourceCode.append("}");
|
||||
InterpreterResult res = jet.interpret(sourceCode.toString(), context);
|
||||
assertEquals(InterpreterResult.Code.ERROR, res.code());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStaticReplWithSyntaxError() {
|
||||
|
||||
StringWriter writer = new StringWriter();
|
||||
PrintWriter out = new PrintWriter(writer);
|
||||
out.println("public class HelloWorld {");
|
||||
out.println(" public static void main(String args[]) {");
|
||||
out.println(" System.out.prin(\"This is in another java file\");");
|
||||
out.println(" }");
|
||||
out.println("}");
|
||||
out.close();
|
||||
InterpreterResult res = jet.interpret(writer.toString(), context);
|
||||
|
||||
assertEquals(InterpreterResult.Code.ERROR, res.code());
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in a new issue