mirror of
https://github.com/apache/zeppelin
synced 2026-05-24 09:38:26 +00:00
### What is this PR for?
* Instead of creating fat jar for zeppelin-interpreter and add it to classpath, place zeppelin-interpreter.jar and dependencies under `lib/interpreter` directory and add this dir to classpath of zeppelin-server and interpreter. (removed maven-shade-plugin)
* Exclude some transitive dependencies from `zeppelin-zengine` which cause conflicts with those of `zeppelin-interpreter`
* Exclude configuration files(`credential.json`, `notebook-authorization.json`, `shiro.ini`) when create binary package.
### What type of PR is it?
Improvement
### What is the Jira issue?
[ZEPPELIN-1605](https://issues.apache.org/jira/browse/ZEPPELIN-1605)
### How should this be tested?
1. Check if `interpreter` directory has created under `zeppelin-distribution/target/zeppelin-0.7.0-SNAPSHOT/zeppelin-0.7.0-SNAPSHOT/`
2. Test `md` interpreter works as expected after running below command:
```
$ mvn clean package -DskipTests -Pbuild-distr
$ cd zeppelin-distribution/target/zeppelin-0.7.0-SNAPSHOT/zeppelin-0.7.0-SNAPSHOT
$ ./bin/zeppelin-daemon.sh start
```
3. Check if md intepreter process has `zeppelin-distribution/target/zeppelin-0.7.0-SNAPSHOT/zeppelin-0.7.0-SNAPSHOT/lib/interpreter/*` in it's classpath.
### Questions:
* Does the licenses files need update? no
* Is there breaking changes for older versions? no
* Does this needs documentation? no
Author: Mina Lee <minalee@apache.org>
Closes #1661 from minahlee/ZEPPELIN-1605 and squashes the following commits:
9841958 [Mina Lee] package zeppelin-interpreter jar without dependency
274 lines
7 KiB
Bash
Executable file
274 lines
7 KiB
Bash
Executable file
#!/bin/bash
|
|
#
|
|
# 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.
|
|
#
|
|
# description: Start and stop daemon script for.
|
|
#
|
|
|
|
USAGE="-e Usage: zeppelin-daemon.sh\n\t
|
|
[--config <conf-dir>] {start|stop|upstart|restart|reload|status}\n\t
|
|
[--version | -v]"
|
|
|
|
if [[ "$1" == "--config" ]]; then
|
|
shift
|
|
conf_dir="$1"
|
|
if [[ ! -d "${conf_dir}" ]]; then
|
|
echo "ERROR : ${conf_dir} is not a directory"
|
|
echo ${USAGE}
|
|
exit 1
|
|
else
|
|
export ZEPPELIN_CONF_DIR="${conf_dir}"
|
|
fi
|
|
shift
|
|
fi
|
|
|
|
if [ -L ${BASH_SOURCE-$0} ]; then
|
|
BIN=$(dirname $(readlink "${BASH_SOURCE-$0}"))
|
|
else
|
|
BIN=$(dirname ${BASH_SOURCE-$0})
|
|
fi
|
|
BIN=$(cd "${BIN}">/dev/null; pwd)
|
|
|
|
. "${BIN}/common.sh"
|
|
. "${BIN}/functions.sh"
|
|
|
|
HOSTNAME=$(hostname)
|
|
ZEPPELIN_NAME="Zeppelin"
|
|
ZEPPELIN_LOGFILE="${ZEPPELIN_LOG_DIR}/zeppelin-${ZEPPELIN_IDENT_STRING}-${HOSTNAME}.log"
|
|
ZEPPELIN_OUTFILE="${ZEPPELIN_LOG_DIR}/zeppelin-${ZEPPELIN_IDENT_STRING}-${HOSTNAME}.out"
|
|
ZEPPELIN_PID="${ZEPPELIN_PID_DIR}/zeppelin-${ZEPPELIN_IDENT_STRING}-${HOSTNAME}.pid"
|
|
ZEPPELIN_MAIN=org.apache.zeppelin.server.ZeppelinServer
|
|
JAVA_OPTS+=" -Dzeppelin.log.file=${ZEPPELIN_LOGFILE}"
|
|
|
|
# construct classpath
|
|
if [[ -d "${ZEPPELIN_HOME}/zeppelin-interpreter/target/classes" ]]; then
|
|
ZEPPELIN_CLASSPATH+=":${ZEPPELIN_HOME}/zeppelin-interpreter/target/classes"
|
|
fi
|
|
|
|
if [[ -d "${ZEPPELIN_HOME}/zeppelin-zengine/target/classes" ]]; then
|
|
ZEPPELIN_CLASSPATH+=":${ZEPPELIN_HOME}/zeppelin-zengine/target/classes"
|
|
fi
|
|
|
|
if [[ -d "${ZEPPELIN_HOME}/zeppelin-server/target/classes" ]]; then
|
|
ZEPPELIN_CLASSPATH+=":${ZEPPELIN_HOME}/zeppelin-server/target/classes"
|
|
fi
|
|
|
|
# Add jdbc connector jar
|
|
# ZEPPELIN_CLASSPATH+=":${ZEPPELIN_HOME}/jdbc/jars/jdbc-connector-jar"
|
|
|
|
addJarInDir "${ZEPPELIN_HOME}"
|
|
addJarInDir "${ZEPPELIN_HOME}/lib"
|
|
addJarInDir "${ZEPPELIN_HOME}/lib/interpreter"
|
|
addJarInDir "${ZEPPELIN_HOME}/zeppelin-interpreter/target/lib"
|
|
addJarInDir "${ZEPPELIN_HOME}/zeppelin-zengine/target/lib"
|
|
addJarInDir "${ZEPPELIN_HOME}/zeppelin-server/target/lib"
|
|
addJarInDir "${ZEPPELIN_HOME}/zeppelin-web/target/lib"
|
|
|
|
CLASSPATH+=":${ZEPPELIN_CLASSPATH}"
|
|
|
|
if [[ "${ZEPPELIN_NICENESS}" = "" ]]; then
|
|
export ZEPPELIN_NICENESS=0
|
|
fi
|
|
|
|
function initialize_default_directories() {
|
|
if [[ ! -d "${ZEPPELIN_LOG_DIR}" ]]; then
|
|
echo "Log dir doesn't exist, create ${ZEPPELIN_LOG_DIR}"
|
|
$(mkdir -p "${ZEPPELIN_LOG_DIR}")
|
|
fi
|
|
|
|
if [[ ! -d "${ZEPPELIN_PID_DIR}" ]]; then
|
|
echo "Pid dir doesn't exist, create ${ZEPPELIN_PID_DIR}"
|
|
$(mkdir -p "${ZEPPELIN_PID_DIR}")
|
|
fi
|
|
}
|
|
|
|
function wait_for_zeppelin_to_die() {
|
|
local pid
|
|
local count
|
|
pid=$1
|
|
timeout=$2
|
|
count=0
|
|
timeoutTime=$(date "+%s")
|
|
let "timeoutTime+=$timeout"
|
|
currentTime=$(date "+%s")
|
|
forceKill=1
|
|
|
|
while [[ $currentTime -lt $timeoutTime ]]; do
|
|
$(kill ${pid} > /dev/null 2> /dev/null)
|
|
if kill -0 ${pid} > /dev/null 2>&1; then
|
|
sleep 3
|
|
else
|
|
forceKill=0
|
|
break
|
|
fi
|
|
currentTime=$(date "+%s")
|
|
done
|
|
|
|
if [[ forceKill -ne 0 ]]; then
|
|
$(kill -9 ${pid} > /dev/null 2> /dev/null)
|
|
fi
|
|
}
|
|
|
|
function wait_zeppelin_is_up_for_ci() {
|
|
if [[ "${CI}" == "true" ]]; then
|
|
local count=0;
|
|
while [[ "${count}" -lt 30 ]]; do
|
|
curl -v localhost:8080 2>&1 | grep '200 OK'
|
|
if [[ $? -ne 0 ]]; then
|
|
sleep 1
|
|
continue
|
|
else
|
|
break
|
|
fi
|
|
let "count+=1"
|
|
done
|
|
fi
|
|
}
|
|
|
|
function print_log_for_ci() {
|
|
if [[ "${CI}" == "true" ]]; then
|
|
tail -1000 "${ZEPPELIN_LOGFILE}" | sed 's/^/ /'
|
|
fi
|
|
}
|
|
|
|
function check_if_process_is_alive() {
|
|
local pid
|
|
pid=$(cat ${ZEPPELIN_PID})
|
|
if ! kill -0 ${pid} >/dev/null 2>&1; then
|
|
action_msg "${ZEPPELIN_NAME} process died" "${SET_ERROR}"
|
|
print_log_for_ci
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
function upstart() {
|
|
|
|
# upstart() allows zeppelin to be run and managed as a service
|
|
# for example, this could be called from an upstart script in /etc/init
|
|
# where the service manager starts and stops the process
|
|
initialize_default_directories
|
|
|
|
echo "ZEPPELIN_CLASSPATH: ${ZEPPELIN_CLASSPATH_OVERRIDES}:${CLASSPATH}" >> "${ZEPPELIN_OUTFILE}"
|
|
|
|
$ZEPPELIN_RUNNER $JAVA_OPTS -cp $ZEPPELIN_CLASSPATH_OVERRIDES:$CLASSPATH $ZEPPELIN_MAIN >> "${ZEPPELIN_OUTFILE}"
|
|
}
|
|
|
|
function start() {
|
|
local pid
|
|
|
|
if [[ -f "${ZEPPELIN_PID}" ]]; then
|
|
pid=$(cat ${ZEPPELIN_PID})
|
|
if kill -0 ${pid} >/dev/null 2>&1; then
|
|
echo "${ZEPPELIN_NAME} is already running"
|
|
return 0;
|
|
fi
|
|
fi
|
|
|
|
initialize_default_directories
|
|
|
|
echo "ZEPPELIN_CLASSPATH: ${ZEPPELIN_CLASSPATH_OVERRIDES}:${CLASSPATH}" >> "${ZEPPELIN_OUTFILE}"
|
|
|
|
nohup nice -n $ZEPPELIN_NICENESS $ZEPPELIN_RUNNER $JAVA_OPTS -cp $ZEPPELIN_CLASSPATH_OVERRIDES:$CLASSPATH $ZEPPELIN_MAIN >> "${ZEPPELIN_OUTFILE}" 2>&1 < /dev/null &
|
|
pid=$!
|
|
if [[ -z "${pid}" ]]; then
|
|
action_msg "${ZEPPELIN_NAME} start" "${SET_ERROR}"
|
|
return 1;
|
|
else
|
|
action_msg "${ZEPPELIN_NAME} start" "${SET_OK}"
|
|
echo ${pid} > ${ZEPPELIN_PID}
|
|
fi
|
|
|
|
wait_zeppelin_is_up_for_ci
|
|
sleep 2
|
|
check_if_process_is_alive
|
|
}
|
|
|
|
function stop() {
|
|
local pid
|
|
|
|
# zeppelin daemon kill
|
|
if [[ ! -f "${ZEPPELIN_PID}" ]]; then
|
|
echo "${ZEPPELIN_NAME} is not running"
|
|
else
|
|
pid=$(cat ${ZEPPELIN_PID})
|
|
if [[ -z "${pid}" ]]; then
|
|
echo "${ZEPPELIN_NAME} is not running"
|
|
else
|
|
wait_for_zeppelin_to_die $pid 40
|
|
$(rm -f ${ZEPPELIN_PID})
|
|
action_msg "${ZEPPELIN_NAME} stop" "${SET_OK}"
|
|
fi
|
|
fi
|
|
|
|
# list all pid that used in remote interpreter and kill them
|
|
for f in ${ZEPPELIN_PID_DIR}/*.pid; do
|
|
if [[ ! -f ${f} ]]; then
|
|
continue;
|
|
fi
|
|
|
|
pid=$(cat ${f})
|
|
wait_for_zeppelin_to_die $pid 20
|
|
$(rm -f ${f})
|
|
done
|
|
|
|
}
|
|
|
|
function find_zeppelin_process() {
|
|
local pid
|
|
|
|
if [[ -f "${ZEPPELIN_PID}" ]]; then
|
|
pid=$(cat ${ZEPPELIN_PID})
|
|
if ! kill -0 ${pid} > /dev/null 2>&1; then
|
|
action_msg "${ZEPPELIN_NAME} running but process is dead" "${SET_ERROR}"
|
|
return 1
|
|
else
|
|
action_msg "${ZEPPELIN_NAME} is running" "${SET_OK}"
|
|
fi
|
|
else
|
|
action_msg "${ZEPPELIN_NAME} is not running" "${SET_ERROR}"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
case "${1}" in
|
|
start)
|
|
start
|
|
;;
|
|
stop)
|
|
stop
|
|
;;
|
|
upstart)
|
|
upstart
|
|
;;
|
|
reload)
|
|
stop
|
|
start
|
|
;;
|
|
restart)
|
|
echo "${ZEPPELIN_NAME} is restarting" >> "${ZEPPELIN_OUTFILE}"
|
|
stop
|
|
start
|
|
;;
|
|
status)
|
|
find_zeppelin_process
|
|
;;
|
|
-v | --version)
|
|
getZeppelinVersion
|
|
;;
|
|
*)
|
|
echo ${USAGE}
|
|
esac
|