From 721dcb7bcfbc56d923c101e5b701cd9c2ad23372 Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Wed, 16 Dec 2015 19:34:17 -0800 Subject: [PATCH 01/29] Getting a basic interpreter going. Next step is to hook in the Scalding REPL. --- conf/zeppelin-site.xml.template | 2 +- pom.xml | 1 + scalding/pom.xml | 134 ++++++++++++++++++ .../scalding/ScaldingInterpreter.java | 87 ++++++++++++ 4 files changed, 223 insertions(+), 1 deletion(-) create mode 100644 scalding/pom.xml create mode 100644 scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java diff --git a/conf/zeppelin-site.xml.template b/conf/zeppelin-site.xml.template index 78d7f1ece4f..adfded666ee 100755 --- a/conf/zeppelin-site.xml.template +++ b/conf/zeppelin-site.xml.template @@ -105,7 +105,7 @@ zeppelin.interpreters - org.apache.zeppelin.spark.SparkInterpreter,org.apache.zeppelin.spark.PySparkInterpreter,org.apache.zeppelin.spark.SparkSqlInterpreter,org.apache.zeppelin.spark.DepInterpreter,org.apache.zeppelin.markdown.Markdown,org.apache.zeppelin.angular.AngularInterpreter,org.apache.zeppelin.shell.ShellInterpreter,org.apache.zeppelin.hive.HiveInterpreter,org.apache.zeppelin.tajo.TajoInterpreter,org.apache.zeppelin.flink.FlinkInterpreter,org.apache.zeppelin.lens.LensInterpreter,org.apache.zeppelin.ignite.IgniteInterpreter,org.apache.zeppelin.ignite.IgniteSqlInterpreter,org.apache.zeppelin.cassandra.CassandraInterpreter,org.apache.zeppelin.geode.GeodeOqlInterpreter,org.apache.zeppelin.postgresql.PostgreSqlInterpreter,org.apache.zeppelin.phoenix.PhoenixInterpreter,org.apache.zeppelin.kylin.KylinInterpreter + org.apache.zeppelin.spark.SparkInterpreter,org.apache.zeppelin.spark.PySparkInterpreter,org.apache.zeppelin.spark.SparkSqlInterpreter,org.apache.zeppelin.spark.DepInterpreter,org.apache.zeppelin.markdown.Markdown,org.apache.zeppelin.angular.AngularInterpreter,org.apache.zeppelin.shell.ShellInterpreter,org.apache.zeppelin.hive.HiveInterpreter,org.apache.zeppelin.tajo.TajoInterpreter,org.apache.zeppelin.flink.FlinkInterpreter,org.apache.zeppelin.lens.LensInterpreter,org.apache.zeppelin.ignite.IgniteInterpreter,org.apache.zeppelin.ignite.IgniteSqlInterpreter,org.apache.zeppelin.cassandra.CassandraInterpreter,org.apache.zeppelin.geode.GeodeOqlInterpreter,org.apache.zeppelin.postgresql.PostgreSqlInterpreter,org.apache.zeppelin.phoenix.PhoenixInterpreter,org.apache.zeppelin.kylin.KylinInterpreter,org.apache.zeppelin.scalding.ScaldingInterpreter Comma separated interpreter configurations. First interpreter become a default diff --git a/pom.xml b/pom.xml index 1984cca7913..90361a082b6 100755 --- a/pom.xml +++ b/pom.xml @@ -91,6 +91,7 @@ markdown angular shell + scalding hive phoenix postgresql diff --git a/scalding/pom.xml b/scalding/pom.xml new file mode 100644 index 00000000000..d77264c600f --- /dev/null +++ b/scalding/pom.xml @@ -0,0 +1,134 @@ + + + + + 4.0.0 + + + zeppelin + org.apache.zeppelin + 0.6.0-incubating-SNAPSHOT + .. + + + org.apache.zeppelin + zeppelin-scalding + jar + 0.6.0-incubating-SNAPSHOT + Zeppelin: Scalding interpreter + http://zeppelin.incubator.apache.org + + + + ${project.groupId} + zeppelin-interpreter + ${project.version} + provided + + + + org.apache.commons + commons-exec + 1.3 + + + + org.slf4j + slf4j-api + + + + org.slf4j + slf4j-log4j12 + + + + junit + junit + test + + + + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.7 + + true + + + + + maven-enforcer-plugin + 1.3.1 + + + enforce + none + + + + + + maven-dependency-plugin + 2.8 + + + copy-dependencies + package + + copy-dependencies + + + ${project.build.directory}/../../interpreter/scalding + false + false + true + runtime + + + + copy-artifact + package + + copy + + + ${project.build.directory}/../../interpreter/scalding + false + false + true + runtime + + + ${project.groupId} + ${project.artifactId} + ${project.version} + ${project.packaging} + + + + + + + + + + diff --git a/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java b/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java new file mode 100644 index 00000000000..bec52bc7647 --- /dev/null +++ b/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java @@ -0,0 +1,87 @@ +/* + * 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.scalding; + +import java.util.Properties; +import java.util.List; + +import org.apache.zeppelin.interpreter.Interpreter; +import org.apache.zeppelin.interpreter.InterpreterContext; +import org.apache.zeppelin.interpreter.InterpreterResult; +import org.apache.zeppelin.interpreter.InterpreterResult.Code; +import org.apache.zeppelin.scheduler.Scheduler; +import org.apache.zeppelin.scheduler.SchedulerFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Scalding interpreter for Zeppelin. + * + * @author sriramkrishnan + * + */ +public class ScaldingInterpreter extends Interpreter { + Logger logger = LoggerFactory.getLogger(ScaldingInterpreter.class); + + static { + Interpreter.register("scalding", ScaldingInterpreter.class.getName()); + } + + public ScaldingInterpreter(Properties property) { + super(property); + } + + @Override + public void open() {} + + @Override + public void close() {} + + + @Override + public InterpreterResult interpret(String cmd, InterpreterContext contextInterpreter) { + logger.debug("Run Scalding command '" + cmd + "'"); + System.out.println("Running Scalding Interpreter!"); + return new InterpreterResult(InterpreterResult.Code.SUCCESS, "Success!!"); + } + + @Override + public void cancel(InterpreterContext context) {} + + @Override + public FormType getFormType() { + return FormType.SIMPLE; + } + + @Override + public int getProgress(InterpreterContext context) { + return 0; + } + + @Override + public Scheduler getScheduler() { + return SchedulerFactory.singleton().createOrGetFIFOScheduler( + ScaldingInterpreter.class.getName() + this.hashCode()); + } + + @Override + public List completion(String buf, int cursor) { + return null; + } + +} From 35fc032d7e6cc679cf3604f44cf6ba4a3545a53b Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Thu, 17 Dec 2015 13:22:52 -0800 Subject: [PATCH 02/29] Initial version of a ScaldingInterpreter running in local mode. Need to get console output next. And add tests, and make it work for HDFS. --- scalding/pom.xml | 69 +++++++ .../scalding/ScaldingInterpreter.java | 178 +++++++++++++++++- 2 files changed, 242 insertions(+), 5 deletions(-) diff --git a/scalding/pom.xml b/scalding/pom.xml index d77264c600f..a5aae18f7e3 100644 --- a/scalding/pom.xml +++ b/scalding/pom.xml @@ -33,6 +33,18 @@ Zeppelin: Scalding interpreter http://zeppelin.incubator.apache.org + + 2.10.5 + + + + + conjars + Concurrent Maven Repo + http://conjars.org/repo + + + ${project.groupId} @@ -62,6 +74,36 @@ junit test + + + com.twitter + scalding-core_2.10 + 0.15.1-RC13 + + + + com.twitter + scalding-repl_2.10 + 0.15.1-RC13 + + + + org.scala-lang + scala-library + ${scala.version} + + + + org.scala-lang + scala-compiler + ${scala.version} + + + + org.scala-lang + scala-reflect + ${scala.version} + @@ -128,6 +170,33 @@ + + + org.scala-tools + maven-scala-plugin + + + compile + + compile + + compile + + + test-compile + + testCompile + + test-compile + + + process-resources + + compile + + + + diff --git a/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java b/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java index bec52bc7647..86bb801ef8e 100644 --- a/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java +++ b/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java @@ -17,8 +17,14 @@ package org.apache.zeppelin.scalding; +import java.io.File; import java.util.Properties; import java.util.List; +import java.util.LinkedList; +import java.net.URL; +import java.net.URLClassLoader; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterContext; @@ -29,8 +35,15 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.twitter.scalding.ScaldingILoop; + +import scala.Some; +import scala.tools.nsc.Settings; +import scala.tools.nsc.settings.MutableSettings.BooleanSetting; +import scala.tools.nsc.settings.MutableSettings.PathSetting; + /** - * Scalding interpreter for Zeppelin. + * Scalding interpreter for Zeppelin. Based off the Spark interpreter code. * * @author sriramkrishnan * @@ -42,12 +55,96 @@ public class ScaldingInterpreter extends Interpreter { Interpreter.register("scalding", ScaldingInterpreter.class.getName()); } + private ScaldingILoop interpreter; + public ScaldingInterpreter(Properties property) { super(property); } @Override - public void open() {} + public void open() { + URL[] urls = getClassloaderUrls(); + + // Very nice discussion about how scala compiler handle classpath + // https://groups.google.com/forum/#!topic/scala-user/MlVwo2xCCI0 + + /* + * > val env = new nsc.Settings(errLogger) > env.usejavacp.value = true > val p = new + * Interpreter(env) > p.setContextClassLoader > Alternatively you can set the class path through + * nsc.Settings.classpath. + * + * >> val settings = new Settings() >> settings.usejavacp.value = true >> + * settings.classpath.value += File.pathSeparator + >> System.getProperty("java.class.path") >> + * val in = new Interpreter(settings) { >> override protected def parentClassLoader = + * getClass.getClassLoader >> } >> in.setContextClassLoader() + */ + Settings settings = new Settings(); + + // set classpath for scala compiler + PathSetting pathSettings = settings.classpath(); + String classpath = ""; + List paths = currentClassPath(); + for (File f : paths) { + if (classpath.length() > 0) { + classpath += File.pathSeparator; + } + classpath += f.getAbsolutePath(); + } + + if (urls != null) { + for (URL u : urls) { + if (classpath.length() > 0) { + classpath += File.pathSeparator; + } + classpath += u.getFile(); + } + } + + pathSettings.v_$eq(classpath); + settings.scala$tools$nsc$settings$ScalaSettings$_setter_$classpath_$eq(pathSettings); + + + // set classloader for scala compiler + settings.explicitParentLoader_$eq(new Some(Thread.currentThread() + .getContextClassLoader())); + BooleanSetting b = (BooleanSetting) settings.usejavacp(); + b.v_$eq(true); + settings.scala$tools$nsc$settings$StandardScalaSettings$_setter_$usejavacp_$eq(b); + + /* Scalding interpreter */ + interpreter = new ScaldingILoop(); + interpreter.settings_$eq(settings); + interpreter.createInterpreter(); + } + + private List currentClassPath() { + List paths = classPath(Thread.currentThread().getContextClassLoader()); + String[] cps = System.getProperty("java.class.path").split(File.pathSeparator); + if (cps != null) { + for (String cp : cps) { + paths.add(new File(cp)); + } + } + return paths; + } + + private List classPath(ClassLoader cl) { + List paths = new LinkedList(); + if (cl == null) { + return paths; + } + + if (cl instanceof URLClassLoader) { + URLClassLoader ucl = (URLClassLoader) cl; + URL[] urls = ucl.getURLs(); + if (urls != null) { + for (URL url : urls) { + paths.add(new File(url.getFile())); + } + } + } + return paths; + } @Override public void close() {} @@ -55,9 +152,80 @@ public void close() {} @Override public InterpreterResult interpret(String cmd, InterpreterContext contextInterpreter) { - logger.debug("Run Scalding command '" + cmd + "'"); - System.out.println("Running Scalding Interpreter!"); - return new InterpreterResult(InterpreterResult.Code.SUCCESS, "Success!!"); + logger.info("Run Scalding command '" + cmd + "'"); + + if (cmd == null || cmd.trim().length() == 0) { + return new InterpreterResult(Code.SUCCESS); + } + return interpret(cmd.split("\n"), contextInterpreter); + } + + public InterpreterResult interpret(String[] lines, InterpreterContext context) { + synchronized (this) { + InterpreterResult r = interpretInput(lines); + return r; + } + } + + public InterpreterResult interpretInput(String[] lines) { + + // add print("") to make sure not finishing with comment + // see https://github.com/NFLabs/zeppelin/issues/151 + String[] linesToRun = new String[lines.length + 1]; + for (int i = 0; i < lines.length; i++) { + linesToRun[i] = lines[i]; + } + linesToRun[lines.length] = "print(\"\")"; + + Code r = null; + String incomplete = ""; + + for (int l = 0; l < linesToRun.length; l++) { + String s = linesToRun[l]; + // check if next line starts with "." (but not ".." or "./") it is treated as an invocation + if (l + 1 < linesToRun.length) { + String nextLine = linesToRun[l + 1].trim(); + if (nextLine.startsWith(".") && !nextLine.startsWith("..") && !nextLine.startsWith("./")) { + incomplete += s + "\n"; + continue; + } + } + + scala.tools.nsc.interpreter.Results.Result res = null; + try { + res = interpreter.intp().interpret(incomplete + s); + } catch (Exception e) { + e.printStackTrace(); + logger.error("Interpreter exception: ", e); + return new InterpreterResult(Code.ERROR, e.getMessage()); + } + + r = getResultCode(res); + + if (r == Code.ERROR) { + return new InterpreterResult(r); + } else if (r == Code.INCOMPLETE) { + incomplete += s + "\n"; + } else { + incomplete = ""; + } + } + + if (r == Code.INCOMPLETE) { + return new InterpreterResult(r, "Incomplete expression"); + } else { + return new InterpreterResult(r); + } + } + + private Code getResultCode(scala.tools.nsc.interpreter.Results.Result r) { + if (r instanceof scala.tools.nsc.interpreter.Results.Success$) { + return Code.SUCCESS; + } else if (r instanceof scala.tools.nsc.interpreter.Results.Incomplete$) { + return Code.INCOMPLETE; + } else { + return Code.ERROR; + } } @Override From e13576fcfea4fb86f8fafd46df716d2d50ef0b3c Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Thu, 17 Dec 2015 14:35:53 -0800 Subject: [PATCH 03/29] Now seem to be getting the console out, but only for last line. Will need some debugging. --- scalding/pom.xml | 7 +++++++ .../apache/zeppelin/scalding/ScaldingInterpreter.java | 9 +++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/scalding/pom.xml b/scalding/pom.xml index a5aae18f7e3..6d0fd39a6c4 100644 --- a/scalding/pom.xml +++ b/scalding/pom.xml @@ -35,6 +35,7 @@ 2.10.5 + 2.5.0 @@ -104,6 +105,12 @@ scala-reflect ${scala.version} + + + org.apache.hadoop + hadoop-client + ${hadoop.version} + diff --git a/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java b/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java index 86bb801ef8e..7ebfb772860 100644 --- a/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java +++ b/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java @@ -37,6 +37,7 @@ import com.twitter.scalding.ScaldingILoop; +import scala.Console; import scala.Some; import scala.tools.nsc.Settings; import scala.tools.nsc.settings.MutableSettings.BooleanSetting; @@ -56,9 +57,11 @@ public class ScaldingInterpreter extends Interpreter { } private ScaldingILoop interpreter; + private ByteArrayOutputStream out; public ScaldingInterpreter(Properties property) { super(property); + out = new ByteArrayOutputStream(); } @Override @@ -177,6 +180,8 @@ public InterpreterResult interpretInput(String[] lines) { } linesToRun[lines.length] = "print(\"\")"; + Console.setOut(new PrintStream(out)); + out.reset(); Code r = null; String incomplete = ""; @@ -203,7 +208,7 @@ public InterpreterResult interpretInput(String[] lines) { r = getResultCode(res); if (r == Code.ERROR) { - return new InterpreterResult(r); + return new InterpreterResult(r, out.toString()); } else if (r == Code.INCOMPLETE) { incomplete += s + "\n"; } else { @@ -214,7 +219,7 @@ public InterpreterResult interpretInput(String[] lines) { if (r == Code.INCOMPLETE) { return new InterpreterResult(r, "Incomplete expression"); } else { - return new InterpreterResult(r); + return new InterpreterResult(r, out.toString()); } } From b19fda41b586486e315f9dc6eaa3a71e4ecf7632 Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Thu, 17 Dec 2015 16:20:02 -0800 Subject: [PATCH 04/29] More cleanup - flushing output stream. Still can't seem to get the Scala console output. Need to figure that out. --- scalding/pom.xml | 5 +++-- .../apache/zeppelin/scalding/ScaldingInterpreter.java | 10 ++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/scalding/pom.xml b/scalding/pom.xml index 6d0fd39a6c4..3805487a678 100644 --- a/scalding/pom.xml +++ b/scalding/pom.xml @@ -36,6 +36,7 @@ 2.10.5 2.5.0 + 0.15.1-RC13 @@ -79,13 +80,13 @@ com.twitter scalding-core_2.10 - 0.15.1-RC13 + ${scalding.version} com.twitter scalding-repl_2.10 - 0.15.1-RC13 + ${scalding.version} diff --git a/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java b/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java index 7ebfb772860..e2e7939882b 100644 --- a/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java +++ b/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java @@ -150,7 +150,9 @@ private List classPath(ClassLoader cl) { } @Override - public void close() {} + public void close() { + interpreter.intp().close(); + } @Override @@ -180,7 +182,9 @@ public InterpreterResult interpretInput(String[] lines) { } linesToRun[lines.length] = "print(\"\")"; - Console.setOut(new PrintStream(out)); + PrintStream ps = new PrintStream(out); + Console.setOut(ps); + Console.setErr(ps); out.reset(); Code r = null; String incomplete = ""; @@ -208,6 +212,7 @@ public InterpreterResult interpretInput(String[] lines) { r = getResultCode(res); if (r == Code.ERROR) { + ps.flush(); return new InterpreterResult(r, out.toString()); } else if (r == Code.INCOMPLETE) { incomplete += s + "\n"; @@ -219,6 +224,7 @@ public InterpreterResult interpretInput(String[] lines) { if (r == Code.INCOMPLETE) { return new InterpreterResult(r, "Incomplete expression"); } else { + ps.flush(); return new InterpreterResult(r, out.toString()); } } From 1ffbb3b2d70d57ff65d0d43ef7f02defe263ac41 Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Thu, 17 Dec 2015 21:00:13 -0800 Subject: [PATCH 05/29] Fixing output of stdout from console --- .../scalding/ScaldingInterpreter.java | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java b/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java index e2e7939882b..2a4c744e104 100644 --- a/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java +++ b/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java @@ -20,11 +20,13 @@ import java.io.File; import java.util.Properties; import java.util.List; +import java.util.Map; import java.util.LinkedList; import java.net.URL; import java.net.URLClassLoader; import java.io.ByteArrayOutputStream; import java.io.PrintStream; +import java.io.PrintWriter; import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterContext; @@ -35,10 +37,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.twitter.scalding.ScaldingILoop; +//import com.twitter.scalding.ScaldingILoop; import scala.Console; import scala.Some; +import scala.None; import scala.tools.nsc.Settings; import scala.tools.nsc.settings.MutableSettings.BooleanSetting; import scala.tools.nsc.settings.MutableSettings.PathSetting; @@ -58,6 +61,7 @@ public class ScaldingInterpreter extends Interpreter { private ScaldingILoop interpreter; private ByteArrayOutputStream out; + private Map binder; public ScaldingInterpreter(Properties property) { super(property); @@ -115,9 +119,26 @@ public void open() { settings.scala$tools$nsc$settings$StandardScalaSettings$_setter_$usejavacp_$eq(b); /* Scalding interpreter */ - interpreter = new ScaldingILoop(); + PrintStream printStream = new PrintStream(out); + interpreter = new ScaldingILoop(null, new PrintWriter(out)); interpreter.settings_$eq(settings); interpreter.createInterpreter(); + + interpreter.intp(). + interpret("@transient var _binder = new java.util.HashMap[String, Object]()"); + binder = (Map) getValue("_binder"); + binder.put("out", printStream); + } + + private Object getValue(String name) { + Object ret = interpreter.intp().valueOfTerm(name); + if (ret instanceof None) { + return null; + } else if (ret instanceof Some) { + return ((Some) ret).get(); + } else { + return ret; + } } private List currentClassPath() { @@ -182,9 +203,7 @@ public InterpreterResult interpretInput(String[] lines) { } linesToRun[lines.length] = "print(\"\")"; - PrintStream ps = new PrintStream(out); - Console.setOut(ps); - Console.setErr(ps); + Console.setOut((java.io.PrintStream) binder.get("out")); out.reset(); Code r = null; String incomplete = ""; @@ -212,7 +231,7 @@ public InterpreterResult interpretInput(String[] lines) { r = getResultCode(res); if (r == Code.ERROR) { - ps.flush(); + Console.flush(); return new InterpreterResult(r, out.toString()); } else if (r == Code.INCOMPLETE) { incomplete += s + "\n"; @@ -224,7 +243,7 @@ public InterpreterResult interpretInput(String[] lines) { if (r == Code.INCOMPLETE) { return new InterpreterResult(r, "Incomplete expression"); } else { - ps.flush(); + Console.flush(); return new InterpreterResult(r, out.toString()); } } From d3916b751627b7fd02f9b583214d578236178864 Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Thu, 17 Dec 2015 21:01:02 -0800 Subject: [PATCH 06/29] Adding modified version of ScaldingILoop for grabbing Console output - will want to move this to Scalding itself --- .../zeppelin/scalding/ScaldingILoop.scala | 109 ++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 scalding/src/main/scala/org/apache/zeppelin/scalding/ScaldingILoop.scala diff --git a/scalding/src/main/scala/org/apache/zeppelin/scalding/ScaldingILoop.scala b/scalding/src/main/scala/org/apache/zeppelin/scalding/ScaldingILoop.scala new file mode 100644 index 00000000000..7fad66258fc --- /dev/null +++ b/scalding/src/main/scala/org/apache/zeppelin/scalding/ScaldingILoop.scala @@ -0,0 +1,109 @@ +/* Copyright 2013 Twitter, inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.zeppelin.scalding; + +import java.io.File + +import scala.tools.nsc.interpreter.IR +import scala.tools.nsc.GenericRunnerSettings +import scala.tools.nsc.interpreter.{JPrintWriter, ILoop} + +import java.io.{BufferedReader, FileReader} + +/** + * A class providing Scalding specific commands for inclusion in the Scalding REPL. + */ + class ScaldingILoop(in0: Option[BufferedReader], out: JPrintWriter) + extends ILoop(in0, out) { + // def this(in0: BufferedReader, out: JPrintWriter) = this(Some(in0), out) + // def this() = this(None, new JPrintWriter(Console.out, true)) + + settings = new GenericRunnerSettings({ s => echo(s) }) + + override def printWelcome() { + val fc = Console.YELLOW + val wc = Console.RED + def wrapFlames(s: String) = s.replaceAll("[()]+", fc + "$0" + wc) + echo(fc + + " ( \n" + + " )\\ ) ( ( \n" + + "(()/( ) )\\ )\\ ) ( ( ( \n" + + " /(_)) ( ( /( ((_)(()/( )\\ ( )\\))( \n" + + "(_)) )\\ )( )) _ ((_)(( ) )\\ ) (( ))\\ \n".replaceAll("_", wc + "_" + fc) + wc + + wrapFlames("/ __|((_) ((_)_ | | _| | (_) _(_(( (_()_) \n") + + wrapFlames("\\__ \\/ _| / _` || |/ _` | | || ' \\))/ _` \\ \n") + + "|___/\\__| \\__,_||_|\\__,_| |_||_||_| \\__, | \n" + + " |___/ ") + } + + /** + * Commands specific to the Scalding REPL. To define a new command use one of the following + * factory methods: + * - `LoopCommand.nullary` for commands that take no arguments + * - `LoopCommand.cmd` for commands that take one string argument + * - `LoopCommand.varargs` for commands that take multiple string arguments + */ + private val scaldingCommands: List[LoopCommand] = List() + + /** + * Change the shell prompt to read scalding> + * + * @return a prompt string to use for this REPL. + */ + override def prompt: String = Console.BLUE + "\nscalding> " + Console.RESET + + private[this] def addImports(ids: String*): IR.Result = + if (ids.isEmpty) IR.Success + else intp.interpret("import " + ids.mkString(", ")) + + /** + * Search for files with the given name in all directories from current directory + * up to root. + */ + private def findAllUpPath(filename: String): List[File] = + Iterator.iterate(System.getProperty("user.dir"))(new File(_).getParent) + .takeWhile(_ != "/") + .flatMap(new File(_).listFiles.filter(_.toString.endsWith(filename))) + .toList + + /** + * Gets the list of commands that this REPL supports. + * + * @return a list of the command supported by this REPL. + */ + override def commands: List[LoopCommand] = super.commands ++ scaldingCommands + + protected def imports: List[String] = List( + "com.twitter.scalding._", + "com.twitter.scalding.ReplImplicits._", + "com.twitter.scalding.ReplImplicitContext._", + "com.twitter.scalding.ReplState._") + + override def createInterpreter() { + super.createInterpreter() + intp.beQuietDuring { + addImports(imports: _*) + + settings match { + case s: GenericRunnerSettings => + findAllUpPath(".scalding_repl").reverse.foreach { + f => s.loadfiles.appendToValue(f.toString) + } + case _ => () + } + } + } +} From 36a2dace020bea6bf9787778bfa6bf2ca5900132 Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Fri, 18 Dec 2015 11:58:30 -0800 Subject: [PATCH 07/29] Added a link to the scalding code where the ILoop was lifted from. --- .../main/scala/org/apache/zeppelin/scalding/ScaldingILoop.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scalding/src/main/scala/org/apache/zeppelin/scalding/ScaldingILoop.scala b/scalding/src/main/scala/org/apache/zeppelin/scalding/ScaldingILoop.scala index 7fad66258fc..6ac5ff8fdfc 100644 --- a/scalding/src/main/scala/org/apache/zeppelin/scalding/ScaldingILoop.scala +++ b/scalding/src/main/scala/org/apache/zeppelin/scalding/ScaldingILoop.scala @@ -25,6 +25,8 @@ import java.io.{BufferedReader, FileReader} /** * A class providing Scalding specific commands for inclusion in the Scalding REPL. + * This is currently forked from Scalding, but should eventually make it into Scalding itself: + * https://github.com/twitter/scalding/blob/develop/scalding-repl/src/main/scala/com/twitter/scalding/ScaldingILoop.scala */ class ScaldingILoop(in0: Option[BufferedReader], out: JPrintWriter) extends ILoop(in0, out) { From c27ec48ff73093ebfd9a71a3f0d31b9626edc91c Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Mon, 21 Dec 2015 14:25:34 -0800 Subject: [PATCH 08/29] Formatting, license --- scalding/pom.xml | 12 ++++----- .../zeppelin/scalding/ScaldingILoop.scala | 26 ++++++++++--------- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/scalding/pom.xml b/scalding/pom.xml index 3805487a678..6ba01b16111 100644 --- a/scalding/pom.xml +++ b/scalding/pom.xml @@ -54,12 +54,12 @@ ${project.version} provided - - - org.apache.commons - commons-exec - 1.3 - + + + org.apache.commons + commons-exec + 1.3 + org.slf4j diff --git a/scalding/src/main/scala/org/apache/zeppelin/scalding/ScaldingILoop.scala b/scalding/src/main/scala/org/apache/zeppelin/scalding/ScaldingILoop.scala index 6ac5ff8fdfc..434e033ad7f 100644 --- a/scalding/src/main/scala/org/apache/zeppelin/scalding/ScaldingILoop.scala +++ b/scalding/src/main/scala/org/apache/zeppelin/scalding/ScaldingILoop.scala @@ -1,18 +1,20 @@ -/* Copyright 2013 Twitter, inc. +/* + * 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 * - * 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 * - * 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. + * 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.scalding; import java.io.File From 368dc042ef71c08d3e0b5ccc879bef0b1bce2da1 Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Mon, 21 Dec 2015 15:00:25 -0800 Subject: [PATCH 09/29] Cleaning up imports, comments, etc --- scalding/pom.xml | 10 ---------- .../zeppelin/scalding/ScaldingInterpreter.java | 16 +++++++++------- .../apache/zeppelin/scalding/ScaldingILoop.scala | 8 +++----- 3 files changed, 12 insertions(+), 22 deletions(-) diff --git a/scalding/pom.xml b/scalding/pom.xml index 6ba01b16111..3d76e0d604e 100644 --- a/scalding/pom.xml +++ b/scalding/pom.xml @@ -60,16 +60,6 @@ commons-exec 1.3 - - - org.slf4j - slf4j-api - - - - org.slf4j - slf4j-log4j12 - junit diff --git a/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java b/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java index 2a4c744e104..40f7ffd7278 100644 --- a/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java +++ b/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java @@ -17,16 +17,16 @@ package org.apache.zeppelin.scalding; +import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.PrintStream; +import java.io.PrintWriter; import java.util.Properties; +import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.LinkedList; import java.net.URL; import java.net.URLClassLoader; -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; -import java.io.PrintWriter; import org.apache.zeppelin.interpreter.Interpreter; import org.apache.zeppelin.interpreter.InterpreterContext; @@ -34,11 +34,10 @@ import org.apache.zeppelin.interpreter.InterpreterResult.Code; import org.apache.zeppelin.scheduler.Scheduler; import org.apache.zeppelin.scheduler.SchedulerFactory; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; -//import com.twitter.scalding.ScaldingILoop; - import scala.Console; import scala.Some; import scala.None; @@ -259,7 +258,9 @@ private Code getResultCode(scala.tools.nsc.interpreter.Results.Result r) { } @Override - public void cancel(InterpreterContext context) {} + public void cancel(InterpreterContext context) { + // not implemented + } @Override public FormType getFormType() { @@ -268,6 +269,7 @@ public FormType getFormType() { @Override public int getProgress(InterpreterContext context) { + // not implemented - return 0 return 0; } diff --git a/scalding/src/main/scala/org/apache/zeppelin/scalding/ScaldingILoop.scala b/scalding/src/main/scala/org/apache/zeppelin/scalding/ScaldingILoop.scala index 434e033ad7f..bd23c4937f5 100644 --- a/scalding/src/main/scala/org/apache/zeppelin/scalding/ScaldingILoop.scala +++ b/scalding/src/main/scala/org/apache/zeppelin/scalding/ScaldingILoop.scala @@ -14,16 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - + package org.apache.zeppelin.scalding; -import java.io.File +import java.io.{BufferedReader, File, FileReader} -import scala.tools.nsc.interpreter.IR import scala.tools.nsc.GenericRunnerSettings -import scala.tools.nsc.interpreter.{JPrintWriter, ILoop} +import scala.tools.nsc.interpreter.{ILoop, IR, JPrintWriter} -import java.io.{BufferedReader, FileReader} /** * A class providing Scalding specific commands for inclusion in the Scalding REPL. From 7ec294138078bc3a196e985a3c3f211c51fe2566 Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Mon, 21 Dec 2015 15:22:08 -0800 Subject: [PATCH 10/29] More code cleanup --- .../zeppelin/scalding/ScaldingInterpreter.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java b/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java index 40f7ffd7278..6e4294bdf4b 100644 --- a/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java +++ b/scalding/src/main/java/org/apache/zeppelin/scalding/ScaldingInterpreter.java @@ -21,10 +21,11 @@ import java.io.File; import java.io.PrintStream; import java.io.PrintWriter; -import java.util.Properties; +import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Properties; import java.net.URL; import java.net.URLClassLoader; @@ -54,6 +55,8 @@ public class ScaldingInterpreter extends Interpreter { Logger logger = LoggerFactory.getLogger(ScaldingInterpreter.class); + public static final List NO_COMPLETION = new ArrayList<>(); + static { Interpreter.register("scalding", ScaldingInterpreter.class.getName()); } @@ -177,7 +180,7 @@ public void close() { @Override public InterpreterResult interpret(String cmd, InterpreterContext contextInterpreter) { - logger.info("Run Scalding command '" + cmd + "'"); + logger.info("Running Scalding command '" + cmd + "'"); if (cmd == null || cmd.trim().length() == 0) { return new InterpreterResult(Code.SUCCESS); @@ -222,7 +225,6 @@ public InterpreterResult interpretInput(String[] lines) { try { res = interpreter.intp().interpret(incomplete + s); } catch (Exception e) { - e.printStackTrace(); logger.error("Interpreter exception: ", e); return new InterpreterResult(Code.ERROR, e.getMessage()); } @@ -264,12 +266,12 @@ public void cancel(InterpreterContext context) { @Override public FormType getFormType() { - return FormType.SIMPLE; + return FormType.NATIVE; } @Override public int getProgress(InterpreterContext context) { - // not implemented - return 0 + // fine-grained progress not implemented - return 0 return 0; } @@ -281,7 +283,6 @@ public Scheduler getScheduler() { @Override public List completion(String buf, int cursor) { - return null; + return NO_COMPLETION; } - } From 7a9ceeb5b801017fb7354ef5b3d0e2b3256d7ae9 Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Mon, 21 Dec 2015 16:04:21 -0800 Subject: [PATCH 11/29] Adding some tests for the Scalding interpreter --- .../scalding/ScaldingInterpreterTest.java | 126 ++++++++++++++++++ 1 file changed, 126 insertions(+) create mode 100644 scalding/src/test/java/org/apache/zeppelin/scalding/ScaldingInterpreterTest.java diff --git a/scalding/src/test/java/org/apache/zeppelin/scalding/ScaldingInterpreterTest.java b/scalding/src/test/java/org/apache/zeppelin/scalding/ScaldingInterpreterTest.java new file mode 100644 index 00000000000..21b0e8f3a5a --- /dev/null +++ b/scalding/src/test/java/org/apache/zeppelin/scalding/ScaldingInterpreterTest.java @@ -0,0 +1,126 @@ +/* + * 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.scalding; + +import static org.junit.Assert.*; + +import java.io.File; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Properties; + +import org.apache.zeppelin.display.AngularObjectRegistry; +import org.apache.zeppelin.display.GUI; +import org.apache.zeppelin.interpreter.InterpreterContext; +import org.apache.zeppelin.interpreter.InterpreterContextRunner; +import org.apache.zeppelin.interpreter.InterpreterGroup; +import org.apache.zeppelin.interpreter.InterpreterResult; +import org.apache.zeppelin.interpreter.InterpreterResult.Code; +import org.junit.After; +import org.junit.Before; +import org.junit.FixMethodOrder; +import org.junit.Test; +import org.junit.runners.MethodSorters; + +@FixMethodOrder(MethodSorters.NAME_ASCENDING) +public class ScaldingInterpreterTest { + public static ScaldingInterpreter repl; + private InterpreterContext context; + private File tmpDir; + + @Before + public void setUp() throws Exception { + tmpDir = new File(System.getProperty("java.io.tmpdir") + "/ZeppelinLTest_" + System.currentTimeMillis()); + System.setProperty("zeppelin.dep.localrepo", tmpDir.getAbsolutePath() + "/local-repo"); + + tmpDir.mkdirs(); + + if (repl == null) { + Properties p = new Properties(); + + repl = new ScaldingInterpreter(p); + repl.open(); + } + + InterpreterGroup intpGroup = new InterpreterGroup(); + context = new InterpreterContext("note", "id", "title", "text", + new HashMap(), new GUI(), new AngularObjectRegistry( + intpGroup.getId(), null), + new LinkedList()); + } + + @After + public void tearDown() throws Exception { + delete(tmpDir); + repl.close(); + } + + private void delete(File file) { + if (file.isFile()) file.delete(); + else if (file.isDirectory()) { + File[] files = file.listFiles(); + if (files != null && files.length > 0) { + for (File f : files) { + delete(f); + } + } + file.delete(); + } + } + + @Test + public void testBasicIntp() { + assertEquals(InterpreterResult.Code.SUCCESS, + repl.interpret("val a = 1\nval b = 2", context).code()); + + // when interpret incomplete expression + InterpreterResult incomplete = repl.interpret("val a = \"\"\"", context); + assertEquals(InterpreterResult.Code.INCOMPLETE, incomplete.code()); + assertTrue(incomplete.message().length() > 0); // expecting some error + // message + } + + @Test + public void testBasicScalding() { + assertEquals(InterpreterResult.Code.SUCCESS, + repl.interpret("case class Sale(state: String, name: String, sale: Int)\n" + + "val salesList = List(Sale(\"CA\", \"A\", 60), Sale(\"CA\", \"A\", 20), Sale(\"VA\", \"B\", 15))\n" + + "val salesPipe = TypedPipe.from(salesList)\n" + + "val results = salesPipe.map{x => (1, Set(x.state), x.sale)}.\n" + + " groupAll.sum.values.map{ case(count, set, sum) => (count, set.size, sum) }\n" + + "results.dump", + context).code()); + } + + @Test + public void testNextLineInvocation() { + assertEquals(InterpreterResult.Code.SUCCESS, repl.interpret("\"123\"\n.toInt", context).code()); + } + + @Test + public void testEndWithComment() { + assertEquals(InterpreterResult.Code.SUCCESS, repl.interpret("val c=1\n//comment", context).code()); + } + + @Test + public void testReferencingUndefinedVal() { + InterpreterResult result = repl.interpret("def category(min: Int) = {" + + " if (0 <= value) \"error\"" + "}", context); + assertEquals(Code.ERROR, result.code()); + } +} From 91b0692c0aaa2714e44df56f943511ec4fad9acd Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Thu, 24 Dec 2015 21:54:54 -0800 Subject: [PATCH 12/29] adding ScaldingInterpreter --- .../java/org/apache/zeppelin/conf/ZeppelinConfiguration.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java index a4d23e93ef5..d044d121063 100755 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java @@ -414,7 +414,8 @@ public static enum ConfVars { + "org.apache.zeppelin.geode.GeodeOqlInterpreter," + "org.apache.zeppelin.postgresql.PostgreSqlInterpreter," + "org.apache.zeppelin.kylin.KylinInterpreter," - + "org.apache.zeppelin.elasticsearch.ElasticsearchInterpreter"), + + "org.apache.zeppelin.elasticsearch.ElasticsearchInterpreter", + + "org.apache.zeppelin.scalding.ScaldingInterpreter"), ZEPPELIN_INTERPRETER_DIR("zeppelin.interpreter.dir", "interpreter"), ZEPPELIN_INTERPRETER_CONNECT_TIMEOUT("zeppelin.interpreter.connect.timeout", 30000), ZEPPELIN_ENCODING("zeppelin.encoding", "UTF-8"), From 8004b3945ee0121f09c0aaa2e760678f71c44647 Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Thu, 24 Dec 2015 22:03:39 -0800 Subject: [PATCH 13/29] Fixing a typo --- .../java/org/apache/zeppelin/conf/ZeppelinConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java index d044d121063..885b1cc525d 100755 --- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java +++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java @@ -414,7 +414,7 @@ public static enum ConfVars { + "org.apache.zeppelin.geode.GeodeOqlInterpreter," + "org.apache.zeppelin.postgresql.PostgreSqlInterpreter," + "org.apache.zeppelin.kylin.KylinInterpreter," - + "org.apache.zeppelin.elasticsearch.ElasticsearchInterpreter", + + "org.apache.zeppelin.elasticsearch.ElasticsearchInterpreter," + "org.apache.zeppelin.scalding.ScaldingInterpreter"), ZEPPELIN_INTERPRETER_DIR("zeppelin.interpreter.dir", "interpreter"), ZEPPELIN_INTERPRETER_CONNECT_TIMEOUT("zeppelin.interpreter.connect.timeout", 30000), From d4cf3085cdf32ad7c29b95463a1b81c67bc405e3 Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Fri, 25 Dec 2015 14:10:56 -0800 Subject: [PATCH 14/29] Adding docs for the Scalding interpreter --- .../themes/zeppelin/_navigation.html | 1 + .../docs-img/scalding-InterpreterBinding.png | Bin 0 -> 13029 bytes .../scalding-InterpreterSelection.png | Bin 0 -> 24926 bytes .../zeppelin/img/docs-img/scalding-pie.png | Bin 0 -> 98697 bytes docs/docs.md | 1 + docs/interpreter/scalding.md | 71 ++++++++++++++++++ 6 files changed, 73 insertions(+) create mode 100644 docs/assets/themes/zeppelin/img/docs-img/scalding-InterpreterBinding.png create mode 100644 docs/assets/themes/zeppelin/img/docs-img/scalding-InterpreterSelection.png create mode 100644 docs/assets/themes/zeppelin/img/docs-img/scalding-pie.png create mode 100644 docs/interpreter/scalding.md diff --git a/docs/_includes/themes/zeppelin/_navigation.html b/docs/_includes/themes/zeppelin/_navigation.html index 2c6228275d7..5b2da51abc1 100644 --- a/docs/_includes/themes/zeppelin/_navigation.html +++ b/docs/_includes/themes/zeppelin/_navigation.html @@ -45,6 +45,7 @@
  • Lens
  • Markdown
  • Postgresql, hawq
  • +
  • Scalding
  • Shell
  • Spark
  • Tajo
  • diff --git a/docs/assets/themes/zeppelin/img/docs-img/scalding-InterpreterBinding.png b/docs/assets/themes/zeppelin/img/docs-img/scalding-InterpreterBinding.png new file mode 100644 index 0000000000000000000000000000000000000000..113131031ee386a81607580932e18ff6b3882baf GIT binary patch literal 13029 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 literal 0 HcmV?d00001 diff --git a/docs/assets/themes/zeppelin/img/docs-img/scalding-InterpreterSelection.png b/docs/assets/themes/zeppelin/img/docs-img/scalding-InterpreterSelection.png new file mode 100644 index 0000000000000000000000000000000000000000..c52f4e3d87ec1185f9577907eae54dffda245c24 GIT binary patch literal 24926 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 literal 0 HcmV?d00001 diff --git a/docs/assets/themes/zeppelin/img/docs-img/scalding-pie.png b/docs/assets/themes/zeppelin/img/docs-img/scalding-pie.png new file mode 100644 index 0000000000000000000000000000000000000000..bb010257ecb2a38ceb40b7064bb620aa15b5e85d GIT binary patch literal 98697 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

    gKf<8Bs6rZK)?`*~W`Q#G2Z{f_F8+jAVDU2wt6 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%0Dbj?)Ncd2H79 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 literal 0 HcmV?d00001 diff --git a/docs/docs.md b/docs/docs.md index a2347a8ad36..b70ee58e116 100644 --- a/docs/docs.md +++ b/docs/docs.md @@ -41,6 +41,7 @@ limitations under the License. * [lens](./interpreter/lens.html) * [md](./interpreter/markdown.html) * [postgresql, hawq](./interpreter/postgresql.html) +* [scalding](./interpreter/scalding.html) * [sh](./pleasecontribute.html) * [spark](./interpreter/spark.html) * [tajo](./pleasecontribute.html) diff --git a/docs/interpreter/scalding.md b/docs/interpreter/scalding.md new file mode 100644 index 00000000000..bacf96ac2ce --- /dev/null +++ b/docs/interpreter/scalding.md @@ -0,0 +1,71 @@ +--- +layout: page +title: "Scalding Interpreter" +description: "" +group: manual +--- +{% include JB/setup %} + + +## Scalding Interpreter for Apache Zeppelin +[Scalding](https://github.com/twitter/scalding) is an open source Scala library for writing MapReduce jobs. + +### Enabling the Scalding Interpreter + + In a notebook, to enable the **Scalding** interpreter, click on the **Gear** icon,select **Scalding**, and hit **Save**. + +

    + ![Interpreter Binding](../assets/themes/zeppelin/img/docs-img/scalding-InterpreterBinding.png) + + ![Interpreter Selection](../assets/themes/zeppelin/img/docs-img/scalding-InterpreterSelection.png) +
    + +### Configuring the Interpreter +Zeppelin comes with a pre-configured Scalding interpreter in local mode, so you do not need to install anything. + +### Testing the Interpreter + +In example, by using the [Alice in Wonderland](https://gist.github.com/johnynek/a47699caa62f4f38a3e2) tutorial, we will count words (of course!), and plot a graph of the top 10 words in the book. + +``` +%scalding + +import scala.io.Source + +// Get the Alice in Wonderland book from gutenberg.org: +val alice = Source.fromURL("http://www.gutenberg.org/files/11/11.txt").getLines +val aliceLineNum = alice.zipWithIndex.toList +val alicePipe = TypedPipe.from(aliceLineNum) + +// Now get a list of words for the book: +val aliceWords = alicePipe.flatMap { case (text, _) => text.split("\\s+").toList } + +// Now lets add a count for each word: +val aliceWithCount = aliceWords.filterNot(_.equals("")).map { word => (word, 1L) } + +// let's sum them for each word: +val wordCount = aliceWithCount.group.sum + +print ("Here are the top 10 words\n") +val top10 = wordCount + .groupAll + .sortBy { case (word, count) => -count } + .take(10) +top10.dump + +``` +``` +%scalding + +val table = "words\t count\n" + top10.toIterator.map{case (k, (word, count)) => s"$word\t$count"}.mkString("\n") +print("%table " + table) + +``` + +If you click on the icon for the pie chart, you should be able to see a chart like this: +![Scalding - Pie - Chart](../assets/themes/zeppelin/img/docs-img/scalding-pie.png) + +### Current Status & Future Work +The current implementation of the Scalding interpreter does not support canceling jobs, or fine-grained progress updates. + +The pre-configured Scalding interpreter only supports Scalding in local mode. Hadoop mode for Scalding is currently unsupported, and will be future work (contributions welcome!). \ No newline at end of file From 5c8056cb1b886dcec18ccebc1e8aad9ec878edfa Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Sun, 27 Dec 2015 22:25:15 -0800 Subject: [PATCH 15/29] Making the Scalding scala jars same as the Spark ones for consistency --- scalding/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scalding/pom.xml b/scalding/pom.xml index 3d76e0d604e..a6af82a51e7 100644 --- a/scalding/pom.xml +++ b/scalding/pom.xml @@ -34,8 +34,8 @@ http://zeppelin.incubator.apache.org - 2.10.5 - 2.5.0 + 2.10.4 + 2.3.0 0.15.1-RC13 From 083f05904bc110012bffdc1c1a1b2da295789f26 Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Sun, 27 Dec 2015 23:27:34 -0800 Subject: [PATCH 16/29] Trimming deps down from hadoop-client to just hadoop-common. Scalding REPL needs org.apache.hadoop.conf.Configuration even in local mode. --- scalding/pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scalding/pom.xml b/scalding/pom.xml index a6af82a51e7..abc1e2b88ba 100644 --- a/scalding/pom.xml +++ b/scalding/pom.xml @@ -97,9 +97,10 @@ ${scala.version}
    + org.apache.hadoop - hadoop-client + hadoop-common ${hadoop.version} From dd8a4c87e193a221a930c3335db99666f5b26c2e Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Sun, 27 Dec 2015 23:40:36 -0800 Subject: [PATCH 17/29] Adding Scalding licenses --- zeppelin-distribution/src/bin_license/LICENSE | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/zeppelin-distribution/src/bin_license/LICENSE b/zeppelin-distribution/src/bin_license/LICENSE index 52ce3ebc7f2..8f2197fc140 100644 --- a/zeppelin-distribution/src/bin_license/LICENSE +++ b/zeppelin-distribution/src/bin_license/LICENSE @@ -92,7 +92,11 @@ The following components are provided under Apache License. (Apache 2.0) Elasticsearch: Core (org.elasticsearch:elasticsearch:2.1.0 - http://nexus.sonatype.org/oss-repository-hosting.html/parent/elasticsearch) (Apache 2.0) Joda convert (org.joda:joda-convert:1.2 - http://joda-convert.sourceforge.net) (Apache 2.0) SnakeYAML (org.yaml:snakeyaml:1.15 - http://www.snakeyaml.org) - + (Apache 2.0) Scalding Core (com.twitter:scalding-core_2.10:jar:0.15.1-RC13 - https://github.com/twitter/scalding) + (Apache 2.0) Scalding Args (com.twitter:scalding-args_2.10:jar:0.15.1-RC13 - https://github.com/twitter/scalding) + (Apache 2.0) Scalding Date (com.twitter:scalding-date_2.10:jar:0.15.1-RC13 - https://github.com/twitter/scalding) + (Apache 2.0) Scalding Serialization (com.twitter:scalding-serialization_2.10:jar:0.15.1-RC13 - https://github.com/twitter/scalding) + (Apache 2.0) Scalding Maple (com.twitter:maple:jar:0.15.1-RC13 - https://github.com/twitter/scalding/tree/develop/maple) ======================================================================== From 460658ab53a9c150f2e54f072a35e4aaad5640de Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Mon, 28 Dec 2015 00:02:04 -0800 Subject: [PATCH 18/29] Adding Cascading dependencies --- zeppelin-distribution/src/bin_license/LICENSE | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/zeppelin-distribution/src/bin_license/LICENSE b/zeppelin-distribution/src/bin_license/LICENSE index 8f2197fc140..eb1f07d3c32 100644 --- a/zeppelin-distribution/src/bin_license/LICENSE +++ b/zeppelin-distribution/src/bin_license/LICENSE @@ -97,6 +97,10 @@ The following components are provided under Apache License. (Apache 2.0) Scalding Date (com.twitter:scalding-date_2.10:jar:0.15.1-RC13 - https://github.com/twitter/scalding) (Apache 2.0) Scalding Serialization (com.twitter:scalding-serialization_2.10:jar:0.15.1-RC13 - https://github.com/twitter/scalding) (Apache 2.0) Scalding Maple (com.twitter:maple:jar:0.15.1-RC13 - https://github.com/twitter/scalding/tree/develop/maple) + (Apache 2.0) Cascading (cascading:cascading-core:jar:2.6.1 - https://github.com/Cascading/cascading) + (Apache 2.0) Cascading Hadoop (cascading:cascading-hadoop:jar:2.6.1 - https://github.com/Cascading/cascading) + (Apache 2.0) Cascading Local (cascading:cascading-local:jar:2.6.1 - https://github.com/Cascading/cascading) + (Apache 2.0) Riffle (riffle:riffle:jar:0.1-dev - https://github.com/cwensel/riffle) ======================================================================== @@ -169,8 +173,8 @@ The following components are provided under the BSD-style License. (BSD-like) ASM (asm:asm:jar:3.1 - http://asm.ow2.org/) - Copyright (c) 2000-2011 INRIA, France Telecom (New BSD License) Py4J (net.sf.py4j:py4j:0.9 - http://py4j.sourceforge.net/) (New BSD License) Markdown4j (org.commonjava.googlecode.markdown4j:markdown4j:jar:2.2-cj-1.0 - https://code.google.com/p/markdown4j/) - - + (New BSD License) Janino (org.codehaus.janino:janino:jar:2.7.5 - http://janino.net/) + (New BSD License) Janino Commons Compiler (org.codehaus.janino:commons-compiler:jar:2.7.5 - http://janino.net/) ======================================================================== CDDL license @@ -215,4 +219,9 @@ Creative Commons CC0 (http://creativecommons.org/publicdomain/zero/1.0/) (CC0 1.0 Universal) JSR166e (com.twitter:jsr166e:1.1.0 - http://github.com/twitter/jsr166e) (Public Domain, per Creative Commons CC0) HdrHistogram (org.hdrhistogram:HdrHistogram:2.1.6 - http://hdrhistogram.github.io/HdrHistogram/) - + +======================================================================== +Unknown license +======================================================================== + (Unknown license) jgrapht-jdk1.6 (thirdparty:jgrapht-jdk1.6:0.8.1 - no url defined) + From 6019cc87dd24ca24db74e5b02a1726d8c58423fe Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Mon, 28 Dec 2015 00:23:43 -0800 Subject: [PATCH 19/29] More licenses. Only remaining ones are the dependencies of hadoop-common. --- zeppelin-distribution/src/bin_license/LICENSE | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/zeppelin-distribution/src/bin_license/LICENSE b/zeppelin-distribution/src/bin_license/LICENSE index eb1f07d3c32..3f881842820 100644 --- a/zeppelin-distribution/src/bin_license/LICENSE +++ b/zeppelin-distribution/src/bin_license/LICENSE @@ -1,7 +1,7 @@ (Apache 2.0) nvd3.js v1.1.15-beta (http://nvd3.org/) - https://github.com/novus/nvd3/blob/v1.1.15-beta/LICENSE.md (Apache 2.0) gson v2.2 (com.google.code.gson:gson:jar:2.2 - https://github.com/google/gson) - https://github.com/google/gson/blob/gson-2.2/LICENSE (Apache 2.0) Amazon Web Services SDK for Java v1.10.1 (https://aws.amazon.com/sdk-for-java/) - https://raw.githubusercontent.com/aws/aws-sdk-java/1.10.1/LICENSE.txt - (Apache 2.0) JavaEWAH v0.7.9 (https://github.com/lemire/javaewah) - https://github.com/lemire/javaewah/blob/master/LICENSE-2.0.txt + (Apache 2.0) JavaEWAH v0.7.9, v0.6.6 (https://github.com/lemire/javaewah) - https://github.com/lemire/javaewah/blob/master/LICENSE-2.0.txt The following components are provided under Apache License. @@ -95,13 +95,22 @@ The following components are provided under Apache License. (Apache 2.0) Scalding Core (com.twitter:scalding-core_2.10:jar:0.15.1-RC13 - https://github.com/twitter/scalding) (Apache 2.0) Scalding Args (com.twitter:scalding-args_2.10:jar:0.15.1-RC13 - https://github.com/twitter/scalding) (Apache 2.0) Scalding Date (com.twitter:scalding-date_2.10:jar:0.15.1-RC13 - https://github.com/twitter/scalding) + (Apache 2.0) Scalding REPL (com.twitter:scalding-repl_2.10:jar:0.15.1-RC13 - https://github.com/twitter/scalding) (Apache 2.0) Scalding Serialization (com.twitter:scalding-serialization_2.10:jar:0.15.1-RC13 - https://github.com/twitter/scalding) (Apache 2.0) Scalding Maple (com.twitter:maple:jar:0.15.1-RC13 - https://github.com/twitter/scalding/tree/develop/maple) (Apache 2.0) Cascading (cascading:cascading-core:jar:2.6.1 - https://github.com/Cascading/cascading) (Apache 2.0) Cascading Hadoop (cascading:cascading-hadoop:jar:2.6.1 - https://github.com/Cascading/cascading) (Apache 2.0) Cascading Local (cascading:cascading-local:jar:2.6.1 - https://github.com/Cascading/cascading) (Apache 2.0) Riffle (riffle:riffle:jar:0.1-dev - https://github.com/cwensel/riffle) - + (Apache 2.0) Chill Hadoop (com.twitter:chill-hadoop:jar:0.7.0 - https://github.com/twitter/chill) + (Apache 2.0) Chill Java (com.twitter:chill-java:jar:0.7.0 - https://github.com/twitter/chill) + (Apache 2.0) Chill Algebird (com.twitter:chill-algebird_2.10:jar:0.7.0 - https://github.com/twitter/chill) + (Apache 2.0) Chill Scala (com.twitter:chill_2.10:jar:0.7.0 - https://github.com/twitter/chill) + (Apache 2.0) Algebird (com.twitter:algebird-core_2.10:jar:0.11.0 - https://github.com/twitter/algebird) + (Apache 2.0) Bijection Core (com.twitter:bijection-core_2.10:jar:0.8.1 - https://github.com/twitter/bijection) + (Apache 2.0) Bijection Macros (com.twitter:bijection-macros_2.10:jar:0.8.1 - https://github.com/twitter/bijection) + (Apache 2.0) Scala Test (org.scalatest:scalatest_2.10:jar:2.2.2 - http://www.scalatest.org/) + (Apache 2.0) Hadoop Common (org.apache.hadoop:hadoop-common:jar:2.5.0 - http://hadoop.apache.org) ======================================================================== MIT licenses @@ -170,6 +179,7 @@ The following components are provided under the BSD-style License. (BSD-like) Scala Actors library (org.scala-lang:scala-actors:2.10.4 - http://www.scala-lang.org/) (BSD-like) Scala Compiler (org.scala-lang:scala-compiler:2.10.4 - http://www.scala-lang.org/) (BSD-like) Scala Compiler (org.scala-lang:scala-reflect:2.10.4 - http://www.scala-lang.org/) + (BSD-like) Scala Macros Quasiquotes (org.scalamacros:quasiquotes_2.10:jar:2.0.1 - http://docs.scala-lang.org/overviews/quasiquotes/intro.html) (BSD-like) ASM (asm:asm:jar:3.1 - http://asm.ow2.org/) - Copyright (c) 2000-2011 INRIA, France Telecom (New BSD License) Py4J (net.sf.py4j:py4j:0.9 - http://py4j.sourceforge.net/) (New BSD License) Markdown4j (org.commonjava.googlecode.markdown4j:markdown4j:jar:2.2-cj-1.0 - https://code.google.com/p/markdown4j/) From 8be8d22bceb6511b6d26beb28085212693b8b1ae Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Mon, 28 Dec 2015 00:59:30 -0800 Subject: [PATCH 20/29] Went thru and added all licenses I could find --- licenses/LICENSE-paranamer-2.3 | 824 +++++++++++++++++ licenses/LICENSE-protobuf-2.5.0 | 843 ++++++++++++++++++ licenses/LICENSE-xmlenc-0.52 | 27 + zeppelin-distribution/src/bin_license/LICENSE | 13 +- 4 files changed, 1705 insertions(+), 2 deletions(-) create mode 100644 licenses/LICENSE-paranamer-2.3 create mode 100644 licenses/LICENSE-protobuf-2.5.0 create mode 100644 licenses/LICENSE-xmlenc-0.52 diff --git a/licenses/LICENSE-paranamer-2.3 b/licenses/LICENSE-paranamer-2.3 new file mode 100644 index 00000000000..ed1e2582143 --- /dev/null +++ b/licenses/LICENSE-paranamer-2.3 @@ -0,0 +1,824 @@ + + + + + + + + + + + + + + paranamer/LICENSE.txt at master · paul-hammant/paranamer · GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + + + + + + + + + + + + +
    + +
    +
    + + +
    +
    +
    + + + +
    +
    + + + + + + + + + + +
    + + + 9b1c634 + + + +
    + + paul + fix license anomaly +
    + + + + +
    + +
    +
    +
    + +
    + Raw + Blame + History +
    + + + + +
    + +
    + executable file + + 28 lines (25 sloc) + + 1.62 KB +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    [ ParaNamer used to be 'Pubic Domain', but since it includes a small piece of ASM it is now the same license as that: BSD ]
    +
    Copyright (c) 2006 Paul Hammant & ThoughtWorks Inc
    All rights reserved.
    +
    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:
    1. Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.
    3. Neither the name of the copyright holders nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.
    +
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
    THE POSSIBILITY OF SUCH DAMAGE.
    + +
    + +
    + +Jump to Line + + +
    + +
    + +
    +
    + +
    + +
    + +
    + + + + + + + +
    + + + Something went wrong with that request. Please try again. +
    + + + + + + + + + + + diff --git a/licenses/LICENSE-protobuf-2.5.0 b/licenses/LICENSE-protobuf-2.5.0 new file mode 100644 index 00000000000..ac156080b04 --- /dev/null +++ b/licenses/LICENSE-protobuf-2.5.0 @@ -0,0 +1,843 @@ + + + + + + + + + + + + + + protobuf/LICENSE at master · google/protobuf · GitHub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to content + + + + + + + + + + + + +
    + +
    +
    + + +
    +
    +
    + + + +
    +
    + + + + + + + +
    + +
    + + + +
    + +
    + + Find file + + +
    + +
    + + +
    + + + 2a50e67 + + + + + + + + +
    + +
    +
    +
    + +
    + Raw + Blame + History +
    + + + + +
    + +
    + 43 lines (35 sloc) + + 2.08 KB +
    +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    This license applies to all parts of Protocol Buffers except the following:
    +
    - Atomicops support for generic gcc, located in
    src/google/protobuf/stubs/atomicops_internals_generic_gcc.h.
    This file is copyrighted by Red Hat Inc.
    +
    - Atomicops support for AIX/POWER, located in
    src/google/protobuf/stubs/atomicops_internals_power.h.
    This file is copyrighted by Bloomberg Finance LP.
    +
    Copyright 2014, Google Inc. All rights reserved.
    +
    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are
    met:
    +
    * Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above
    copyright notice, this list of conditions and the following disclaimer
    in the documentation and/or other materials provided with the
    distribution.
    * Neither the name of Google Inc. nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.
    +
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    +
    Code generated by the Protocol Buffer compiler is owned by the owner
    of the input file used when generating it. This code is not
    standalone and requires a support library to be linked with it. This
    support library is itself covered by the above license.
    + +
    + +
    + +Jump to Line + + +
    + +
    + +
    +
    + +
    + +
    + +
    + + + + + + + +
    + + + Something went wrong with that request. Please try again. +
    + + + + + + + + + + + diff --git a/licenses/LICENSE-xmlenc-0.52 b/licenses/LICENSE-xmlenc-0.52 new file mode 100644 index 00000000000..3a70c9bfcda --- /dev/null +++ b/licenses/LICENSE-xmlenc-0.52 @@ -0,0 +1,27 @@ +Copyright 2003-2005, Ernst de Haan +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/zeppelin-distribution/src/bin_license/LICENSE b/zeppelin-distribution/src/bin_license/LICENSE index 3f881842820..0576603327e 100644 --- a/zeppelin-distribution/src/bin_license/LICENSE +++ b/zeppelin-distribution/src/bin_license/LICENSE @@ -111,6 +111,13 @@ The following components are provided under Apache License. (Apache 2.0) Bijection Macros (com.twitter:bijection-macros_2.10:jar:0.8.1 - https://github.com/twitter/bijection) (Apache 2.0) Scala Test (org.scalatest:scalatest_2.10:jar:2.2.2 - http://www.scalatest.org/) (Apache 2.0) Hadoop Common (org.apache.hadoop:hadoop-common:jar:2.5.0 - http://hadoop.apache.org) + (Apache 2.0) Hadoop Auth (org.apache.hadoop:hadoop-auth:jar:2.5.0 - http://hadoop.apache.org) + (Apache 2.0) Jackson Mapper ASL (org.codehaus.jackson:jackson-mapper-asl:1.9.13 - http://jackson.codehaus.org/) + (Apache 2.0) Apache Avro (org.apache.avro:avro:jar:1.7.4 - https://github.com/apache/avro) + (Apache 2.0) Apache Directory Server (org.apache.directory.server:apacheds-kerberos-codec:jar:2.0.0-M15 - https://github.com/apache/directory-server) + (Apache 2.0) Apache Directory Server i18n (org.apache.directory.server:apacheds-i18n:jar:2.0.0-M15 - https://github.com/apache/directory-server) + (Apache 2.0) Apache Directory API ASN1 (org.apache.directory.api:api-asn1-api:jar:1.0.0-M20 - https://directory.apache.org/api/) + (Apache 2.0) Apache Directory API Util (org.apache.directory.api:api-util:jar:1.0.0-M20 - https://directory.apache.org/api/) ======================================================================== MIT licenses @@ -164,8 +171,9 @@ The text of each license is also included at licenses/LICENSE-[project]-[version (BSD Style) dom4j v1.6.1 (http://www.dom4j.org) - https://github.com/dom4j/dom4j/blob/dom4j_1_6_1/LICENSE.txt (BSD Style) JSch v0.1.53 (http://www.jcraft.com) - http://www.jcraft.com/jsch/LICENSE.txt (BSD 3 Clause) highlightjs v8.4.0 (https://highlightjs.org/) - https://github.com/isagalaev/highlight.js/blob/8.4/LICENSE - - + (BSD 3 Clause) xmlenc v0.52 (http://xmlenc.sourceforge.net/) - http://xmlenc.cvs.sourceforge.net/viewvc/xmlenc/xmlenc/COPYRIGHT?view=markup&pathrev=RELEASE_0_52 + (BSD 3 Clause) Paranamer v2.3 (https://github.com/paul-hammant/paranamer) - https://github.com/paul-hammant/paranamer/blob/master/LICENSE.txt + (BSD 3 Clause) Google Protobuf v2.5.0 (https://github.com/google/protobuf) - https://github.com/google/protobuf/blob/master/LICENSE The following components are provided under the BSD-style License. @@ -234,4 +242,5 @@ Creative Commons CC0 (http://creativecommons.org/publicdomain/zero/1.0/) Unknown license ======================================================================== (Unknown license) jgrapht-jdk1.6 (thirdparty:jgrapht-jdk1.6:0.8.1 - no url defined) + (Unknown license) tukaani-xz (org.tukaani:xz:jar:1.0 - http://git.tukaani.org/?p=xz-java.git;a=blob;f=COPYING;hb=HEAD) From aaae5d1899fb793116d48e995d874c98721a3705 Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Mon, 28 Dec 2015 10:08:34 -0800 Subject: [PATCH 21/29] Moving licenses to the right location --- .../src/bin_license/licenses}/LICENSE-paranamer-2.3 | 0 .../src/bin_license/licenses}/LICENSE-protobuf-2.5.0 | 0 .../src/bin_license/licenses}/LICENSE-xmlenc-0.52 | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename {licenses => zeppelin-distribution/src/bin_license/licenses}/LICENSE-paranamer-2.3 (100%) rename {licenses => zeppelin-distribution/src/bin_license/licenses}/LICENSE-protobuf-2.5.0 (100%) rename {licenses => zeppelin-distribution/src/bin_license/licenses}/LICENSE-xmlenc-0.52 (100%) diff --git a/licenses/LICENSE-paranamer-2.3 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-paranamer-2.3 similarity index 100% rename from licenses/LICENSE-paranamer-2.3 rename to zeppelin-distribution/src/bin_license/licenses/LICENSE-paranamer-2.3 diff --git a/licenses/LICENSE-protobuf-2.5.0 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-protobuf-2.5.0 similarity index 100% rename from licenses/LICENSE-protobuf-2.5.0 rename to zeppelin-distribution/src/bin_license/licenses/LICENSE-protobuf-2.5.0 diff --git a/licenses/LICENSE-xmlenc-0.52 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-xmlenc-0.52 similarity index 100% rename from licenses/LICENSE-xmlenc-0.52 rename to zeppelin-distribution/src/bin_license/licenses/LICENSE-xmlenc-0.52 From dd0bb9a6616a4f2115413d068134876e2773edd5 Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Mon, 28 Dec 2015 10:12:04 -0800 Subject: [PATCH 22/29] Changing licenses to text format --- .../licenses/LICENSE-paranamer-2.3 | 851 +---------------- .../licenses/LICENSE-protobuf-2.5.0 | 884 +----------------- 2 files changed, 70 insertions(+), 1665 deletions(-) diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-paranamer-2.3 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-paranamer-2.3 index ed1e2582143..bf7a858d59e 100644 --- a/zeppelin-distribution/src/bin_license/licenses/LICENSE-paranamer-2.3 +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-paranamer-2.3 @@ -1,824 +1,29 @@ - - - - - - - - - - - - - - paranamer/LICENSE.txt at master · paul-hammant/paranamer · GitHub - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Skip to content - - - - - - - - - - - - -
    - -
    -
    - - -
    -
    -
    - - - -
    -
    - - - - - - - - - - -
    - - - 9b1c634 - - - -
    - - paul - fix license anomaly -
    - - - - -
    - -
    -
    -
    - -
    - Raw - Blame - History -
    - - - - -
    - -
    - executable file - - 28 lines (25 sloc) - - 1.62 KB -
    -
    - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    [ ParaNamer used to be 'Pubic Domain', but since it includes a small piece of ASM it is now the same license as that: BSD ]
    -
    Copyright (c) 2006 Paul Hammant & ThoughtWorks Inc
    All rights reserved.
    -
    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions
    are met:
    1. Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.
    2. Redistributions in binary form must reproduce the above copyright
    notice, this list of conditions and the following disclaimer in the
    documentation and/or other materials provided with the distribution.
    3. Neither the name of the copyright holders nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.
    -
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
    THE POSSIBILITY OF SUCH DAMAGE.
    - -
    - -
    - -Jump to Line - - -
    - -
    - -
    -
    - -
    - -
    - -
    - - - - - - - -
    - - - Something went wrong with that request. Please try again. -
    - - - - - - - - - - +[ ParaNamer used to be 'Pubic Domain', but since it includes a small piece of ASM it is now the same license as that: BSD ] + + Copyright (c) 2006 Paul Hammant & ThoughtWorks Inc + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the copyright holders nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + THE POSSIBILITY OF SUCH DAMAGE. diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-protobuf-2.5.0 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-protobuf-2.5.0 index ac156080b04..e6dd6d6407d 100644 --- a/zeppelin-distribution/src/bin_license/licenses/LICENSE-protobuf-2.5.0 +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-protobuf-2.5.0 @@ -1,843 +1,43 @@ - - - - - - - - - - - - - - protobuf/LICENSE at master · google/protobuf · GitHub - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Skip to content - - - - - - - - - - - - -
    - -
    -
    - - -
    -
    -
    - - - -
    -
    - - - - - - - -
    - -
    - - - -
    - -
    - - Find file - - -
    - -
    - - -
    - - - 2a50e67 - - - - - - - - -
    - -
    -
    -
    - -
    - Raw - Blame - History -
    - - - - -
    - -
    - 43 lines (35 sloc) - - 2.08 KB -
    -
    - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    This license applies to all parts of Protocol Buffers except the following:
    -
    - Atomicops support for generic gcc, located in
    src/google/protobuf/stubs/atomicops_internals_generic_gcc.h.
    This file is copyrighted by Red Hat Inc.
    -
    - Atomicops support for AIX/POWER, located in
    src/google/protobuf/stubs/atomicops_internals_power.h.
    This file is copyrighted by Bloomberg Finance LP.
    -
    Copyright 2014, Google Inc. All rights reserved.
    -
    Redistribution and use in source and binary forms, with or without
    modification, are permitted provided that the following conditions are
    met:
    -
    * Redistributions of source code must retain the above copyright
    notice, this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above
    copyright notice, this list of conditions and the following disclaimer
    in the documentation and/or other materials provided with the
    distribution.
    * Neither the name of Google Inc. nor the names of its
    contributors may be used to endorse or promote products derived from
    this software without specific prior written permission.
    -
    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    -
    Code generated by the Protocol Buffer compiler is owned by the owner
    of the input file used when generating it. This code is not
    standalone and requires a support library to be linked with it. This
    support library is itself covered by the above license.
    - -
    - -
    - -Jump to Line - - -
    - -
    - -
    -
    - -
    - -
    - -
    - - - - - - - -
    - - - Something went wrong with that request. Please try again. -
    - - - - - - - - - - +This license applies to all parts of Protocol Buffers except the following: + + - Atomicops support for generic gcc, located in + src/google/protobuf/stubs/atomicops_internals_generic_gcc.h. + This file is copyrighted by Red Hat Inc. + + - Atomicops support for AIX/POWER, located in + src/google/protobuf/stubs/atomicops_internals_power.h. + This file is copyrighted by Bloomberg Finance LP. + +Copyright 2014, Google Inc. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Code generated by the Protocol Buffer compiler is owned by the owner +of the input file used when generating it. This code is not +standalone and requires a support library to be linked with it. This +support library is itself covered by the above license. From 9a7d7337ce0c9e02e77bc6f409465effdd041c45 Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Mon, 28 Dec 2015 10:16:22 -0800 Subject: [PATCH 23/29] Moved tukanni license to a separate section and added license --- zeppelin-distribution/src/bin_license/LICENSE | 9 +++++++-- .../src/bin_license/licenses/LICENSE-tukaani-xy-1.0 | 9 +++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-tukaani-xy-1.0 diff --git a/zeppelin-distribution/src/bin_license/LICENSE b/zeppelin-distribution/src/bin_license/LICENSE index 0576603327e..021952b6450 100644 --- a/zeppelin-distribution/src/bin_license/LICENSE +++ b/zeppelin-distribution/src/bin_license/LICENSE @@ -238,9 +238,14 @@ Creative Commons CC0 (http://creativecommons.org/publicdomain/zero/1.0/) (CC0 1.0 Universal) JSR166e (com.twitter:jsr166e:1.1.0 - http://github.com/twitter/jsr166e) (Public Domain, per Creative Commons CC0) HdrHistogram (org.hdrhistogram:HdrHistogram:2.1.6 - http://hdrhistogram.github.io/HdrHistogram/) + +======================================================================== +For the org.tukaani:xz:jar:1.0 +======================================================================== + See zeppelin-distribution/src/bin_license/licenses/LICENSE-tukaani-xy-1.0 + + ======================================================================== Unknown license ======================================================================== (Unknown license) jgrapht-jdk1.6 (thirdparty:jgrapht-jdk1.6:0.8.1 - no url defined) - (Unknown license) tukaani-xz (org.tukaani:xz:jar:1.0 - http://git.tukaani.org/?p=xz-java.git;a=blob;f=COPYING;hb=HEAD) - diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-tukaani-xy-1.0 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-tukaani-xy-1.0 new file mode 100644 index 00000000000..9e87dfae826 --- /dev/null +++ b/zeppelin-distribution/src/bin_license/licenses/LICENSE-tukaani-xy-1.0 @@ -0,0 +1,9 @@ +Licensing of XZ for Java +======================== + + All the files in this package have been written by Lasse Collin + and/or Igor Pavlov. All these files have been put into the + public domain. You can do whatever you want with these files. + + This software is provided "as is", without any warranty. + From b30725f948326065ebec58f0ecca4f6a2ba33090 Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Wed, 30 Dec 2015 22:01:27 -0800 Subject: [PATCH 24/29] Making the Scalding interpreter optional as part of a new -Pscalding profile --- pom.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 44b16c2f80d..88d38aa85f6 100755 --- a/pom.xml +++ b/pom.xml @@ -91,7 +91,6 @@ markdown angular shell - scalding hive phoenix postgresql @@ -628,6 +627,13 @@ + + scalding + + scalding + + + build-distr From bc31d1e23514c9c5351d2bbe2f88cdac7fd6fa8c Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Wed, 30 Dec 2015 22:03:42 -0800 Subject: [PATCH 25/29] Getting rid of added licenses --- .../licenses/LICENSE-paranamer-2.3 | 29 ------------- .../licenses/LICENSE-protobuf-2.5.0 | 43 ------------------- .../licenses/LICENSE-tukaani-xy-1.0 | 9 ---- .../bin_license/licenses/LICENSE-xmlenc-0.52 | 27 ------------ 4 files changed, 108 deletions(-) delete mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-paranamer-2.3 delete mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-protobuf-2.5.0 delete mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-tukaani-xy-1.0 delete mode 100644 zeppelin-distribution/src/bin_license/licenses/LICENSE-xmlenc-0.52 diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-paranamer-2.3 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-paranamer-2.3 deleted file mode 100644 index bf7a858d59e..00000000000 --- a/zeppelin-distribution/src/bin_license/licenses/LICENSE-paranamer-2.3 +++ /dev/null @@ -1,29 +0,0 @@ -[ ParaNamer used to be 'Pubic Domain', but since it includes a small piece of ASM it is now the same license as that: BSD ] - - Copyright (c) 2006 Paul Hammant & ThoughtWorks Inc - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions - are met: - 1. Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - 3. Neither the name of the copyright holders nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-protobuf-2.5.0 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-protobuf-2.5.0 deleted file mode 100644 index e6dd6d6407d..00000000000 --- a/zeppelin-distribution/src/bin_license/licenses/LICENSE-protobuf-2.5.0 +++ /dev/null @@ -1,43 +0,0 @@ -This license applies to all parts of Protocol Buffers except the following: - - - Atomicops support for generic gcc, located in - src/google/protobuf/stubs/atomicops_internals_generic_gcc.h. - This file is copyrighted by Red Hat Inc. - - - Atomicops support for AIX/POWER, located in - src/google/protobuf/stubs/atomicops_internals_power.h. - This file is copyrighted by Bloomberg Finance LP. - -Copyright 2014, Google Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Code generated by the Protocol Buffer compiler is owned by the owner -of the input file used when generating it. This code is not -standalone and requires a support library to be linked with it. This -support library is itself covered by the above license. - diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-tukaani-xy-1.0 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-tukaani-xy-1.0 deleted file mode 100644 index 9e87dfae826..00000000000 --- a/zeppelin-distribution/src/bin_license/licenses/LICENSE-tukaani-xy-1.0 +++ /dev/null @@ -1,9 +0,0 @@ -Licensing of XZ for Java -======================== - - All the files in this package have been written by Lasse Collin - and/or Igor Pavlov. All these files have been put into the - public domain. You can do whatever you want with these files. - - This software is provided "as is", without any warranty. - diff --git a/zeppelin-distribution/src/bin_license/licenses/LICENSE-xmlenc-0.52 b/zeppelin-distribution/src/bin_license/licenses/LICENSE-xmlenc-0.52 deleted file mode 100644 index 3a70c9bfcda..00000000000 --- a/zeppelin-distribution/src/bin_license/licenses/LICENSE-xmlenc-0.52 +++ /dev/null @@ -1,27 +0,0 @@ -Copyright 2003-2005, Ernst de Haan -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. From 006500d34b24be08cc5d6a943320dda06ec0e4f4 Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Wed, 30 Dec 2015 22:08:41 -0800 Subject: [PATCH 26/29] Reverting all commits to LICENSE to be back to master --- zeppelin-distribution/src/bin_license/LICENSE | 52 +++---------------- 1 file changed, 7 insertions(+), 45 deletions(-) diff --git a/zeppelin-distribution/src/bin_license/LICENSE b/zeppelin-distribution/src/bin_license/LICENSE index 021952b6450..cde3a8c8be9 100644 --- a/zeppelin-distribution/src/bin_license/LICENSE +++ b/zeppelin-distribution/src/bin_license/LICENSE @@ -1,7 +1,7 @@ (Apache 2.0) nvd3.js v1.1.15-beta (http://nvd3.org/) - https://github.com/novus/nvd3/blob/v1.1.15-beta/LICENSE.md (Apache 2.0) gson v2.2 (com.google.code.gson:gson:jar:2.2 - https://github.com/google/gson) - https://github.com/google/gson/blob/gson-2.2/LICENSE (Apache 2.0) Amazon Web Services SDK for Java v1.10.1 (https://aws.amazon.com/sdk-for-java/) - https://raw.githubusercontent.com/aws/aws-sdk-java/1.10.1/LICENSE.txt - (Apache 2.0) JavaEWAH v0.7.9, v0.6.6 (https://github.com/lemire/javaewah) - https://github.com/lemire/javaewah/blob/master/LICENSE-2.0.txt + (Apache 2.0) JavaEWAH v0.7.9 (https://github.com/lemire/javaewah) - https://github.com/lemire/javaewah/blob/master/LICENSE-2.0.txt The following components are provided under Apache License. @@ -92,32 +92,8 @@ The following components are provided under Apache License. (Apache 2.0) Elasticsearch: Core (org.elasticsearch:elasticsearch:2.1.0 - http://nexus.sonatype.org/oss-repository-hosting.html/parent/elasticsearch) (Apache 2.0) Joda convert (org.joda:joda-convert:1.2 - http://joda-convert.sourceforge.net) (Apache 2.0) SnakeYAML (org.yaml:snakeyaml:1.15 - http://www.snakeyaml.org) - (Apache 2.0) Scalding Core (com.twitter:scalding-core_2.10:jar:0.15.1-RC13 - https://github.com/twitter/scalding) - (Apache 2.0) Scalding Args (com.twitter:scalding-args_2.10:jar:0.15.1-RC13 - https://github.com/twitter/scalding) - (Apache 2.0) Scalding Date (com.twitter:scalding-date_2.10:jar:0.15.1-RC13 - https://github.com/twitter/scalding) - (Apache 2.0) Scalding REPL (com.twitter:scalding-repl_2.10:jar:0.15.1-RC13 - https://github.com/twitter/scalding) - (Apache 2.0) Scalding Serialization (com.twitter:scalding-serialization_2.10:jar:0.15.1-RC13 - https://github.com/twitter/scalding) - (Apache 2.0) Scalding Maple (com.twitter:maple:jar:0.15.1-RC13 - https://github.com/twitter/scalding/tree/develop/maple) - (Apache 2.0) Cascading (cascading:cascading-core:jar:2.6.1 - https://github.com/Cascading/cascading) - (Apache 2.0) Cascading Hadoop (cascading:cascading-hadoop:jar:2.6.1 - https://github.com/Cascading/cascading) - (Apache 2.0) Cascading Local (cascading:cascading-local:jar:2.6.1 - https://github.com/Cascading/cascading) - (Apache 2.0) Riffle (riffle:riffle:jar:0.1-dev - https://github.com/cwensel/riffle) - (Apache 2.0) Chill Hadoop (com.twitter:chill-hadoop:jar:0.7.0 - https://github.com/twitter/chill) - (Apache 2.0) Chill Java (com.twitter:chill-java:jar:0.7.0 - https://github.com/twitter/chill) - (Apache 2.0) Chill Algebird (com.twitter:chill-algebird_2.10:jar:0.7.0 - https://github.com/twitter/chill) - (Apache 2.0) Chill Scala (com.twitter:chill_2.10:jar:0.7.0 - https://github.com/twitter/chill) - (Apache 2.0) Algebird (com.twitter:algebird-core_2.10:jar:0.11.0 - https://github.com/twitter/algebird) - (Apache 2.0) Bijection Core (com.twitter:bijection-core_2.10:jar:0.8.1 - https://github.com/twitter/bijection) - (Apache 2.0) Bijection Macros (com.twitter:bijection-macros_2.10:jar:0.8.1 - https://github.com/twitter/bijection) - (Apache 2.0) Scala Test (org.scalatest:scalatest_2.10:jar:2.2.2 - http://www.scalatest.org/) - (Apache 2.0) Hadoop Common (org.apache.hadoop:hadoop-common:jar:2.5.0 - http://hadoop.apache.org) - (Apache 2.0) Hadoop Auth (org.apache.hadoop:hadoop-auth:jar:2.5.0 - http://hadoop.apache.org) - (Apache 2.0) Jackson Mapper ASL (org.codehaus.jackson:jackson-mapper-asl:1.9.13 - http://jackson.codehaus.org/) - (Apache 2.0) Apache Avro (org.apache.avro:avro:jar:1.7.4 - https://github.com/apache/avro) - (Apache 2.0) Apache Directory Server (org.apache.directory.server:apacheds-kerberos-codec:jar:2.0.0-M15 - https://github.com/apache/directory-server) - (Apache 2.0) Apache Directory Server i18n (org.apache.directory.server:apacheds-i18n:jar:2.0.0-M15 - https://github.com/apache/directory-server) - (Apache 2.0) Apache Directory API ASN1 (org.apache.directory.api:api-asn1-api:jar:1.0.0-M20 - https://directory.apache.org/api/) - (Apache 2.0) Apache Directory API Util (org.apache.directory.api:api-util:jar:1.0.0-M20 - https://directory.apache.org/api/) + + ======================================================================== MIT licenses @@ -171,9 +147,8 @@ The text of each license is also included at licenses/LICENSE-[project]-[version (BSD Style) dom4j v1.6.1 (http://www.dom4j.org) - https://github.com/dom4j/dom4j/blob/dom4j_1_6_1/LICENSE.txt (BSD Style) JSch v0.1.53 (http://www.jcraft.com) - http://www.jcraft.com/jsch/LICENSE.txt (BSD 3 Clause) highlightjs v8.4.0 (https://highlightjs.org/) - https://github.com/isagalaev/highlight.js/blob/8.4/LICENSE - (BSD 3 Clause) xmlenc v0.52 (http://xmlenc.sourceforge.net/) - http://xmlenc.cvs.sourceforge.net/viewvc/xmlenc/xmlenc/COPYRIGHT?view=markup&pathrev=RELEASE_0_52 - (BSD 3 Clause) Paranamer v2.3 (https://github.com/paul-hammant/paranamer) - https://github.com/paul-hammant/paranamer/blob/master/LICENSE.txt - (BSD 3 Clause) Google Protobuf v2.5.0 (https://github.com/google/protobuf) - https://github.com/google/protobuf/blob/master/LICENSE + + The following components are provided under the BSD-style License. @@ -187,12 +162,11 @@ The following components are provided under the BSD-style License. (BSD-like) Scala Actors library (org.scala-lang:scala-actors:2.10.4 - http://www.scala-lang.org/) (BSD-like) Scala Compiler (org.scala-lang:scala-compiler:2.10.4 - http://www.scala-lang.org/) (BSD-like) Scala Compiler (org.scala-lang:scala-reflect:2.10.4 - http://www.scala-lang.org/) - (BSD-like) Scala Macros Quasiquotes (org.scalamacros:quasiquotes_2.10:jar:2.0.1 - http://docs.scala-lang.org/overviews/quasiquotes/intro.html) (BSD-like) ASM (asm:asm:jar:3.1 - http://asm.ow2.org/) - Copyright (c) 2000-2011 INRIA, France Telecom (New BSD License) Py4J (net.sf.py4j:py4j:0.9 - http://py4j.sourceforge.net/) (New BSD License) Markdown4j (org.commonjava.googlecode.markdown4j:markdown4j:jar:2.2-cj-1.0 - https://code.google.com/p/markdown4j/) - (New BSD License) Janino (org.codehaus.janino:janino:jar:2.7.5 - http://janino.net/) - (New BSD License) Janino Commons Compiler (org.codehaus.janino:commons-compiler:jar:2.7.5 - http://janino.net/) + + ======================================================================== CDDL license @@ -237,15 +211,3 @@ Creative Commons CC0 (http://creativecommons.org/publicdomain/zero/1.0/) (CC0 1.0 Universal) JSR166e (com.twitter:jsr166e:1.1.0 - http://github.com/twitter/jsr166e) (Public Domain, per Creative Commons CC0) HdrHistogram (org.hdrhistogram:HdrHistogram:2.1.6 - http://hdrhistogram.github.io/HdrHistogram/) - - -======================================================================== -For the org.tukaani:xz:jar:1.0 -======================================================================== - See zeppelin-distribution/src/bin_license/licenses/LICENSE-tukaani-xy-1.0 - - -======================================================================== -Unknown license -======================================================================== - (Unknown license) jgrapht-jdk1.6 (thirdparty:jgrapht-jdk1.6:0.8.1 - no url defined) From 8eec3c2382b9157b814f0f9ee4d7057cd6925069 Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Wed, 30 Dec 2015 22:21:11 -0800 Subject: [PATCH 27/29] Updating docs to include the -Pscalding profile for Scalding --- README.md | 5 +++++ docs/interpreter/scalding.md | 9 ++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 85fc0b6a1c2..9a99b7881e5 100644 --- a/README.md +++ b/README.md @@ -153,6 +153,11 @@ mvn clean package -Pspark-1.5 -Pmapr50 -DskipTests mvn clean package -Dignite.version=1.1.0-incubating -DskipTests ``` +#### Scalding Interpreter + +``` +mvn clean package -Pscalding -DskipTests +``` ### Configure If you wish to configure Zeppelin option (like port number), configure the following files: diff --git a/docs/interpreter/scalding.md b/docs/interpreter/scalding.md index bacf96ac2ce..40ec8b1211e 100644 --- a/docs/interpreter/scalding.md +++ b/docs/interpreter/scalding.md @@ -10,9 +10,16 @@ group: manual ## Scalding Interpreter for Apache Zeppelin [Scalding](https://github.com/twitter/scalding) is an open source Scala library for writing MapReduce jobs. +### Building the Scalding Interpreter +You have to first build the Scalding interpreter by enable the **scalding** profile as follows: + +``` +mvn clean package -Pscalding -DskipTests +``` + ### Enabling the Scalding Interpreter - In a notebook, to enable the **Scalding** interpreter, click on the **Gear** icon,select **Scalding**, and hit **Save**. +In a notebook, to enable the **Scalding** interpreter, click on the **Gear** icon,select **Scalding**, and hit **Save**.
    ![Interpreter Binding](../assets/themes/zeppelin/img/docs-img/scalding-InterpreterBinding.png) From 1ad405bba96c2e96f3a6dab5355215437e418d67 Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Wed, 30 Dec 2015 22:23:49 -0800 Subject: [PATCH 28/29] Adding newline to remove redundant change in PR --- zeppelin-distribution/src/bin_license/LICENSE | 1 + 1 file changed, 1 insertion(+) diff --git a/zeppelin-distribution/src/bin_license/LICENSE b/zeppelin-distribution/src/bin_license/LICENSE index cde3a8c8be9..cf022fd972b 100644 --- a/zeppelin-distribution/src/bin_license/LICENSE +++ b/zeppelin-distribution/src/bin_license/LICENSE @@ -211,3 +211,4 @@ Creative Commons CC0 (http://creativecommons.org/publicdomain/zero/1.0/) (CC0 1.0 Universal) JSR166e (com.twitter:jsr166e:1.1.0 - http://github.com/twitter/jsr166e) (Public Domain, per Creative Commons CC0) HdrHistogram (org.hdrhistogram:HdrHistogram:2.1.6 - http://hdrhistogram.github.io/HdrHistogram/) + From ffa698b0ce8e7228fce0ebfd206562a8c7a5409a Mon Sep 17 00:00:00 2001 From: Sriram Krishnan Date: Wed, 30 Dec 2015 22:25:49 -0800 Subject: [PATCH 29/29] Whitespace cleanup --- zeppelin-distribution/src/bin_license/LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zeppelin-distribution/src/bin_license/LICENSE b/zeppelin-distribution/src/bin_license/LICENSE index cf022fd972b..52ce3ebc7f2 100644 --- a/zeppelin-distribution/src/bin_license/LICENSE +++ b/zeppelin-distribution/src/bin_license/LICENSE @@ -211,4 +211,4 @@ Creative Commons CC0 (http://creativecommons.org/publicdomain/zero/1.0/) (CC0 1.0 Universal) JSR166e (com.twitter:jsr166e:1.1.0 - http://github.com/twitter/jsr166e) (Public Domain, per Creative Commons CC0) HdrHistogram (org.hdrhistogram:HdrHistogram:2.1.6 - http://hdrhistogram.github.io/HdrHistogram/) - +