| #!/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. |
| ################################################################################ |
| bin=`dirname "$0"` |
| bin=`cd "$bin"; pwd` |
| . "$bin"/find-flink-home.sh |
| |
| _FLINK_HOME_DETERMINED=1 |
| |
| . "$FLINK_HOME"/bin/config.sh |
| |
| FLINK_CLASSPATH=`constructFlinkClassPath` |
| PYTHON_JAR_PATH=`echo "$FLINK_OPT_DIR"/flink-python*.jar` |
| |
| |
| PYFLINK_PYTHON="${PYFLINK_PYTHON:-"python"}" |
| |
| # So that python can find out Flink's Jars |
| export FLINK_BIN_DIR=$FLINK_BIN_DIR |
| export FLINK_HOME |
| |
| # Add pyflink & py4j & cloudpickle to PYTHONPATH |
| export PYTHONPATH="$FLINK_OPT_DIR/python/pyflink.zip:$PYTHONPATH" |
| PY4J_ZIP=`echo "$FLINK_OPT_DIR"/python/py4j-*-src.zip` |
| CLOUDPICKLE_ZIP=`echo "$FLINK_OPT_DIR"/python/cloudpickle-*-src.zip` |
| export PYTHONPATH="$PY4J_ZIP:$CLOUDPICKLE_ZIP:$PYTHONPATH" |
| |
| PARSER="org.apache.flink.client.python.PythonShellParser" |
| function parse_options() { |
| "${JAVA_RUN}" ${JVM_ARGS} -cp ${FLINK_CLASSPATH}:${PYTHON_JAR_PATH} ${PARSER} "$@" |
| printf "%d\0" $? |
| } |
| |
| # Turn off posix mode since it does not allow process substitution |
| set +o posix |
| # If the command has option --help | -h, the script will directly |
| # run the PythonShellParser program to stdout the help message. |
| if [[ "$@" =~ '--help' ]] || [[ "$@" =~ '-h' ]]; then |
| "${JAVA_RUN}" ${JVM_ARGS} -cp ${FLINK_CLASSPATH}:${PYTHON_JAR_PATH} ${PARSER} "$@" |
| exit 0 |
| fi |
| OPTIONS=() |
| while IFS= read -d '' -r ARG; do |
| OPTIONS+=("$ARG") |
| done < <(parse_options "$@") |
| |
| COUNT=${#OPTIONS[@]} |
| LAST=$((COUNT - 1)) |
| LAUNCHER_EXIT_CODE=${OPTIONS[$LAST]} |
| |
| # Certain JVM failures result in errors being printed to stdout (instead of stderr), which causes |
| # the code that parses the output of the launcher to get confused. In those cases, check if the |
| # exit code is an integer, and if it's not, handle it as a special error case. |
| if ! [[ ${LAUNCHER_EXIT_CODE} =~ ^[0-9]+$ ]]; then |
| echo "${OPTIONS[@]}" | head -n-1 1>&2 |
| exit 1 |
| fi |
| |
| if [[ ${LAUNCHER_EXIT_CODE} != 0 ]]; then |
| exit ${LAUNCHER_EXIT_CODE} |
| fi |
| |
| OPTIONS=("${OPTIONS[@]:0:$LAST}") |
| |
| export SUBMIT_ARGS=${OPTIONS[@]} |
| |
| # -i: interactive |
| # -m: execute shell.py in the zip package |
| ${PYFLINK_PYTHON} -i -m pyflink.shell |