diff --git a/bin/common.sh b/bin/common.sh
index 4d575e891db..a70be7c6b85 100644
--- a/bin/common.sh
+++ b/bin/common.sh
@@ -105,6 +105,7 @@ if [[ -z "$ZEPPELIN_MEM" ]]; then
fi
JAVA_OPTS+=" ${ZEPPELIN_JAVA_OPTS} -Dfile.encoding=${ZEPPELIN_ENCODING} ${ZEPPELIN_MEM}"
+JAVA_OPTS+=" -Dlog4j.configuration=file://${ZEPPELIN_CONF_DIR}/log4j.properties"
export JAVA_OPTS
# jvm options for interpreter process
@@ -117,6 +118,7 @@ if [[ -z "${ZEPPELIN_INTP_MEM}" ]]; then
fi
JAVA_INTP_OPTS="${ZEPPELIN_INTP_JAVA_OPTS} -Dfile.encoding=${ZEPPELIN_ENCODING}"
+JAVA_INTP_OPTS+=" -Dlog4j.configuration=file://${ZEPPELIN_CONF_DIR}/log4j.properties"
export JAVA_INTP_OPTS
diff --git a/conf/zeppelin-site.xml.template b/conf/zeppelin-site.xml.template
index 3fb55c21d7f..f756dca1f8e 100755
--- a/conf/zeppelin-site.xml.template
+++ b/conf/zeppelin-site.xml.template
@@ -144,7 +144,7 @@
zeppelin.interpreters
- org.apache.zeppelin.spark.SparkInterpreter,org.apache.zeppelin.spark.PySparkInterpreter,org.apache.zeppelin.spark.SparkRInterpreter,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.file.HDFSFileInterpreter,org.apache.zeppelin.flink.FlinkInterpreter,org.apache.zeppelin.lens.LensInterpreter,org.apache.zeppelin.ignite.IgniteInterpreter,org.apache.zeppelin.ignite.IgniteSqlInterpreter,org.apache.zeppelin.cassandra.CassandraInterpreter,org.apache.zeppelin.geode.GeodeOqlInterpreter,org.apache.zeppelin.postgresql.PostgreSqlInterpreter,org.apache.zeppelin.jdbc.JDBCInterpreter,org.apache.zeppelin.phoenix.PhoenixInterpreter,org.apache.zeppelin.kylin.KylinInterpreter,org.apache.zeppelin.elasticsearch.ElasticsearchInterpreter,org.apache.zeppelin.scalding.ScaldingInterpreter,org.apache.zeppelin.alluxio.AlluxioInterpreter,org.apache.zeppelin.hbase.HbaseInterpreter,org.apache.zeppelin.rinterpreter.KnitR,org.apache.zeppelin.rinterpreter.RRepl
+ org.apache.zeppelin.spark.SparkInterpreter,org.apache.zeppelin.spark.PySparkInterpreter,org.apache.zeppelin.rinterpreter.RRepl,org.apache.zeppelin.rinterpreter.KnitR,org.apache.zeppelin.spark.SparkRInterpreter,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.file.HDFSFileInterpreter,org.apache.zeppelin.flink.FlinkInterpreter,org.apache.zeppelin.lens.LensInterpreter,org.apache.zeppelin.ignite.IgniteInterpreter,org.apache.zeppelin.ignite.IgniteSqlInterpreter,org.apache.zeppelin.cassandra.CassandraInterpreter,org.apache.zeppelin.geode.GeodeOqlInterpreter,org.apache.zeppelin.postgresql.PostgreSqlInterpreter,org.apache.zeppelin.jdbc.JDBCInterpreter,org.apache.zeppelin.phoenix.PhoenixInterpreter,org.apache.zeppelin.kylin.KylinInterpreter,org.apache.zeppelin.elasticsearch.ElasticsearchInterpreter,org.apache.zeppelin.scalding.ScaldingInterpreter,org.apache.zeppelin.alluxio.AlluxioInterpreter,org.apache.zeppelin.hbase.HbaseInterpreter
Comma separated interpreter configurations. First interpreter become a default
diff --git a/file/pom.xml b/file/pom.xml
index 586f41add2b..e416358a6a8 100644
--- a/file/pom.xml
+++ b/file/pom.xml
@@ -29,7 +29,7 @@
zeppelin-file
jar
0.6.0-incubating-SNAPSHOT
- Zeppelin File System Interpreters
+ Zeppelin: File System Interpreters
http://www.apache.org
diff --git a/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java b/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java
index 152f70cf6e9..ea0054188ac 100644
--- a/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java
+++ b/spark/src/main/java/org/apache/zeppelin/spark/PySparkInterpreter.java
@@ -91,7 +91,12 @@ public class PySparkInterpreter extends Interpreter implements ExecuteResultHand
public PySparkInterpreter(Properties property) {
super(property);
- scriptPath = System.getProperty("java.io.tmpdir") + "/zeppelin_pyspark.py";
+ try {
+ File scriptFile = File.createTempFile("zeppelin_pyspark-", ".py");
+ scriptPath = scriptFile.getAbsolutePath();
+ } catch (IOException e) {
+ throw new InterpreterException(e);
+ }
}
private void createPythonScript() {
@@ -235,6 +240,7 @@ private int findRandomOpenPortOnAllLocalInterfaces() {
@Override
public void close() {
executor.getWatchdog().destroyProcess();
+ new File(scriptPath).delete();
gatewayServer.shutdown();
}
diff --git a/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java b/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java
index cd4d36bc3b7..b53e80f9d59 100644
--- a/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java
+++ b/spark/src/main/java/org/apache/zeppelin/spark/SparkInterpreter.java
@@ -254,7 +254,7 @@ private DepInterpreter getDepInterpreter() {
}
public SparkContext createSparkContext() {
- System.err.println("------ Create new SparkContext " + getProperty("master") + " -------");
+ logger.info("------ Create new SparkContext {} -------", getProperty("master"));
String execUri = System.getenv("SPARK_EXECUTOR_URI");
String[] jars = SparkILoop.getAddedJars();
diff --git a/spark/src/main/java/org/apache/zeppelin/spark/ZeppelinR.java b/spark/src/main/java/org/apache/zeppelin/spark/ZeppelinR.java
index 8d92c968f50..93a3bcb5899 100644
--- a/spark/src/main/java/org/apache/zeppelin/spark/ZeppelinR.java
+++ b/spark/src/main/java/org/apache/zeppelin/spark/ZeppelinR.java
@@ -111,8 +111,12 @@ public ZeppelinR(String rCmdPath, String libPath, int sparkRBackendPort) {
this.rCmdPath = rCmdPath;
this.libPath = libPath;
this.port = sparkRBackendPort;
- scriptPath = System.getProperty("java.io.tmpdir") + "/zeppelin_sparkr.R";
-
+ try {
+ File scriptFile = File.createTempFile("zeppelin_sparkr-", ".R");
+ scriptPath = scriptFile.getAbsolutePath();
+ } catch (IOException e) {
+ throw new InterpreterException(e);
+ }
}
/**
diff --git a/testing/downloadSpark.sh b/testing/downloadSpark.sh
index d12580f0f3f..004e1dd483a 100755
--- a/testing/downloadSpark.sh
+++ b/testing/downloadSpark.sh
@@ -40,10 +40,28 @@ fi
set -xe
-TIMEOUT_SEC=590
+MAX_DOWNLOAD_TIME_SEC=590
FWDIR="$(dirname "${BASH_SOURCE-$0}")"
ZEPPELIN_HOME="$(cd "${FWDIR}/.."; pwd)"
+#######################################
+# Downloads file from the givrn URL.
+# Ties 3 times with 1s delay, 20s read and 15s connection timeouts.
+# Globals:
+# None
+# Arguments:
+# url - source URL
+# Returns:
+# None
+#######################################
+download_with_retry() {
+ local url="$1"
+ wget --retry-connrefused --waitretry=1 --read-timeout=20 --timeout=15 -t 3 "${url}"
+ if [[ "$?" -ne 0 ]]; then
+ echo "3 download attempts for ${url} failed"
+ fi
+}
+
SPARK_CACHE=".spark-dist"
SPARK_ARCHIVE="spark-${SPARK_VERSION}-bin-hadoop${HADOOP_VERSION}"
export SPARK_HOME="${ZEPPELIN_HOME}/${SPARK_ARCHIVE}"
@@ -56,11 +74,13 @@ if [[ ! -d "${SPARK_HOME}" ]]; then
pwd
ls -la .
echo "${SPARK_CACHE} does not have ${SPARK_ARCHIVE} downloading ..."
+
# download archive if not cached
if [[ "${SPARK_VER_RANGE}" == "<=1.2" ]]; then
# spark 1.1.x and spark 1.2.x can be downloaded from archive
STARTTIME=`date +%s`
- timeout -s KILL "${TIMEOUT_SEC}" wget -q "http://archive.apache.org/dist/spark/spark-${SPARK_VERSION}/${SPARK_ARCHIVE}.tgz"
+ #timeout -s KILL "${MAX_DOWNLOAD_TIME_SEC}" wget "http://archive.apache.org/dist/spark/spark-${SPARK_VERSION}/${SPARK_ARCHIVE}.tgz"
+ download_with_retry "http://archive.apache.org/dist/spark/spark-${SPARK_VERSION}/${SPARK_ARCHIVE}.tgz"
ENDTIME=`date +%s`
DOWNLOADTIME="$((ENDTIME-STARTTIME))"
else
@@ -72,7 +92,8 @@ if [[ ! -d "${SPARK_HOME}" ]]; then
PATHINFO=$(echo "${MIRROR_INFO}" | grep path_info | sed 's/[^"]*.path_info.: .\([^"]*\).*/\1/g')
STARTTIME=`date +%s`
- timeout -s KILL "${TIMEOUT_SEC}" wget -q "${PREFFERED}${PATHINFO}"
+ #timeout -s KILL "${MAX_DOWNLOAD_TIME_SEC}" wget -q "${PREFFERED}${PATHINFO}"
+ download_with_retry "${PREFFERED}${PATHINFO}"
ENDTIME=`date +%s`
DOWNLOADTIME="$((ENDTIME-STARTTIME))"
fi
diff --git a/zeppelin-interpreter/pom.xml b/zeppelin-interpreter/pom.xml
index 67b4d5fbc9a..da1f8d023ef 100644
--- a/zeppelin-interpreter/pom.xml
+++ b/zeppelin-interpreter/pom.xml
@@ -214,8 +214,18 @@
+
+ org.apache.commons
+ commons-vfs2
+ 2.0
+
+
+ plexus-utils
+ org.codehaus.plexus
+
+
+
-
diff --git a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java
index 6e369c0694a..b19fd9cd09e 100644
--- a/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java
+++ b/zeppelin-interpreter/src/main/java/org/apache/zeppelin/interpreter/remote/RemoteInterpreterServer.java
@@ -134,17 +134,47 @@ public static void main(String[] args)
System.exit(0);
}
+ private DistributedResourcePool getResourcePool()
+ /* InterpreterGroup group,
+ Properties prop,
+ RemoteInterpreterEventClient client) */
+ throws TException {
+ if (resourcePool != null)
+ return resourcePool;
+ try {
+ Properties prop = interpreterGroup.getProperty();
+ //Happens during tests.
+ if (prop == null)
+ prop = new Properties();
+ String resourcePoolClassName = (String) prop.getProperty(
+ "zeppelin.interpreter.resourcePoolClass");
+ logger.debug("Getting resource pool {}", resourcePoolClassName);
+ Class resourcePoolClass = Class.forName(resourcePoolClassName);
+
+ Constructor constructor = resourcePoolClass
+ .getConstructor(new Class[] {String.class,
+ ResourcePoolConnector.class,
+ Properties.class });
+ resourcePool = (DistributedResourcePool) constructor.newInstance(interpreterGroup.getId(),
+ this.eventClient,
+ prop);
+ interpreterGroup.setResourcePool(resourcePool);
+ return resourcePool;
+ } catch (Exception e) {
+ logger.error(e.toString(), e);
+ return new DistributedResourcePool(interpreterGroup.getId(), this.eventClient);
+ // throw new TException(e);
+ }
+ }
@Override
public void createInterpreter(String interpreterGroupId, String noteId, String
className,
- Map properties) throws TException {
+ Map properties) throws TException {
if (interpreterGroup == null) {
interpreterGroup = new InterpreterGroup(interpreterGroupId);
angularObjectRegistry = new AngularObjectRegistry(interpreterGroup.getId(), this);
- resourcePool = new DistributedResourcePool(interpreterGroup.getId(), eventClient);
interpreterGroup.setAngularObjectRegistry(angularObjectRegistry);
- interpreterGroup.setResourcePool(resourcePool);
}
try {
@@ -170,7 +200,12 @@ public void createInterpreter(String interpreterGroupId, String noteId, String
}
logger.info("Instantiate interpreter {}", className);
+
+ interpreterGroup.setResourcePool(getResourcePool());
+
repl.setInterpreterGroup(interpreterGroup);
+
+ //setResourcePool(interpreterGroup, p, eventClient);
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException
| InstantiationException | IllegalAccessException
| IllegalArgumentException | InvocationTargetException e) {
@@ -178,7 +213,6 @@ public void createInterpreter(String interpreterGroupId, String noteId, String
throw new TException(e);
}
}
-
private Interpreter getInterpreter(String noteId, String className) throws TException {
if (interpreterGroup == null) {
throw new TException(
@@ -353,11 +387,13 @@ protected Object jobRun() throws Throwable {
}
// put result into resource pool
- context.getResourcePool().put(
- context.getNoteId(),
- context.getParagraphId(),
- WellKnownResourceName.ParagraphResult.toString(),
- combinedResult);
+ if (context.getResourcePool() != null) {
+ context.getResourcePool().put(
+ context.getNoteId(),
+ context.getParagraphId(),
+ WellKnownResourceName.ParagraphResult.toString(),
+ combinedResult);
+ }
return combinedResult;
} finally {
InterpreterContext.remove();
@@ -388,7 +424,7 @@ public void cancel(String noteId, String className, RemoteInterpreterContext int
@Override
public int getProgress(String noteId, String className,
- RemoteInterpreterContext interpreterContext)
+ RemoteInterpreterContext interpreterContext)
throws TException {
Interpreter intp = getInterpreter(noteId, className);
return intp.getProgress(convert(interpreterContext));
@@ -411,7 +447,7 @@ public List completion(String noteId, String className, String buf, int
private InterpreterContext convert(RemoteInterpreterContext ric) {
List contextRunners = new LinkedList();
List runners = gson.fromJson(ric.getRunners(),
- new TypeToken>() {
+ new TypeToken>() {
}.getType());
for (InterpreterContextRunner r : runners) {
@@ -572,7 +608,7 @@ public void angularObjectUpdate(String name, String noteId, String paragraphId,
if (value == null) {
try {
value = gson.fromJson(object,
- new TypeToken