| #!/usr/bin/env 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. |
| # |
| #------------------------------------------------------------- |
| |
| # error help print |
| printUsageExit() |
| { |
| cat << EOF |
| Usage: $0 <dml-filename> [arguments] [-help] |
| -help - Print this usage message and exit |
| EOF |
| exit 1 |
| } |
| # Script internally invokes 'java -Xmx4g -Xms4g -Xmn400m [Custom-Java-Options] -jar StandaloneSystemML.jar -f <dml-filename> -exec singlenode -config=SystemML-config.xml [Optional-Arguments]' |
| |
| while getopts "h:" options; do |
| case $options in |
| h ) echo Warning: Help requested. Will exit after usage message |
| printUsageExit |
| ;; |
| \? ) echo Warning: Help requested. Will exit after usage message |
| printUsageExit |
| ;; |
| * ) echo Error: Unexpected error while processing options |
| esac |
| done |
| |
| if [ -z "$1" ] ; then |
| echo "Wrong Usage."; |
| printUsageExit; |
| fi |
| |
| |
| # find the systemML root path which contains the bin folder, the script folder and the target folder |
| # tolerate path with spaces |
| SCRIPT_DIR=$( dirname "$0" ) |
| PROJECT_ROOT_DIR=$( cd "${SCRIPT_DIR}/.." ; pwd -P ) |
| |
| USER_DIR=$PWD |
| |
| BUILD_DIR=${PROJECT_ROOT_DIR}/target |
| HADOOP_LIB_DIR=${BUILD_DIR}/lib |
| DML_SCRIPT_CLASS=${BUILD_DIR}/classes/org/apache/sysml/api/DMLScript.class |
| |
| BUILD_ERR_MSG="You must build the project before running this script." |
| BUILD_DIR_ERR_MSG="Could not find target directory \"${BUILD_DIR}\". ${BUILD_ERR_MSG}" |
| HADOOP_LIB_ERR_MSG="Could not find required libraries \"${HADOOP_LIB_DIR}/*\". ${BUILD_ERR_MSG}" |
| DML_SCRIPT_ERR_MSG="Could not find \"${DML_SCRIPT_CLASS}\". ${BUILD_ERR_MSG}" |
| |
| # check if the project had been built and the jar files exist |
| if [ ! -d "${BUILD_DIR}" ]; then echo "${BUILD_DIR_ERR_MSG}"; exit 1; fi |
| if [ ! -d "${HADOOP_LIB_DIR}" ]; then echo "${HADOOP_LIB_ERR_MSG}"; exit 1; fi |
| if [ ! -f "${DML_SCRIPT_CLASS}" ]; then echo "${DML_SCRIPT_ERR_MSG}"; exit 1; fi |
| |
| |
| echo "================================================================================" |
| |
| # if the present working directory is the project root or bin folder, then use the temp folder as user.dir |
| if [ "$USER_DIR" = "$PROJECT_ROOT_DIR" ] || [ "$USER_DIR" = "$PROJECT_ROOT_DIR/bin" ] |
| then |
| USER_DIR=${PROJECT_ROOT_DIR}/temp |
| echo "Output dir: $USER_DIR" |
| fi |
| |
| |
| # if the SystemML-config.xml does not exist, create it from the template |
| if [ ! -f "${PROJECT_ROOT_DIR}/conf/SystemML-config.xml" ] |
| then |
| cp "${PROJECT_ROOT_DIR}/conf/SystemML-config.xml.template" \ |
| "${PROJECT_ROOT_DIR}/conf/SystemML-config.xml" |
| echo "... created ${PROJECT_ROOT_DIR}/conf/SystemML-config.xml" |
| fi |
| |
| # if the log4j.properties do not exis, create them from the template |
| if [ ! -f "${PROJECT_ROOT_DIR}/conf/log4j.properties" ] |
| then |
| cp "${PROJECT_ROOT_DIR}/conf/log4j.properties.template" \ |
| "${PROJECT_ROOT_DIR}/conf/log4j.properties" |
| echo "... created ${PROJECT_ROOT_DIR}/conf/log4j.properties" |
| fi |
| |
| |
| # Peel off first argument so that $@ contains arguments to DML script |
| SCRIPT_FILE=$1 |
| shift |
| |
| # if the script file path was omitted, try to complete the script path |
| if [ ! -f "$SCRIPT_FILE" ] |
| then |
| SCRIPT_FILE_NAME=$(basename $SCRIPT_FILE) |
| SCRIPT_FILE_FOUND=$(find "$PROJECT_ROOT_DIR/scripts" -name "$SCRIPT_FILE_NAME") |
| if [ ! "$SCRIPT_FILE_FOUND" ] |
| then |
| echo "Could not find DML script: $SCRIPT_FILE" |
| printUsageExit; |
| else |
| SCRIPT_FILE=$SCRIPT_FILE_FOUND |
| echo "DML script: $SCRIPT_FILE" |
| fi |
| fi |
| |
| |
| # add hadoop libraries which were generated by the build to the classpath |
| CLASSPATH=\"${BUILD_DIR}/lib/*\" |
| |
| #SYSTEM_ML_JAR=$( find $PROJECT_ROOT_DIR/target/system-ml-*-SNAPSHOT.jar ) |
| SYSTEM_ML_JAR=\"${BUILD_DIR}/classes\" |
| |
| CLASSPATH=${CLASSPATH}:${SYSTEM_ML_JAR} |
| |
| echo "================================================================================" |
| |
| # Set default Java options |
| SYSTEMML_DEFAULT_JAVA_OPTS="\ |
| -Xmx8g -Xms4g -Xmn1g \ |
| -cp $CLASSPATH \ |
| -Dlog4j.configuration=file:'$PROJECT_ROOT_DIR/conf/log4j.properties' \ |
| -Duser.dir='$USER_DIR'" |
| |
| # Add any custom Java options set by the user at command line, overriding defaults as necessary. |
| if [ ! -z "${SYSTEMML_JAVA_OPTS}" ]; then |
| SYSTEMML_DEFAULT_JAVA_OPTS+=" ${SYSTEMML_JAVA_OPTS}" |
| unset SYSTEMML_JAVA_OPTS |
| fi |
| |
| # Add any custom Java options set by the user in the environment variables file, overriding defaults as necessary. |
| if [ -f "${PROJECT_ROOT_DIR}/conf/systemml-env.sh" ]; then |
| . "${PROJECT_ROOT_DIR}/conf/systemml-env.sh" |
| if [ ! -z "${SYSTEMML_JAVA_OPTS}" ]; then |
| SYSTEMML_DEFAULT_JAVA_OPTS+=" ${SYSTEMML_JAVA_OPTS}" |
| fi |
| fi |
| |
| # Invoke the jar with options and arguments |
| CMD="\ |
| java ${SYSTEMML_DEFAULT_JAVA_OPTS} \ |
| org.apache.sysml.api.DMLScript \ |
| -f '$SCRIPT_FILE' \ |
| -exec singlenode \ |
| -config='$PROJECT_ROOT_DIR/conf/SystemML-config.xml' \ |
| $@" |
| |
| eval ${CMD} |
| |
| RETURN_CODE=$? |
| |
| # if there was an error, display the full java command (in case some of the variable substitutions broke it) |
| if [ $RETURN_CODE -ne 0 ] |
| then |
| echo "Failed to run SystemML. Exit code: $RETURN_CODE" |
| LF=$'\n' |
| |
| |
| # keep empty lines above for the line breaks |
| echo " ${CMD// /$LF }" |
| fi |
| |