áá»á áºááŸá áœá¬áá±á¬á á¬áááºáá°áá»á¬ážá áááºá¹ááá¬ááŸááá±á¬áá±á·áááºážáá«á ááá±á·áá»áœááºá¯ááºááá¯á·ááẠApache Spark ááŸáá·áºáááºážáááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯á¡áá¬ážá¡áá¬áá»á¬ážá¡ááŒá±á¬ááºážá¡áááºážáááºááŒá±á¬áá«áááºá
Big Data á áá±ááºáá
áºááá¹áá¬ááœááºá Apache Spark ááẠbatch data processing áá¯ááºáááºážáá»á¬ážááᯠáá±á¬áºáá±á¬ááºáááºá¡ááœáẠde facto standard ááŒá
áºáááºá ááá¯á·á¡ááŒááºá áááºážááᯠmicro batch concept ááœááºá¡áá¯ááºáá¯ááºáá±á¬ streaming application áá»á¬ážááá¯áááºáá®ážáááºá áá±ážáááºáá±á¬á¡ááá¯ááºážáá»á¬ážááœáẠdata áá»á¬ážááá¯áá¯ááºáá±á¬ááºááŒááºážááŸáá·áºááá¯á·áá±á¬ááºááŒááºáž (Spark Structured Streaming) ááá¯áááºáá®ážáááºáááºážá¡áá¯á¶ážááŒá¯áááºá á¡á
ááºá¡áá¬á¡á¬ážááŒáá·áº áááºážááẠá¡áááºážá¡ááŒá
áºáááºáá±áá»á¬á¡ááŒá
ẠYARN (ááá¯á·ááá¯áẠá¡áá»áá¯á·ááá
á¹á
áá»á¬ážááœáẠApache Mesos) ááᯠá¡áá¯á¶ážááŒá¯á Hadoop stack á á¡á
áááºá¡ááá¯ááºážáá
áºáá¯ááŒá
áºáááºá 2020 áá¯ááŸá
áºááœáẠáááºážá ááá¯ážáá¬áá¯á¶á
á¶ááŒáá·áº áááºážáá¡áá¯á¶ážááŒá¯ááŸá¯ááẠáá±á¬ááºážááœááºáá±á¬ Hadoop ááŒáá·áºááŒá°ážááŸá¯áá»á¬ážáááŸáááŒááºážááŒá±á¬áá·áº áá¯áá¹ááá®á¡áá»á¬ážá
á¯á¡ááœáẠáá±ážááœááºážáá¯ááºá
áá¬ááŒá
áºáá¬ááẠ- HDP ááŸáá·áº CDH áááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯áááºááá·áºááœá¬ážáááºá CDH ááẠáá±á¬ááºážááœááºá
áœá¬áááœá¶á·ááŒáá¯ážáá±ážáá² áá¯ááºáá»á
ááááºááŒá®ážááŒáá·áºááŒá®áž áá»ááºááŸááá±á¬ Hadoop áá±ážááœááºážáá°áá»á¬ážááŸááááºá ááááºááŸááá±á¬á·áá² ááá¯á·ááá¯áẠááŸá±ážááŸáááºáá±á¬á¡áá¬áááºáá
áºáá¯ááŸááááºá ááá¯á·ááŒá±á¬áá·áº Kubernetes ááᯠá¡áá¯á¶ážááŒá¯á Apache Spark ááᯠááœáŸáá·áºáááºááŒááºážááẠáááºááœá¬ááŸáá·áº áá¯áá¹ááá®ááŒá®ážáá»á¬ážááœáẠá
áááºáááºá
á¬ážááŸá¯ ááá¯ážáá¬áá±ááẠ- áá¯áá¹ááááááŸáá·áº á¡áá»á¬ážáá°ááŸá¬ cloud áá»á¬ážááœáẠá¡áááºážá¡ááŒá
áºá
á®áá¶ááá·áºááœá²ááŸá¯á¡ááœáẠá
á¶áá
áºáá¯ááŒá
áºáá¬áááºá áááºážááẠYARN ááŸá Spark á¡áá¯ááºáá»á¬ážááᯠá¡áááºáááŒá±áá±á¬ á¡áááºážá¡ááŒá
áºá¡áá»áááºááá¬ážááœá²ááŒááºážááŒáá·áº ááŒá¿áá¬ááᯠááŒá±ááŸááºážáá±ážááŒá®áž áá¶á·ááá¯ážáá±ážáá«áááºá á¡ááœááºá¡á
á¬ážááŸáá·áº á¡á
ááºážááŒá±á¬ááºážá¡á¬ážáá¯á¶ážááŸááá±á¬ áá¯áá¹ááá®áá»á¬ážá¡ááœáẠá
á®ážááœá¬ážááŒá
áºááŸáá·áº ááœáá·áºáááºážáá±á¬ ááŒáá·áºááŒá°ážááŸá¯áá»á¬ážá
áœá¬ááŒáá·áº á
ááºáááºáááŒáẠááœá¶á·ááŒáá¯ážááá¯ážáááºáá±áá±á¬ ááááºáá±á¬ááºážáá
áºáá¯á ááá¯á·á¡ááŒááºá áá°ááŒáá¯ááºáá»á¬ážáá¬ááŒá®ážáá±á¬ááºááœááºá á¡áá»á¬ážá
á¯ááẠáááºážááá¯á·áááá¯ááºááá¯ááºáááºáááºááŸá¯á¡áá»áá¯á·ááᯠááá°áá¬ážááŒá®áž ááŒá±á¬ááºážááœáŸá±á·ááŸá¯ááᯠááá¯ážááŸááºážááœááºáá°á
á±ááá·áº áááºážáá¡áá¯á¶ážááŒá¯ááŸá¯ááœáẠáááºážááá¯á·ááá»áœááºážáá»ááºááŸá¯ááᯠááá¯ážááŒáŸáá·áºáá¬ážáááºá
áá¬ážááŸááºáž 2.3.0 ááŸá
áááºá Apache Spark ááẠKubernetes á¡á
á¯á¡áá±ážá¡ááœááºáž áá¯ááºáá±á¬ááºáá±áá±á¬ á¡áá¯ááºáá»á¬ážá¡ááœáẠááá¬ážáááºáá¶á·ááá¯ážááŸá¯ááᯠááá°áá²á·ááŒá®áž ááá±á·ááœááºá á€áá»ááºážáááºááŸá¯á áááºááŸáááá·áºáá»ááºááŸá¯á áááºážáá¡áá¯á¶ážááŒá¯ááŸá¯á¡ááœáẠááœá±ážáá»ááºá
áá¬á¡áá»áá¯ážáá»áá¯ážááŸáá·áº á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯á¡ááœááºáž ááŒá¯á¶ááœá±á·áááá·áº á¡áááºá¡áá²áá»á¬ážá¡ááŒá±á¬ááºáž ááœá±ážááœá±ážáá«áááºá
ááááŠážá
áœá¬á Apache Spark ááᯠá¡ááŒá±áá¶á áá¯ááºáá±á¬ááºá
áá¬áá»á¬ážááŸáá·áº á¡ááºááºáá®áá±ážááŸááºážáá»á¬áž áá±ážááœá²ááŒááºážáá¯ááºáááºážá
ááºááᯠááŒáá·áºááŸá¯ááŒá®áž Kubernetes á¡á
á¯á¡áá±ážááœáẠáá¯ááºáá±á¬ááºááẠááá¯á¡ááºááá·áº áá¯á¶ááŸááºááá
á¹á
áááºáá»á¬ážááᯠáá®ážáá±á¬ááºážááá¯ážááŒááá¯ááºááŒáá«á
áá¯á·á á€ááá¯á·á
áºááᯠááŒááºáááºáá¬ááœáẠOpenShift ááᯠááŒáá·áºááŒá°ážááŸá¯á¡ááŒá
Ạá¡áá¯á¶ážááŒá¯ááŒá®áž áááºážá command line utility (oc) ááŸáá·áº áááºááá¯ááºááá·áº á¡áááá·áºáá»á¬ážááᯠáá±ážáááºááŒá
áºáááºá á¡ááŒá¬ážáá±á¬ Kubernetes ááŒáá·áºáá±ááŸá¯áá»á¬ážá¡ááœááºá á
ᶠKubernetes ááœáŸááºááŒá¬ážáá»ááºááá¯ááºáž utility (kubectl) ááá¯á·ááá¯áẠáááºážááá¯á·á analogues (á¥ááá¬á oc adm policy) á០áááºááá¯ááºáᬠááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá
ááááŠážá áœá¬á¡áá¯á¶ážááŒá¯ááŸá¯ááá á¹á - spark-submit
á¡áá¯ááºáá»á¬ážááŸáá·áº á¡ááá®áá±ážááŸááºážáá»á¬áž ááœá¶á·ááŒáá¯ážááá¯ážáááºáá¬áá»áááºááœááºá áá±á¬á·ááºáá²á¡ááºáá»ááºáá®áá¬ááẠáá±áá¬á¡ááœááºááŒá±á¬ááºážááŒááºážááᯠá¡ááŸá¬ážááŸá¬ááẠáá¯ááºáá±á¬ááºá áá¬áá»á¬ážááᯠáá¯ááºáá±á¬ááºááẠááá¯á¡ááºáááºá áá®á¡áá¯áá®á¡áá áá»ááºážáá¶áá»á¬ážááᯠá€áááºááœááºáá»ááºáá»á¬ážá¡ááœáẠáá¯á¶ážááá¯ááºáá±á¬áºáááºážá á¡áá¯á¶ážá áá áºáá»á¬ážá á¡ááŸááºáááẠ(á ááºážáááºááŸá¯ááá¯áá±á¬áºáááºáž) ááŒá áºáááºáá»á¬ážáá«áááºááŸá¯ááŸáá·áºá¡áá° ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááẠá€áá¯ááºáááºážáá±á¬ááºáá¬á¡ááá·áºááœáẠááá¯ááá¯ááŒááºáááºááŒá®áž ááá¯ááá¯áá±á¬ááºážááœááºááŒá±á¬ááºáž áááºáá±ááŒáá²á·áááºá áááá¯á¶ážáá»á¯ááºá áá áºá ááŒá áºáááºááŸááºáá»á¬ážááᯠáá»áœááºá¯ááºááá¯á· á¡ááŸá¬ážááŸá¬áá±á¬á¡áá«ááœááºá á¡ááŒá±á¡áá±ááŸá áºáᯠááŒá áºááá¯ááºáááº-
- áá±á¬á·ááºáá²á¡ááºáá»ááºáá®áá¬ááẠáá®ážááá·áºáá¯ááºááœáẠSpark áá¯ááºáááºážááᯠá
ááºááœááºážááœáẠáá¯ááºáá±á¬ááºáááºá
- áá±á¬á·ááºáá²á¡ááºáá»ááºáá®áá¬ááẠá
ááºážáááºááœááºážáá
áºáá¯ááœáẠKubernetes á¡á
á¯á¡áá±ážáá
áºáá¯áá±á«áºááœáẠSpark áá¯ááºáááºážááᯠáá¯ááºáá±á¬ááºáááºá
áááááœá±ážáá»ááºááŸá¯ááœáẠáááºááŸáááá¯ááºááœáá·áºááŸááááºá ááá¯á·áá±á¬áº á¡á¬ážáááºážáá»ááºáá»á¬ážá áœá¬ áá«áááºáááº-
- áá±á¬á·ááºáá²áá±ážáá¬ážáá°ááá¯ááºážááẠáá¯ááºáááºážááœááºá០áá°ááá¯á¡ááºááá·áº á¡áá¯á¶ážá áá áºáá»á¬ážá ááŒá áºáááºá¡á¬ážáá¯á¶ážááá¯á· áááºáá±á¬ááºááœáá·áºááᯠáá¶á·ááá¯ážáá±ážááááºááŒá áºáááºá
- áá®ááœááºáá¯ááºáá±á¬ááºáá±áá±á¬ áá¯ááºáááºážááᯠáá¯ááºáá±á¬ááºáááºá¡ááœáẠá¡áá¯ááºáá¯ááºááá·áºá ááºááœáẠáá¯á¶áá±á¬ááºáá±á¬ á¡áááºážá¡ááŒá áºáá»á¬áž ááá¯á¡ááºáá«áááºá
Kubernetes á¡á á¯á¡áá±ážááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááẠá¡áá¯ááºáá»á¬ážáá¯ááºáá±á¬ááºáááºá¡ááœáẠááá¯á¡ááºáá±á¬á¡áááºážá¡ááŒá áºá á¯áá±á«ááºážááᯠááœá²áá±áá±ážáᬠáááºážááá¯á¡áá¯á¶ážáááºááá·áºá áá áºá¡ááœáẠááá¯á¡ááºáá±á¬áááºáá±á¬ááºááœáá·áºááᯠáá±ážá áœááºážááá¯ááºáá±á¬ááŒá±á¬áá·áº á€á¡á¬ážáááºážáá»ááºáá»á¬ážáááŸááá«á ááœá¶á·ááŒáá¯ážááá¯ážáááºáá±ážá¡ááœá²á·áá¡ááœá²á·áááºáá»á¬ážá¡á¬ážáá¯á¶ážá á ááºážáááºáááºáááºážáá áºáá¯ááŸá Kubernetes á¡á á¯á¡áá±ážááœáẠáá±ááᶠdeveloper á ááºá០Spark á¡áá¯ááºáá»á¬ážááᯠááááá¯á¶ážá¡áá¯á¶ážááŒá¯ááŸá¯á¡ááŒá Ạáá®ážáá±á¬ááºážááá¯ážááŒááá¯ááºááŒáá«á áá¯á·á
á ááºááœááºážáá¯á¶ážááẠSpark ááᯠá áá áºááá·áºááœááºážááŒááºáž áá¯ááºáááºážá ááºá¡ááŒá±á¬ááºáž áá±á¬ááºáááºááŒá±á¬ááŒáá«á áá¯á·á Spark ááᯠá áááºá¡áá¯á¶ážááŒá¯ááẠáááºážááᯠááá·áºááœááºážááẠááá¯á¡ááºáááº-
mkdir /opt/spark
cd /opt/spark
wget http://mirror.linux-ia64.org/apache/spark/spark-2.4.5/spark-2.4.5.tgz
tar zxvf spark-2.4.5.tgz
rm -f spark-2.4.5.tgz
Kubernetes ááŸáá·áº áá¯ááºáá±á¬ááºáááºá¡ááœáẠááá¯á¡ááºáá±á¬ áááºáá±á·áá»áºáá»á¬ážááᯠáá»áœááºá¯ááºááá¯á· á á¯áá±á¬ááºážáá«áááº-
cd spark-2.4.5/
./build/mvn -Pkubernetes -DskipTests clean package
á¡ááŒáá·áºá¡ááááºáá±á¬ááºááŸá¯áá áºáá¯ááẠá¡áá»áááºá¡áá»á¬ážááŒá®ážáá°áááŒá®áž Docker áá¯á¶áá»á¬ážááá¯áááºáá®ážááŒá®áž Kubernetes á¡á á¯á¡áá±ážááœáẠáááºážááá¯á·ááᯠrun áááºá¡ááœáẠáááºááẠ"assembly/" directory á០jar ááá¯ááºáá»á¬ážáᬠááá¯á¡ááºáá±á¬ááŒá±á¬áá·áº áááºááẠá€ááá±á¬áá»ááºááœá²ááá¯áᬠáááºáá±á¬ááºááá¯ááºáááº-
./build/mvn -f ./assembly/pom.xml -Pkubernetes -DskipTests clean package
Kubernetes ááœáẠSpark á¡áá¯ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºáááºá á¡ááŒá±áá¶áá¯á¶á¡ááŒá Ạá¡áá¯á¶ážááŒá¯ááẠDocker áá¯á¶áá áºáᯠáááºáá®ážááẠááá¯á¡ááºáá«áááºá á€áá±áá¬ááœáẠááŒá áºááá¯ááºáá»á± áááºážáááºáž 2 áá¯ááŸááááºá
- áá¯ááºáá¯ááºáá¬ážáá±á¬ Docker áá¯ááºáá¯á¶ááœáẠá¡áá±á¬ááºá¡áááºáá±á¬áºááá¯ááºáá±á¬ Spark á¡áá¯ááºáá¯áẠáá«áááºáááºá
- áááºáá®ážáá¬ážáá±á¬áá¯á¶ááœáẠSpark ááŸáá·áº ááá¯á¡ááºáá±á¬ááŸá®ááá¯ááŸá¯áá»á¬ážáá¬áá«áááºááŒá®áž executable code ááá¯á¡áá±ážááŸáááºáá¶áá±á¬ááºááœááºáá±ážááẠ(á¥ááá¬á HDFS ááœááº)á
ááááŠážá áœá¬ Spark á¡áá¯ááºáá ááºážáááºááŸá¯ááá°áá¬áá«ááŸááá±á¬ Docker áá¯á¶ááá¯áááºáá±á¬ááºááŒáá«á áá¯á·á Docker áá¯á¶áá»á¬ážááᯠáááºáá®ážáááºá¡ááœáẠSpark ááœáẠ"docker-image-tool" áá¯áá±á«áºáá±á¬ á¡áá¯á¶ážáááºááŸá¯áá áºáᯠááŸááá«áááºá áááºážááŸáá·áºáááºáááºáá±á¬ á¡áá°á¡áá®ááᯠáá±á·áá¬ááŒáá«á áá¯á·á
./bin/docker-image-tool.sh --help
áááºážáá¡áá°á¡áá®ááŒáá·áºá áááºááẠDocker áá¯á¶áá»á¬ážááá¯áááºáá®ážááŒá®áž áááºážááá¯á·ááᯠá¡áá±ážááááºážá á¬áááºážááœááºážááŒááºážááá¯á· á¡ááºáá¯ááºáá¯ááºááá¯ááºáá±á¬áºáááºáž áá¯á¶ááŸááºá¡á¬ážááŒáá·áº áááºážááœáẠá¡á¬ážáááºážáá»ááºáá»á¬ážá áœá¬ááŸááááºá
- áá¡á±á¬ááºááŒááºáá² Sparká PySpark ááŸáá·áº R á¡ááœáẠDocker áá¯á¶ 3 áá¯á¶ááᯠáá áºááŒáá¯ááºááẠáááºáá®ážáááºá
- áá¯á¶á¡áááºááᯠáááºááŸááºááœáá·áºáááŒá¯áá«á
ááá¯á·ááŒá±á¬áá·áºá á¡á±á¬ááºááœááºáá±ážáá¬ážáá±á¬ ဠutility áááœááºážáá¶áá¬ážáá±á¬áá¬ážááŸááºážááᯠá¡áá¯á¶ážááŒá¯áá«áááºá
vi bin/docker-image-tool-upd.sh
#!/usr/bin/env bash
function error {
echo "$@" 1>&2
exit 1
}
if [ -z "${SPARK_HOME}" ]; then
SPARK_HOME="$(cd "`dirname "$0"`"/..; pwd)"
fi
. "${SPARK_HOME}/bin/load-spark-env.sh"
function image_ref {
local image="$1"
local add_repo="${2:-1}"
if [ $add_repo = 1 ] && [ -n "$REPO" ]; then
image="$REPO/$image"
fi
if [ -n "$TAG" ]; then
image="$image:$TAG"
fi
echo "$image"
}
function build {
local BUILD_ARGS
local IMG_PATH
if [ ! -f "$SPARK_HOME/RELEASE" ]; then
IMG_PATH=$BASEDOCKERFILE
BUILD_ARGS=(
${BUILD_PARAMS}
--build-arg
img_path=$IMG_PATH
--build-arg
datagram_jars=datagram/runtimelibs
--build-arg
spark_jars=assembly/target/scala-$SPARK_SCALA_VERSION/jars
)
else
IMG_PATH="kubernetes/dockerfiles"
BUILD_ARGS=(${BUILD_PARAMS})
fi
if [ -z "$IMG_PATH" ]; then
error "Cannot find docker image. This script must be run from a runnable distribution of Apache Spark."
fi
if [ -z "$IMAGE_REF" ]; then
error "Cannot find docker image reference. Please add -i arg."
fi
local BINDING_BUILD_ARGS=(
${BUILD_PARAMS}
--build-arg
base_img=$(image_ref $IMAGE_REF)
)
local BASEDOCKERFILE=${BASEDOCKERFILE:-"$IMG_PATH/spark/docker/Dockerfile"}
docker build $NOCACHEARG "${BUILD_ARGS[@]}"
-t $(image_ref $IMAGE_REF)
-f "$BASEDOCKERFILE" .
}
function push {
docker push "$(image_ref $IMAGE_REF)"
}
function usage {
cat <<EOF
Usage: $0 [options] [command]
Builds or pushes the built-in Spark Docker image.
Commands:
build Build image. Requires a repository address to be provided if the image will be
pushed to a different registry.
push Push a pre-built image to a registry. Requires a repository address to be provided.
Options:
-f file Dockerfile to build for JVM based Jobs. By default builds the Dockerfile shipped with Spark.
-p file Dockerfile to build for PySpark Jobs. Builds Python dependencies and ships with Spark.
-R file Dockerfile to build for SparkR Jobs. Builds R dependencies and ships with Spark.
-r repo Repository address.
-i name Image name to apply to the built image, or to identify the image to be pushed.
-t tag Tag to apply to the built image, or to identify the image to be pushed.
-m Use minikube's Docker daemon.
-n Build docker image with --no-cache
-b arg Build arg to build or push the image. For multiple build args, this option needs to
be used separately for each build arg.
Using minikube when building images will do so directly into minikube's Docker daemon.
There is no need to push the images into minikube in that case, they'll be automatically
available when running applications inside the minikube cluster.
Check the following documentation for more information on using the minikube Docker daemon:
https://kubernetes.io/docs/getting-started-guides/minikube/#reusing-the-docker-daemon
Examples:
- Build image in minikube with tag "testing"
$0 -m -t testing build
- Build and push image with tag "v2.3.0" to docker.io/myrepo
$0 -r docker.io/myrepo -t v2.3.0 build
$0 -r docker.io/myrepo -t v2.3.0 push
EOF
}
if [[ "$@" = *--help ]] || [[ "$@" = *-h ]]; then
usage
exit 0
fi
REPO=
TAG=
BASEDOCKERFILE=
NOCACHEARG=
BUILD_PARAMS=
IMAGE_REF=
while getopts f:mr:t:nb:i: option
do
case "${option}"
in
f) BASEDOCKERFILE=${OPTARG};;
r) REPO=${OPTARG};;
t) TAG=${OPTARG};;
n) NOCACHEARG="--no-cache";;
i) IMAGE_REF=${OPTARG};;
b) BUILD_PARAMS=${BUILD_PARAMS}" --build-arg "${OPTARG};;
esac
done
case "${@: -1}" in
build)
build
;;
push)
if [ -z "$REPO" ]; then
usage
exit 1
fi
push
;;
*)
usage
exit 1
;;
esac
áááºážáá¡áá°á¡áá®ááŒáá·áºá Spark ááᯠá¡áá¯á¶ážááŒá¯á Pi ááœááºáá»ááºáááºá¡ááœáẠá ááºážáááºááŸá¯áá áºáá¯áá«ááŸááá±á¬ á¡ááŒá±áᶠSpark áá¯ááºáá¯á¶áá áºáá¯á¶ááᯠáá»áœááºá¯ááºááá¯á· á á¯á ááºážáá¬ážáá«ááẠ(á€áá±áá¬ááœáẠ{docker-registry-url} ááẠáááºá Docker áá¯á¶ááŸááºáá¯á¶áááºááŒááºážá URL ááŒá áºááŒá®ážá {repo} ááẠááŸááºáá¯á¶áááºá¡ááœááºážááŸá ááá¯ááŸá±á¬ááºáááºážá á¡áááºááŒá áºáááºá OpenShift ááœááºááŸááá±á¬ ááá±á¬áá»ááºááŸáá·áº ááá¯ááºáá®ááá·áº {image-name} - áá¯á¶áá¡ááẠ(á¥ááá¬á Red Hat OpenShift áá¯á¶áá»á¬ážá áá±á«ááºážá ááºážáá¬ážáá±á¬ registry ááœááºáá²á·ááá¯á· áá¯á¶áá»á¬ážá áá¯á¶ážááá·áºááœá²ááŒá¬ážááŸá¯ááᯠá¡áá¯á¶ážááŒá¯áá«á)á {tag} - á€á¡áá¬á tag áá¯á¶ááá¬ážááŸááºáž):
./bin/docker-image-tool-upd.sh -f resource-managers/kubernetes/docker/src/main/dockerfiles/spark/Dockerfile -r {docker-registry-url}/{repo} -i {image-name} -t {tag} build
console utility ááᯠá¡áá¯á¶ážááŒá¯á OKD á¡á á¯á¡áá±ážááá¯á· áá±á¬á·ááºá¡ááºáááºáá« (á€áá±áá¬ááœáẠ{OKD-API-URL} ááẠOKD á¡á á¯á¡áá±áž API URL ááŒá áºáááº)á
oc login {OKD-API-URL}
Docker Registry ááœáẠááœáá·áºááŒá¯áá»ááºá¡ááœáẠáááºááŸáá¡áá¯á¶ážááŒá¯áá°á ááá¯áááºááᯠááá°ááŒáá«á áá¯á·á
oc whoami -t
OKD á¡á á¯á¡áá±ážá á¡ááœááºáž Docker Registry ááá¯á· áá±á¬á·ááºá¡ááºáááºáá« (áá»áœááºá¯ááºááá¯á·ááẠááááºá¡áááá·áºááᯠá áá¬ážááŸááºá¡ááŒá Ạá¡áá¯á¶ážááŒá¯á áááŸááá±á¬ ááá¯áááºááᯠá¡áá¯á¶ážááŒá¯áááº)
docker login {docker-registry-url}
á á¯á ááºážáá¬ážáá±á¬ Docker áá¯á¶ááᯠDocker Registry OKD ááá¯á· á¡ááºáá¯ááºáá¯ááºááŒáá«á áá¯á·á
./bin/docker-image-tool-upd.sh -r {docker-registry-url}/{repo} -i {image-name} -t {tag} push
á á¯á ááºážáá¬ážáá±á¬áá¯á¶ááᯠOKD ááœááºáááŸáááá¯ááºááŒá±á¬ááºáž á á áºáá±ážááŒáá·áºááŒáá«á áá¯á·á áááºážááá¯áá¯ááºáá±á¬ááºááẠáááºááá¯ááºáá¬ááá±á¬áá»ááºááá¯ááºáá¯á¶áá»á¬ážá á¬áááºážááŒáá·áº ááá±á¬ááºáá¬ááœáẠURL ááá¯ááœáá·áºáá« (á€áá±áá¬ááœáẠ{project} ááẠOpenShift á¡á á¯á¡áá±ážá¡ááœááºážááŸá ááá±á¬áá»ááºáá¡áááºááŒá áºáááºá {OKD-WEBUI-URL} ááẠOpenShift áááºááœááºááá¯ážááºá URL ááŒá áºáááºá ) - https://{OKD-WEBUI-URL}/console /project/{project}/browse/images/{image-name}á
áá¯ááºáá±á¬ááºá áá¬áá»á¬ážááᯠáá¯ááºáá±á¬ááºáááºá pods ááᯠroot á¡áá±ááŒáá·áº áá¯ááºáá±á¬ááºááẠá¡ááœáá·áºáá°ážáá»á¬ážááŒáá·áº áááºáá±á¬ááºááŸá¯á¡áá±á¬áá·áºááᯠáááºáá®ážááá«ááẠ(á€á¡áá»ááºááᯠáá±á¬ááºá០ááœá±ážááœá±ážáá«áááº-
oc create sa spark -n {project}
oc adm policy add-scc-to-user anyuid -z spark -n {project}
áááºáá®ážáá¬ážáá±á¬ áááºáá±á¬ááºááŸá¯á¡áá±á¬áá·áºááŸáá·áº Docker áá¯á¶ááá¯á·ááᯠáááºááŸááºáá±ážááŒááºážááŒáá·áº Spark áá¯ááºáááºážááᯠOKD á¡á á¯á¡áá±ážááá¯á· áá¯ááºáá±ááẠspark-submit command ááᯠáá¯á¶ážááŒáá«á áá¯á·á
/opt/spark/bin/spark-submit --name spark-test --class org.apache.spark.examples.SparkPi --conf spark.executor.instances=3 --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark --conf spark.kubernetes.namespace={project} --conf spark.submit.deployMode=cluster --conf spark.kubernetes.container.image={docker-registry-url}/{repo}/{image-name}:{tag} --conf spark.master=k8s://https://{OKD-API-URL} local:///opt/spark/examples/target/scala-2.11/jars/spark-examples_2.11-2.4.5.jar
á€áá±áá¬ááœááº:
âname â Kubernetes pods áá»á¬ážáá¡áááºááá¯ááœá²á·á ááºážáá¬ááœááºáá«áááºááá·áºá¡áá¯ááºáá¡áááºá
âclass â á¡áá¯ááºá áááºáá±á¬á¡áá«áá¯áá±á«áºáá±á¬ executable file áá¡áááºážá
âconf â Spark configuration parameters áá»á¬áž;
spark.executor.instances â á áááºááẠSpark executor á¡áá±á¡ááœááºá
spark.kubernetes.authenticate.driver.serviceAccountName - pods ááá¯á áááºáá±á¬á¡áá«á¡áá¯á¶ážááŒá¯ááá·áº Kubernetes áááºáá±á¬ááºááŸá¯á¡áá±á¬áá·áºáá¡ááẠ( Kubernetes API ááŸáá·áºá¡ááŒááºá¡ááŸááºáá¯ááºáá±á¬ááºááá·áºá¡áá« áá¯á¶ááŒá¯á¶áá±ážááá¯ááºáá¬á¡ááŒá±á¬ááºážá¡áá¬ááŸáá·áº á áœááºážáá±á¬ááºáááºááá¯áááºááŸááºáááº);
spark.kubernetes.namespace â driver ááŸáá·áº executor pods áá»á¬ážááᯠá áááºááá·áº Kubernetes namespaceá
spark.submit.deployMode â Spark ááá¯ááœáá·áºááá·áºáááºážáááºáž (áá¯á¶ááŸáẠspark-submit âclusterâ á¡ááœááºá Spark Operator ááŸáá·áº Spark âclientâ á áá±á¬ááºááá¯ááºážáá¬ážááŸááºážáá»á¬ážá¡ááœáẠá¡áá¯á¶ážááŒá¯áááº);
spark.kubernetes.container.image - pods áá»á¬ážááá¯ááœáá·áºáááºá¡áá¯á¶ážááŒá¯áá±á¬ Docker áá¯á¶á
spark.master â Kubernetes API URL (ááŒááºáááᯠáááºááŸááºáá¬ážáá±á¬ááŒá±á¬áá·áº áááºáá±á¬ááºá¡áá¯á¶ážááŒá¯ááŸá¯ááẠáá±áááœááºážá ááºá០ááŒá áºáá±á«áºáááº);
local:// ááẠDocker áá¯á¶á¡ááœááºážááŸá Spark ááᯠáááºáááºááá¯ááºáá±á¬ áááºážááŒá±á¬ááºážááŒá áºáááºá
áá»áœááºá¯ááºááá¯á·ááẠáááºááá¯ááºáᬠOKD ááá±á¬áá»ááºááá¯á· ááœá¬ážáᬠáááºáá®ážáá¬ážáá±á¬ á¡ááœááºáá»á¬ážááᯠáá±á·áá¬áá« - https://{OKD-WEBUI-URL}/console/project/{project}/browse/podsá
ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯áá¯ááºáááºážá ááºááᯠááá¯ážááŸááºážá á±áááºá Spark á áá¯á¶á¡ááŒá±áá¶áá¯á¶áá áºáá¯á¶ááᯠáááºáá®ážáᬠáá¯ááºáá±á¬ááºááẠáá¯ááºáá±á¬ááºá áá¬áá»á¬ážá¡á¬ážáá¯á¶ážá០á¡áá¯á¶ážááŒá¯áᬠá á®áá¶áá¯ááºáá±á¬ááºááá¯ááºáá±á¬ ááá¯ááºáá»á¬ážááá»áŸááºáá áºááŒááºáá»á¬ážááᯠááŒááºáááá¯ááŸá±á¬ááºááŸá¯ááá¯á· ááœáŸáá·áºáááºáá¬ážááŒá®áž (á¥ááá¬á Hadoop) ááŸáá·áº áá±á«áºááá¯ááá·áºá¡áá« áááºááŸááºáá¬ážááá·áº á¡ááŒá¬ážááœá±ážáá»ááºá áá¬ááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá spark-submit ááᯠááá·áºááºáá áºáá¯á¡áá±áá²á· áááºáá«á á€ááá á¹á ááœááºá áááºááẠáá¯á¶áá»á¬ážááá¯áá¯ááºáá±ááẠDocker áá¯á¶áá»á¬ážááᯠááŒááºáááºáááºáá±á¬ááºááŒááºážáááŸááá² Spark áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠááá°áá®áá±á¬áá¬ážááŸááºážáá»á¬ážááᯠáá¯ááºáá±á¬ááºááá¯ááºáááºá á¥ááá¬á¡á¬ážááŒáá·áºá WebHDFS ááᯠá¡áá¯á¶ážááŒá¯á áá¯á¶áá»á¬ážááá¯áá¯ááºáá±ááá¯ááºáááºá áá»áœááºá¯ááºááá¯á·ááẠááá¯ááºáá áºáá¯áááºáá®ážááẠáá±á¬ááºážááá¯áá»ááºáá áºáᯠáá±ážááá¯á·ááẠ(á€áá±áá¬á {host} ááẠWebHDFS áááºáá±á¬ááºááŸá¯á á¡áááºááŸááºááŒá áºáááºá {port} ááẠWebHDFS áááºáá±á¬ááºááŸá¯á ááááºáááºážááŒá áºááŒá®ážá {path-to-file-on-hdfs} ááẠááá¯ááºááá¯á· ááá¯áá»ááºáá±á¬ áááºážááŒá±á¬ááºážááŒá áºááẠHDFS ááœááº):
curl -i -X PUT "http://{host}:{port}/webhdfs/v1/{path-to-file-on-hdfs}?op=CREATE
á€áá²á·ááá¯á·áá±á¬ áá¯á¶á·ááŒááºáá»ááºááᯠáááºáááºáá¶áááŸááááá·áºááẠ(á€áá±áá¬ááœáẠ{áááºáá±áá¬} ááẠááá¯ááºááá¯áá±á«ááºážáá¯ááºáá¯ááºááẠá¡áá¯á¶ážááŒá¯áááºááá¯á¡ááºááá·áº URL ááŒá áºáááº)
HTTP/1.1 307 TEMPORARY_REDIRECT
Location: {location}
Content-Length: 0
Spark executable file ááᯠHDFS ááœáẠáááºáá« (á€áá±áá¬ááœáẠ{path-to-local-file} ááẠáááºááŸá host ááŸá Spark executable file ááá¯á· áááºážááŒá±á¬ááºážááŒá áºáááº)á
curl -i -X PUT -T {path-to-local-file} "{location}"
áááºážáá±á¬ááºá HDFS ááá¯á· á¡ááºáá¯ááºáá¯ááºáá¬ážáá±á¬ Spark ááá¯ááºááᯠá¡áá¯á¶ážááŒá¯á spark-submit ááŒá¯áá¯ááºááá¯ááºááẠ(á€áá±áá¬ááœáẠ{class-name} ááẠá¡áá¯ááºááŒá®ážááŒá±á¬ááºááẠá áááºáááºááá¯á¡ááºááá·áº class á¡áááºááŒá áºáááº)á
/opt/spark/bin/spark-submit --name spark-test --class {class-name} --conf spark.executor.instances=3 --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark --conf spark.kubernetes.namespace={project} --conf spark.submit.deployMode=cluster --conf spark.kubernetes.container.image={docker-registry-url}/{repo}/{image-name}:{tag} --conf spark.master=k8s://https://{OKD-API-URL} hdfs://{host}:{port}/{path-to-file-on-hdfs}
HDFS ááá¯áááºáá±á¬ááºááŒá®áž áá¯ááºáááºážáá±á¬ááºáá¬áá»á¬ážá¡áá¯ááºáá¯ááºááŒá±á¬ááºážáá±áá»á¬á á±áááºá¡ááœáẠDockerfile ááŸáá·áº entrypoint.sh script ááá¯ááŒá±á¬ááºážáá²áááºááá¯á¡ááºááá¯ááºááẠ- ááŸá®ááá¯áá±ááá±á¬á á¬ááŒáá·áºááá¯ááºáá»á¬ážááᯠ/opt/spark/jars áááºážááœáŸááºááá¯á·áá°ážáá°ááẠDockerfile ááá¯á· ááœáŸááºááŒá¬ážáá»ááºáá áºáá¯ááá·áºáááºááŸáá·áº entrypoint ááœáẠSPARK_CLASSPATH ááœáẠHDFS configuration ááá¯ááºááᯠááá·áºááœááºážáá«á sh.
áá¯áááá¡áá¯á¶ážááŒá¯ááŸá¯ááá á¹á - Apache Livy
ááá¯á·á¡ááŒáẠá¡áá¯ááºáá áºáá¯ááᯠáá®ááœááºááŒá®áž ááááºááᯠá ááºážáááºááẠááá¯á¡ááºáá±á¬á¡áá«á áááºážááᯠCI/CD áá¯ááºáááºážá ááºá áá áºá áááºáá áºááá¯ááºážá¡ááŒá Ạá áááºáá¯ááºáá±á¬ááºááŒá®áž áááºážá áá¯ááºáá±á¬ááºááŸá¯á¡ááŒá±á¡áá±ááᯠááŒá±áá¬áá¶ááẠáá±ážááœááºážáá±á«áºáá¬áá«áááºá áá¯ááºáá«áááºá áááºá áááºážááᯠlocal spark-submit call áá¯á¶ážááŒá®áž run ááá¯ááºáá±á¬áºáááºážá áááºážááẠSpark ááᯠCI áá¬áá¬á¡á±ážáá»áá·áºáá»á¬áž/á¡ááŒá±ážááá¬ážáá»á¬ážááœáẠááá·áºááœááºážááŒááºážááŸáá·áº ááŒááºáááºáááºááŸááºááŒááºážááŸáá·áº Kubernetes API ááᯠá¡áá¯á¶ážááŒá¯ááœáá·áºááᯠá áá áºááá·áºááœááºážááŒááºážááá¯á· ááá¯á¡ááºáá±á¬ááŒá±á¬áá·áº CI/CD á¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶ááᯠááŸá¯ááºááœá±ážá á±áááºá á€ááá á¹á á¡ááœááºá áá áºááŸááºá¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááẠKubernetes á¡á á¯á¡áá±ážá¡ááœááºážááŸá Spark áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºáááºá¡ááœáẠREST API á¡ááŒá ẠApache Livy ááá¯á¡áá¯á¶ážááŒá¯ááẠááœá±ážáá»ááºáá²á·áááºá áááºážáá¡áá°á¡áá®ááŒáá·áºá áááºááẠáá¯á¶ááŸáẠcURL áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á Spark áá¯ááºáááºážáá»á¬ážááᯠáá¯ááºáá±á¬ááºááá¯ááºááŒá®ážá áááºááá·áº CI ááŒá±ááŸááºážáá»ááºááá¯áááᯠá¡ááŒá±áá¶á ááœááºáá°á áœá¬á¡áá±á¬ááºá¡áááºáá±á¬áºááá¯ááºááŒá®áž Kubernetes á¡á á¯á¡áá±ážá¡ááœááºáž áááºážááá±áá¬áá»áá¬ážááŸá¯ááẠKubernetes API ááŸáá·áº á¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºááá·áºá¡áá« á¡áá±á¬ááºá¡áá¬ážá áá á áºááŒááºážááŒá¿áá¬ááᯠááŒá±ááŸááºážáá±ážáá«áááºá
á
ááºážáááºááœááºážáá
áºáá¯ááŸá Kubernetes á¡á
á¯á¡áá±ážááœáẠCI/CD áá¯ááºáááºážá
ááºá áá
áºá
áááºáá
áºááá¯ááºážá¡ááŒá
ẠSpark á¡áá¯ááºáá»á¬ážááᯠáá¯áááá¡áá¯á¶ážááŒá¯ááŸá¯á¡ááŒá
Ạáá®ážáá±á¬ááºážááá¯ážááŒááá¯ááºááŒáá«á
áá¯á·á
Apache Livy á¡ááŒá±á¬ááºáž á¡áááºážááẠ- áááºážááẠáááºá¡ááºáá¬áá±á·á
áºááŸáá·áº RESTful API ááᯠáá¶á·ááá¯ážáá±ážááá·áº HTTP áá¬áá¬áá
áºáá¯á¡áá±ááŒáá·áº ááá¯á¡ááºáá±á¬ ááá·áºáááºáá±á¬ááºáá»á¬ážááᯠáá»á±á¬áºááŒááºááŒááºážááŒáá·áº áá®ážááœá¬áž-áááºááœááºážááŸá¯ááᯠá¡áá±ážá០á
áááºááœáá·áºááŒá¯áááºá á¡á
ááºá¡áá¬á¡á¬ážááŒáá·áº áááºážááᯠHDP ááŒáá·áºááŒá°ážááŸá¯á áá
áºá
áááºáá
áºááá¯ááºážá¡ááŒá
Ạáááºááá¯á·áá²á·áá±á¬áºáááºáž ááá·áºáá»á±á¬áºáá±á¬ manifest ááŸáá·áº á€áá²á·ááá¯á·áá±á¬ Docker áá¯á¶á¡á
á¯á¶ááᯠá¡áá¯á¶ážááŒá¯á OKD ááá¯á·ááá¯áẠá¡ááŒá¬ážáá±á¬ Kubernetes áááºáááºááŒááºážááá¯á·áááºáž á¡áá¯á¶ážáá»ááá¯ááºááẠ-
FROM java:8-alpine
ENV SPARK_HOME=/opt/spark
ENV LIVY_HOME=/opt/livy
ENV HADOOP_CONF_DIR=/etc/hadoop/conf
ENV SPARK_USER=spark
WORKDIR /opt
RUN apk add --update openssl wget bash &&
wget -P /opt https://downloads.apache.org/spark/spark-2.4.5/spark-2.4.5-bin-hadoop2.7.tgz &&
tar xvzf spark-2.4.5-bin-hadoop2.7.tgz &&
rm spark-2.4.5-bin-hadoop2.7.tgz &&
ln -s /opt/spark-2.4.5-bin-hadoop2.7 /opt/spark
RUN wget http://mirror.its.dal.ca/apache/incubator/livy/0.7.0-incubating/apache-livy-0.7.0-incubating-bin.zip &&
unzip apache-livy-0.7.0-incubating-bin.zip &&
rm apache-livy-0.7.0-incubating-bin.zip &&
ln -s /opt/apache-livy-0.7.0-incubating-bin /opt/livy &&
mkdir /var/log/livy &&
ln -s /var/log/livy /opt/livy/logs &&
cp /opt/livy/conf/log4j.properties.template /opt/livy/conf/log4j.properties
ADD livy.conf /opt/livy/conf
ADD spark-defaults.conf /opt/spark/conf/spark-defaults.conf
ADD entrypoint.sh /entrypoint.sh
ENV PATH="/opt/livy/bin:${PATH}"
EXPOSE 8998
ENTRYPOINT ["/entrypoint.sh"]
CMD ["livy-server"]
áá¯ááºáá¯ááºááá¯ááºáá±á¬áá¯á¶á¡á¬áž á¡ááœááºáž OKD ááá¯ááŸá±á¬ááºááŸá¯áá²á·ááá¯á·áá±á¬ ááá·áºáááºááŸá Docker ááá¯ááŸá±á¬ááºáááºážááá¯á· á¡ááºáá¯ááºáá¯ááºá á¡ááºáá¯ááºáá¯ááºááá¯ááºáá«áááºá áááºážááá¯á¡áá¯á¶ážááŒá¯áááºá á¡á±á¬ááºáá« manifest ááá¯á¡áá¯á¶ážááŒá¯áá« ({registry-url} - Docker áá¯á¶ááŸááºáá¯á¶áááºááŒááºážá URLá {image-name} - Docker áá¯á¶á¡áááºá {tag} - Docker áá¯á¶áááºá {livy-url} - ááá¯áá»ááºáá±á¬ URL áá±áá¬ááœáẠáá¬áá¬ááẠLivy ááᯠáá¯á¶ážá áœá²ááá¯ááºáááá·áºáááº; á¡áááºá Red Hat OpenShift ááᯠKubernetes ááŒáá·áºááŒá°ážááŸá¯á¡ááŒá Ạá¡áá¯á¶ážááŒá¯áá«áá ááá¯á·ááá¯ááºáá«á áááºááá¯ááºáᬠIngress ááá¯á·ááá¯áẠService manifest á¡áá»áá¯ážá¡á á¬áž NodePort ááᯠá¡áá¯á¶ážááŒá¯áááº)
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
component: livy
name: livy
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
component: livy
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
component: livy
spec:
containers:
- command:
- livy-server
env:
- name: K8S_API_HOST
value: localhost
- name: SPARK_KUBERNETES_IMAGE
value: 'gnut3ll4/spark:v1.0.14'
image: '{registry-url}/{image-name}:{tag}'
imagePullPolicy: Always
name: livy
ports:
- containerPort: 8998
name: livy-rest
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /var/log/livy
name: livy-log
- mountPath: /opt/.livy-sessions/
name: livy-sessions
- mountPath: /opt/livy/conf/livy.conf
name: livy-config
subPath: livy.conf
- mountPath: /opt/spark/conf/spark-defaults.conf
name: spark-config
subPath: spark-defaults.conf
- command:
- /usr/local/bin/kubectl
- proxy
- '--port'
- '8443'
image: 'gnut3ll4/kubectl-sidecar:latest'
imagePullPolicy: Always
name: kubectl
ports:
- containerPort: 8443
name: k8s-api
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: spark
serviceAccountName: spark
terminationGracePeriodSeconds: 30
volumes:
- emptyDir: {}
name: livy-log
- emptyDir: {}
name: livy-sessions
- configMap:
defaultMode: 420
items:
- key: livy.conf
path: livy.conf
name: livy-config
name: livy-config
- configMap:
defaultMode: 420
items:
- key: spark-defaults.conf
path: spark-defaults.conf
name: livy-config
name: spark-config
---
apiVersion: v1
kind: ConfigMap
metadata:
name: livy-config
data:
livy.conf: |-
livy.spark.deploy-mode=cluster
livy.file.local-dir-whitelist=/opt/.livy-sessions/
livy.spark.master=k8s://http://localhost:8443
livy.server.session.state-retain.sec = 8h
spark-defaults.conf: 'spark.kubernetes.container.image "gnut3ll4/spark:v1.0.14"'
---
apiVersion: v1
kind: Service
metadata:
labels:
app: livy
name: livy
spec:
ports:
- name: livy-rest
port: 8998
protocol: TCP
targetPort: 8998
selector:
component: livy
sessionAffinity: None
type: ClusterIP
---
apiVersion: route.openshift.io/v1
kind: Route
metadata:
labels:
app: livy
name: livy
spec:
host: {livy-url}
port:
targetPort: livy-rest
to:
kind: Service
name: livy
weight: 100
wildcardPolicy: None
áááºážááá¯á¡áá¯á¶ážááŒá¯ááŒá®áž pod ááá¯á¡á±á¬ááºááŒááºá áœá¬á áááºááŒá®ážáá±á¬ááºá Livy graphical interface ááᯠlink ááœááºáááŸáááá¯ááºáá«áááº- http://{livy-url}/uiá Livy ááŒáá·áºá á¥ááá¬á Postman á០REST áá±á¬ááºážááá¯ááŸá¯ááᯠá¡áá¯á¶ážááŒá¯á áá»áœááºá¯ááºááá¯á·á Spark áá¯ááºáááºážááᯠáá¯ááºáá±ááá¯ááºáá«áááºá áá±á¬ááºážááá¯ááŸá¯áá»á¬ážáá«ááŸááá±á¬ á á¯á ááºážááŸá¯áá áºáá¯á ááá°áá¬ááᯠá¡á±á¬ááºááœááºáá±á¬áºááŒáá¬ážááẠ(á áááºáá¯ááºáá±á¬ááºááŒááºážá¡ááœáẠááá¯á¡ááºáá±á¬ ááááºážááŸááºáá»á¬ážááᯠ"args" array ááœáẠááŒááºáááºážááá¯ááºáááº-
{
"info": {
"_postman_id": "be135198-d2ff-47b6-a33e-0d27b9dba4c8",
"name": "Spark Livy",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"name": "1 Submit job with jar",
"request": {
"method": "POST",
"header": [
{
"key": "Content-Type",
"value": "application/json"
}
],
"body": {
"mode": "raw",
"raw": "{nt"file": "local:///opt/spark/examples/target/scala-2.11/jars/spark-examples_2.11-2.4.5.jar", nt"className": "org.apache.spark.examples.SparkPi",nt"numExecutors":1,nt"name": "spark-test-1",nt"conf": {ntt"spark.jars.ivy": "/tmp/.ivy",ntt"spark.kubernetes.authenticate.driver.serviceAccountName": "spark",ntt"spark.kubernetes.namespace": "{project}",ntt"spark.kubernetes.container.image": "{docker-registry-url}/{repo}/{image-name}:{tag}"nt}n}"
},
"url": {
"raw": "http://{livy-url}/batches",
"protocol": "http",
"host": [
"{livy-url}"
],
"path": [
"batches"
]
}
},
"response": []
},
{
"name": "2 Submit job without jar",
"request": {
"method": "POST",
"header": [
{
"key": "Content-Type",
"value": "application/json"
}
],
"body": {
"mode": "raw",
"raw": "{nt"file": "hdfs://{host}:{port}/{path-to-file-on-hdfs}", nt"className": "{class-name}",nt"numExecutors":1,nt"name": "spark-test-2",nt"proxyUser": "0",nt"conf": {ntt"spark.jars.ivy": "/tmp/.ivy",ntt"spark.kubernetes.authenticate.driver.serviceAccountName": "spark",ntt"spark.kubernetes.namespace": "{project}",ntt"spark.kubernetes.container.image": "{docker-registry-url}/{repo}/{image-name}:{tag}"nt},nt"args": [ntt"HADOOP_CONF_DIR=/opt/spark/hadoop-conf",ntt"MASTER=k8s://https://kubernetes.default.svc:8443"nt]n}"
},
"url": {
"raw": "http://{livy-url}/batches",
"protocol": "http",
"host": [
"{livy-url}"
],
"path": [
"batches"
]
}
},
"response": []
}
],
"event": [
{
"listen": "prerequest",
"script": {
"id": "41bea1d0-278c-40c9-ad42-bf2e6268897d",
"type": "text/javascript",
"exec": [
""
]
}
},
{
"listen": "test",
"script": {
"id": "3cdd7736-a885-4a2d-9668-bd75798f4560",
"type": "text/javascript",
"exec": [
""
]
}
}
],
"protocolProfileBehavior": {}
}
á á¯á ááºážááŸá¯á០ááááá¯á¶ážáá±á¬ááºážááá¯ááŸá¯ááᯠáá¯ááºáá±á¬ááºááŒáá«á áá¯á·á OKD á¡ááºáá¬áá±á·á áºááá¯á· ááœá¬ážáᬠáá¯ááºáá±á¬ááºá áá¬ááᯠá¡á±á¬ááºááŒááºá áœá¬ á áááºááá¯ááºááŒá®ááŒá áºááŒá±á¬ááºáž á á áºáá±ážáá« - https://{OKD-WEBUI-URL}/console/project/{project}/browse/podsá áá áºáá»áááºáááºážááŸá¬áááºá Session áá áºáá¯ááẠLivy á¡ááºáá¬áá±á·á Ạ(http://{livy-url}/ui) ááœáẠáá±á«áºáá¬áááºááŒá áºááŒá®áž áááºážá¡áá²ááŸá¬ Livy API ááá¯á·ááá¯áẠááááºáá áºá¡ááºáá¬áá±á·á áºááᯠá¡áá¯á¶ážááŒá¯á á¡áá¯ááºáááá¯ážáááºááŸá¯ááᯠááŒá±áá¬áá¶ááŒá®áž á ááºááŸááºááᯠáá±á·áá¬ááá¯ááºáááºá áá áºáá¯á¶ážáá»á¬áž
á¡áᯠLivy áááºááá¯á¡áá¯ááºáá¯ááºáááºááá¯áᬠááŒááŒáá·áºáá¡á±á¬ááºá áá«ááá¯áá¯ááºááá¯á· Livy áá¬áá¬áá²á· pod á¡ááœááºážááŸá¬ááŸááá²á· Livy ááœááºááááºáá¬ááŸááºáááºážááœá±ááᯠá á áºáá±ážááŒáá·áºáá¡á±á¬áẠ- https://{OKD-WEBUI-URL}/console/project/{project}/browse/pods/{livy-pod-name }?tab=logsá áááºážááá¯á·áá¶á០âlivyâ áᯠá¡áááºáá±ážáá¬ážááá·áº ááœááºááááºáá¬áá áºáá¯ááœáẠLivy REST API ááᯠáá±á«áºáá±á¬á¡áá«á á¡áááºááœááºá¡áá¯á¶ážááŒá¯áá²á·ááá·áºá¡ááá¯ááºáž áá»áœááºá¯ááºááá¯á·á¡áá¯á¶ážááŒá¯áá¬ážááá·áº spark-submit ááᯠááœááºáá»ááºááá¯ááºááẠ(á€áá±áá¬ááœáẠ{livy-pod-name} ááẠáááºáá®ážáá¬ážáá±á¬ pod áá¡áááºááŒá áºááẠLivy áá¬áá¬ááŸáá·áºá¡áá°) á á á¯á ááºážááŸá¯ááœáẠLivy áá¬áá¬ááᯠá¡áá¯á¶ážááŒá¯á Spark executable á¡áá±ážááááºážá áá áºááŒáá·áº áááºáá¶áá±á¬ááºááœááºáá±ážááá·áº á¡áá¯ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºááá¯ááºá á±ááá·áº áá¯ááááá±ážááœááºážáá áºáá¯ááá¯áááºáž ááááºáááºáá±ážáá«áááºá
ááááá¡áá¯á¶ážááŒá¯ááŸá¯ááá á¹á - Spark Operator
ááᯠá¡áá¯ááºá¡á¬áž á ááºážáááºááŒá®ážáá±á¬á¡áá«á áááºážááᯠáá¯á¶ááŸááºáá¯ááºáá±á¬ááºááẠáá±ážááœááºážáá±á«áºáá¬áááºá Kubernetes á¡á á¯á¡áá±ážáá áºáá¯ááœáẠá¡áá¯ááºáá»á¬ážááᯠáá¯á¶ááŸááºáá¯ááºáá±á¬ááºááẠáá°ááááºážáááºážááŸá¬ CronJob entity ááŒá áºááŒá®áž áááºážááᯠáááºá¡áá¯á¶ážááŒá¯ááá¯ááºáá±á¬áºáááºáž ááá¯á¡áá»áááºááœáẠKubernetes ááŸá á¡ááºááºáá®áá±ážááŸááºážáá»á¬ážááᯠá á®áá¶ááá·áºááœá²ááẠá¡á±á¬áºááá±áá¬áá»á¬ážá¡áá¯á¶ážááŒá¯ááŸá¯ááẠá¡ááœááºáá±áááºážá á¬ážáá±ááŒá®áž Spark á¡ááœáẠá¡ááœááºááá·áºáá»ááºáá±á¬ á¡á±á¬áºááá±áá¬áá áºáá¯áááºáž ááŸááá«áááºá áá¯ááºáááºážá¡ááá·áºááŒá±ááŸááºážáá»ááºáá»á¬ážááœáẠá¡áá¯á¶ážááŒá¯ááẠ(á¥ááá¬á Lightbend FastData Platform)á áááºážááᯠá¡áá¯á¶ážááŒá¯ááẠáá»áœááºá¯ááºááá¯á· á¡ááŒá¶ááŒá¯áá«ááẠ- Spark (2.4.5) á áááºááŸááááºááŒáááºáá±á¬áá¬ážááŸááºážááœáẠKubernetes ááœáẠSpark á¡áá¯ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºáááºá¡ááœáẠááá·áºáááºááœá²á·á ááºážááŸá¯ááœá±ážáá»ááºá áá¬áá»á¬ážááŸáááŒá®áž áá±á¬ááºá¡ááŒá®ážá á¬ážáá¬ážááŸááºáž (3.0.0) ááẠKubernetes á¡ááœáẠá¡ááŒáá·áºá¡ááá¶á·ááá¯ážááŸá¯ááᯠááŒá±áá¬áá¬ážáá±á¬áºáááºáž áááºážáááœááºááŸáááá·áºáááºá áœá²ááᯠáááááá±ážáá«á . Spark Operator ááẠá¡áá±ážááŒá®ážáá±á¬ ááœá²á·á ááºážááŸá¯áá¯á¶á á¶ááœá±ážáá»ááºá áá¬áá»á¬ážááᯠáá±á«ááºážááá·áºááŒááºážááŒáá·áº (á¥ááá¬á Spark pods ááá¯á· Hadoop access configuration ááŒáá·áº ConfigMap ááᯠáááºáááºááŒááºáž) ááŸáá·áº áá¯á¶ááŸááºá á®á ááºáá¬ážááá·áº á¡áá¯ááºáá áºáá¯ááᯠáá¯ááºáá±á¬ááºááá¯ááºááŒááºážááŒáá·áº á€áá»áá¯á·ááœááºážáá»ááºá¡ááœáẠáá»á±á¬áºááŒá±ážáá±ážáá«áááºá
áááºážááᯠááááááŒá±á¬ááºá¡áá¯á¶ážááŒá¯ááŸá¯ááá
á¹á
á¡ááŒá
Ạáá®ážáá±á¬ááºážááá¯ážááŒááá¯ááºááŒáá«á
áá¯á· - áá¯ááºáá¯ááºááŸá¯ááœááºážáááºááŸá Kubernetes á¡á
á¯á¡áá±ážááœáẠSpark á¡áá¯ááºáá»á¬ážááᯠáá¯á¶ááŸááºáá¯ááºáá±á¬ááºáá±áá«áááºá
Spark Operator ááẠGoogle Cloud Platform á¡ááœááºážááœáẠááœáá·áºáááºážáá±á¬á¡áááºážá¡ááŒá
áºááŒá
áºááŒá®áž áá®ááœááºáááºáá®ážáá¬ážááŒááºážááŒá
áºáááº-
- Lightbend FastData Platform/Cloudflow áááºáááºááŸá¯á áá áºá áááºáá áºááá¯ááºážá¡áá±ááŒáá·áºá
- áŠážáá¯ááºá¡áá¯á¶ážááŒá¯ááŒááºáž-
helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator helm install incubator/sparkoperator --namespace spark-operator
- ááá¬ážáááºááá¯ááŸá±á¬ááºááŸá¯ (https://github.com/GoogleCloudPlatform/spark-on-k8s-operator/tree/master/manifest) á០áááºáá®ážáááºá
áºáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážá á¡á±á¬ááºáá«ááá¯á·ááᯠáááááŒá¯ááá·áºááẠ- Cloudflow ááœáẠAPI áá¬ážááŸááºáž v1beta1 áá«ááá·áº á¡á±á¬áºááá±áá¬áá
áºáᯠáá«áááºáááºá á€ááá·áºááœááºážááŸá¯á¡áá»áá¯ážá¡á
á¬ážááá¯á¡áá¯á¶ážááŒá¯áá«áá Spark á¡ááá®áá±ážááŸááºážáá±á¬áºááŒáá»ááºáá»á¬ážááẠááá·áºáá»á±á¬áºáá±á¬ API áá¬ážááŸááºážááŒá
áºáá±á¬ Git ááŸá ááá°áá¬áááºáá»á¬ážáá±á«áºááœáẠá¡ááŒá±áá¶ááá·áºáááºá á¥ááá¬á "v1beta1-0.9.0-2.4.0"á á¡á±á¬áºááá±áá¬ááá¬ážááŸááºážááᯠ"áá¬ážááŸááºážáá»á¬áž" á¡áááá¬ááºááœáẠá¡á±á¬áºááá±áá¬ááœááºáá«ááŸááá±á¬ CRD ááá±á¬áºááŒáá»ááºááœáẠááœá±á·ááá¯ááºáááº-
oc get crd sparkapplications.sparkoperator.k8s.io -o yaml
á¡á±á¬áºááá±áá¬á¡á¬áž ááŸááºáááºá áœá¬ ááá·áºááœááºážáá«áá Spark á¡á±á¬áºááá±áá¬ááŸáá·áº áááºááá¯ááºááá·áº ááá±á¬áá»ááºááœáẠáááºááŒáœáá±á¬ áá±á«á·ááºáá áºáᯠ(á¥ááá¬á Cloudflow-fdp-sparkoperator ááẠCloudflow áááºáááºááŸá¯á¡ááœáẠCloudflow áá±áá¬ááŸá) ááŸáá·áº áááºááá¯ááºáᬠKubernetes á¡áááºážá¡ááŒá áºá¡áá»áá¯ážá¡á á¬áž âsparkapplicationsâ áá±á«áºáá¬áá«áááºá . á¡á±á¬ááºáá« command ááŒáá·áº áááŸáááá¯ááºáá±á¬ Spark á¡ááá®áá±ážááŸááºážáá»á¬ážááᯠáááºááŸá¬ááœá±ááá¯ááºáááº-
oc get sparkapplications -n {project}
Spark Operator ááᯠá¡áá¯á¶ážááŒá¯á áá¯ááºáá±á¬ááºá áá¬áá»á¬ážááᯠáá¯ááºáá±á¬ááºááẠáááºááẠá¡áᬠ3 áᯠáá¯ááºáá±á¬ááºááẠááá¯á¡ááºáááº-
- ááá¯á¡ááºáá±á¬ áá áºáá»á áºááá¯ááºáá»á¬ážá á¡ááŒááºááœá²á·á ááºážáá¯á¶ááŸáá·áº áá¯ááºáá±á¬ááºááá¯ááºáá±á¬ ááá¯ááºáá»á¬ážáá«áááºááá·áº Docker áá¯á¶áá áºáá¯ááᯠáááºáá®ážáá«á áá áºááŸááºáá¯á¶ááœááºá áááºážááẠCI/CD á¡ááá·áºááœáẠáááºáá®ážáá¬ážááŒá®áž á ááºážáááºááŸá¯á¡á á¯á¡áá±ážááœáẠá ááºážáááºáá¬ážááá·áº áá¯á¶ááŒá áºáááºá
- Kubernetes á¡á á¯á¡áá±ážá០áááºáá±á¬ááºááá¯ááºáá±á¬ ááŸááºáá¯á¶áááºáá áºáá¯ááá¯á· Docker áá¯ááºáá¯á¶ááᯠáá¯ááºáá±áá«á
- âSparkApplicationâ á¡áá»áá¯ážá¡á
á¬ážááŸáá·áº á
áááºáá¯ááºáá±á¬ááºáááá·áºáá¬áááºá áá±á¬áºááŒáá»ááºááŒáá·áº áááºáá®ážáááºá
áºáá
áºáá¯ááᯠáááºáá®ážáá«á ááá°áá¬áááºáá®ážáááºá
áºáá»á¬ážááá¯ááá¬ážáááºááá¯ááŸá±á¬ááºááŸá¯ááœááºáááŸáááá¯ááºáá«ááẠ(á¥ááá¬á
github.com/GoogleCloudPlatform/spark-on-k8s-operator/blob/v1beta1-0.9.0-2.4.0/examples/spark-pi.yaml ) Manifesto ááŸáá·áºáááºáááºá ááŸááºáá¬ážáá¬ážáááá·áº á¡áá±ážááŒá®ážáá±á¬á¡áá»ááºáá»á¬áž ááŸááááº-- âapiVersionâ á¡áááá¬ááºááẠá¡á±á¬áºááá±áá¬áá¬ážááŸááºážááŸáá·áº áááºááá¯ááºááá·áº API áá¬ážááŸááºážááᯠááœáŸááºááŒááááºááŒá áºáááºá
- âmetadata.namespaceâ á¡áááá¬ááºááẠá¡ááá®áá±ážááŸááºážááᯠá áááºááá·áº namespace ááᯠááœáŸááºááŒááá«áááºá
- âspec.imageâ á¡áááá¬ááºááœáẠá¡áá¯á¶ážááŒá¯ááááá¯ááºáá±á¬ ááŸááºáá¯á¶áááºáá áºáá¯ááœáẠáááºáá®ážáá¬ážáá±á¬ Docker áá¯á¶áááááºá á¬áá«ááŸáááá«áááºá
- âspec.mainClassâ á¡áááá¬ááºááœáẠáá¯ááºáááºážá ááºá áááºáá»áááºááœáẠáá¯ááºáá±á¬ááºááẠááá¯á¡ááºáá±á¬ Spark task class áá«áááºáááºá
- âspec.mainApplicationFileâ á¡áááá¬ááºááœáẠexecutable jar ááá¯ááºááá¯á· áááºážááŒá±á¬ááºážáá«áááºááááºá
- âspec.sparkVersionâ á¡áááá¬ááºááẠSpark á¡áá¯á¶ážááŒá¯áá±ááá·áºáá¬ážááŸááºážááᯠááœáŸááºááŒááá«áááºá
- âspec.driver.serviceAccountâ á¡áááá¬ááºááẠá¡ááá®áá±ážááŸááºážááá¯áááºáááºááẠá¡áá¯á¶ážááŒá¯ááá·áº áááºááá¯ááºáᬠKubernetes namespace á¡ááœááºážááŸá áááºáá±á¬ááºááŸá¯á¡áá±á¬áá·áºááᯠáááºááŸááºááá«áááºá
- âspec.executorâ á¡áááá¬ááºááẠá¡ááá®áá±ážááŸááºážá¡ááœáẠááœá²áá±áá±ážáá¬ážáá±á¬ á¡áááºážá¡ááŒá áºá¡áá±á¡ááœááºááᯠááœáŸááºááŒááá«áááºá
- "spec.volumeMounts" á¡áááá¬ááºááẠáá±ááᶠSpark á¡áá¯ááºááá¯ááºáá»á¬ážááᯠáááºáá®ážááá·áº áá±áááá¯ááºáᬠáááºážááœáŸááºááᯠáááºááŸááºááá«áááºá
áááºáá®ážáááºá áºáá áºáá¯ááᯠáááºáá®ážááŒááºážá á¥ááá¬áá áºáᯠ(á€áá±áá¬ááœáẠ{spark-service-account} ááẠSpark á¡áá¯ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºáááºá¡ááœáẠKubernetes á¡á á¯á¡áá±ážá¡ááœááºáž áááºáá±á¬ááºááŸá¯á¡áá±á¬áá·áºáá áºáá¯ááŒá áºáááº)
apiVersion: "sparkoperator.k8s.io/v1beta1"
kind: SparkApplication
metadata:
name: spark-pi
namespace: {project}
spec:
type: Scala
mode: cluster
image: "gcr.io/spark-operator/spark:v2.4.0"
imagePullPolicy: Always
mainClass: org.apache.spark.examples.SparkPi
mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.11-2.4.0.jar"
sparkVersion: "2.4.0"
restartPolicy:
type: Never
volumes:
- name: "test-volume"
hostPath:
path: "/tmp"
type: Directory
driver:
cores: 0.1
coreLimit: "200m"
memory: "512m"
labels:
version: 2.4.0
serviceAccount: {spark-service-account}
volumeMounts:
- name: "test-volume"
mountPath: "/tmp"
executor:
cores: 1
instances: 1
memory: "512m"
labels:
version: 2.4.0
volumeMounts:
- name: "test-volume"
mountPath: "/tmp"
á€áá±á¬áºááŒáá»ááºááẠáááºáá®ážáááºá áºááᯠááá¯ááºáá±áá®á Spark á¡ááºááºáá®áá±ážááŸááºážá¡ááœáẠááá¯á¡ááºáá±á¬áááºáá±á¬ááºááœáá·áºá¡ááœáá·áºá¡áá±ážáá»á¬ážáá±ážááá·áº Kubernetes API (ááá¯á¡ááºáá«á) áá¶á·ááá¯ážáá±ážááá·áº áááºáá±á¬ááºááŸá¯á¡áá±á¬áá·áºáá áºáá¯á¡á¬áž áááºááŸááºáá±ážáá«áááºá áá»áœááºá¯ááºááá¯á·áá¡ááŒá±á¡áá±ááœááºá á¡ááá®áá±ážááŸááºážááẠPods áááºáá®ážááẠá¡ááœáá·áºá¡áá±ážáá»á¬áž ááá¯á¡ááºáááºá ááá¯á¡ááºáá±á¬ á¡áááºážááá¹áá ááºážááŸá±á¬ááºááŸá¯ááᯠáááºáá®ážááŒáá«á áá¯á·á
oc adm policy add-role-to-user edit system:serviceaccount:{project}:{spark-service-account} -n {project}
Docker áá¯á¶ááœáẠáááºááá¯ááºáá¬ááá¯ááºááᯠá¡áááºááá·áºá áá¬áááá¯áá² ConfigMap ááᯠHadoop configuration ááŒáá·áº áááºááŸááºááá¯ááºá á±ááá·áº "hadoopConfigMap" parameter áá«áááºááá¯ááºáááºááᯠáááááŒá¯ááá·áºáá«áááºá áááºážááẠá¡áá¯ááºáá»á¬ážááᯠáá¯á¶ááŸááºáá¯ááºáá±á¬ááºáááºá¡ááœááºáááºáž ááá·áºáá»á±á¬áºááẠ- "á¡áá»áááºááá¬áž" ááá·áºáááºáá±á¬ááºááᯠá¡áá¯á¶ážááŒá¯á áá±ážáá¬ážáá±á¬ á¡áá¯ááºáá áºáá¯ááᯠáá¯ááºáá±á¬ááºáááºá¡ááœáẠá¡áá»áááºááá¬ážááᯠáááºááŸááºááá¯ááºáá«áááºá
ááá¯á·áá±á¬ááºá áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·ááááºáá®ážáááºá áºááᯠspark-pi.yaml ááá¯ááºááœáẠááááºážáááºážááŒá®áž áá»áœááºá¯ááºááá¯á·á Kubernetes á¡á á¯á¡áá±ážááá¯á· á¡áá¯á¶ážáá»áá«-
oc apply -f spark-pi.yaml
áááºážááẠâsparkapplicationsâ á¡áá»áá¯ážá¡á á¬ážá á¡áá¬ááá¹áá¯áá áºáá¯ááᯠáááºáá®ážáááá·áºáááº-
oc get sparkapplications -n {project}
> NAME AGE
> spark-pi 22h
á€ááá á¹á ááœááºá á¡ááºááá®áá±ážááŸááºážáá áºáá¯áá«ááŸááá±á¬ pod áá áºáá¯ááá¯áááºáá®ážáááºááŒá áºááŒá®ážá áááºáá®ážáá¬ážáá±á¬ "sparkapplications" ááœááºááŒáááá·áºá¡ááŒá±á¡áá±ááá¯ááŒááááá·áºáááºá áááºážááᯠá¡á±á¬ááºáá« command ááŒáá·áº ááŒáá·áºááŸá¯ááá¯ááºáá«áááºá
oc get sparkapplications spark-pi -o yaml -n {project}
á¡áá¯ááºááŒá®ážááŒá±á¬ááºáá±á¬á¡áá«á POD ááẠ"ááŒá®ážááŒá±á¬ááºáááº" á¡ááŒá±á¡áá±ááá¯á· ááœáŸá±á·áááºááŒá áºááŒá®ážá áááºážááẠ"sparkapplications" ááœááºáááºáž á¡ááºááááºáá¯ááºáááºááŒá áºáááºá á¡ááá®áá±ážááŸááºážááŸááºáááºážáá»á¬ážááᯠááá±á¬ááºáá¬ááœááºááŒáá·áºááŸá¯ááá¯ááºááẠááá¯á·ááá¯áẠá¡á±á¬ááºáá« command ááá¯á¡áá¯á¶ážááŒá¯ááŒááºáž (á€áá±áá¬ááœáẠ{sparkapplications-pod-name} ááẠáá¯ááºáá±á¬ááºáá±ááá·áºáá¯ááºáááºážá pod á¡áááºááŒá áºáááº)á
oc logs {sparkapplications-pod-name} -n {project}
á¡áá°ážááŒá¯ sparkctl utility ááᯠá¡áá¯á¶ážááŒá¯á Spark áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááá¯áááºáž á á®áá¶ááá·áºááœá²ááá¯ááºáá«áááºá áááºážááá¯ááá·áºááœááºážáááºá áááºážáá¡áááºážá¡ááŒá áºáá¯ááºááŒáá·áº repository ááá¯ááœá¬ážáá«á Go ááá¯ááá·áºááœááºážááŒá®áž ဠutility ááá¯áááºáá±á¬ááºáá«-
git clone https://github.com/GoogleCloudPlatform/spark-on-k8s-operator.git
cd spark-on-k8s-operator/
wget https://dl.google.com/go/go1.13.3.linux-amd64.tar.gz
tar -xzf go1.13.3.linux-amd64.tar.gz
sudo mv go /usr/local
mkdir $HOME/Projects
export GOROOT=/usr/local/go
export GOPATH=$HOME/Projects
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
go -version
cd sparkctl
go build -o sparkctl
sudo mv sparkctl /usr/local/bin
Spark áá¯ááºáá±á¬ááºáá±ááá·áº áá¯ááºáááºážáá±á¬ááºáá¬áá»á¬ážá á¬áááºážááᯠáááºážá á áºááŒáá·áºááŒáá«á áá¯á·á
sparkctl list -n {project}
Spark áá¯ááºáááºážá¡ááœáẠáá±á¬áºááŒáá»ááºáá áºáᯠáááºáá®ážááŒáá«á áá¯á·á
vi spark-app.yaml
apiVersion: "sparkoperator.k8s.io/v1beta1"
kind: SparkApplication
metadata:
name: spark-pi
namespace: {project}
spec:
type: Scala
mode: cluster
image: "gcr.io/spark-operator/spark:v2.4.0"
imagePullPolicy: Always
mainClass: org.apache.spark.examples.SparkPi
mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.11-2.4.0.jar"
sparkVersion: "2.4.0"
restartPolicy:
type: Never
volumes:
- name: "test-volume"
hostPath:
path: "/tmp"
type: Directory
driver:
cores: 1
coreLimit: "1000m"
memory: "512m"
labels:
version: 2.4.0
serviceAccount: spark
volumeMounts:
- name: "test-volume"
mountPath: "/tmp"
executor:
cores: 1
instances: 1
memory: "512m"
labels:
version: 2.4.0
volumeMounts:
- name: "test-volume"
mountPath: "/tmp"
sparkctl ááᯠá¡áá¯á¶ážááŒá¯á áá±á¬áºááŒáá¬ážáá±á¬ áá¯ááºáá±á¬ááºá áá¬ááᯠáá¯ááºáá±á¬ááºááŒáá«á áá¯á·á
sparkctl create spark-app.yaml -n {project}
Spark áá¯ááºáá±á¬ááºáá±ááá·áº áá¯ááºáááºážáá±á¬ááºáá¬áá»á¬ážá á¬áááºážááᯠáááºážá á áºááŒáá·áºááŒáá«á áá¯á·á
sparkctl list -n {project}
á áááºááá¯ááºáá±á¬ Spark áá¯ááºáááºážá ááŒá áºáááºáá»á¬ážá á¬áááºážááᯠáááºážá á áºááŒáá·áºááŒáá«á áá¯á·á
sparkctl event spark-pi -n {project} -f
áááºáááºáá±áá±á¬ Spark áá¯ááºáááºážá á¡ááŒá±á¡áá±ááᯠáá±á·áá¬ááŒáá·áºááŒáá«á áá¯á·á
sparkctl status spark-pi -n {project}
áááá¯á¶ážáá»á¯ááºá¡áá±ááŒáá·áº Kubernetes ááœáẠSpark (2.4.5) á áááºááŸááááºááŒáááºáá±á¬áá¬ážááŸááºážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážá ááœá±á·ááŸááá¬ážáá±á¬ á¡á¬ážáááºážáá»ááºáá»á¬ážááᯠáá¯á¶ážáááºááŒáá·áºááá¯áá«áááºá
- áááá¡áá»ááºááŸáá·áº á¡áááá¡á¬ážáááºážáá»ááºááŸá¬ Data Locality áááŸáááŒááºážáááºááŒá áºáááºá YARN á áá»áá¯á·ááœááºážáá»ááºáá»á¬ážá¡á¬ážáá¯á¶ážááŸááá±á¬áºáááºáž áááºážááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááœáẠá¡á¬ážáá¬áá»ááºáá»á¬ážááŸááááºá á¥ááá¬á áá¯ááºááá¯á·áá±áá¬áá±ážááá¯á·ááŒááºážáááá¬á (áá±áá¬ááŸáá¯ááºááá¯ááº)á áááºážááŒá±á¬áá·áºá Spark áá¯ááºáááºážáá»á¬ážááᯠááœááºáá»ááºááŸá¯áá»á¬ážááœáẠáá«áááºáá±á¬ áá±áá¬áá»á¬áž áááºááŸááᬠnode áá»á¬ážáá±á«áºááœáẠáá¯ááºáá±á¬ááºáá²á·ááŒá®ážá ááœááºáááºáá±á«áºááŸá áá±áá¬áá±ážááá¯á·ááẠá¡áá»áááºááŒá¬áá»ááẠáááááá¬áᬠáá»á±á¬á·áá»ááœá¬ážáááºá Kubernetes ááá¯á¡áá¯á¶ážááŒá¯áá±á¬á¡áá«á áá»áœááºá¯ááºááá¯á·ááẠááœááºáááºáá áºáá»áŸá±á¬áẠáá¯ááºáá±á¬ááºá áá¬áá áºáá¯ááœááºáá«áááºááá·áºáá±áá¬ááᯠááœáŸá±á·ááẠááá¯á¡ááºááŸá¯ááŸáá·áº áááºááá¯ááºáá±ááááºá áááºážááá¯á·ááẠá¡áá¯á¶á¡áá±á¬ááºááŒá®ážáá¬ážáá«áá áá¯ááºáááºážáá¯ááºáá±á¬ááºáá»áááºááẠáááááá¬áá¬ááá¯ážáá¬ááá¯ááºááŒá®áž áááºážááá¯á·ááá¬áá®ááá¯ááŸá±á¬ááºááŸá¯á¡ááœáẠSpark áá¯ááºáááºážáá±á¬ááºáá¬áá»á¬ážááœáẠááœá²áá±áá»áá¬ážáá±ážááá·áº disk space ááá¬ááááºáž ááá¯á¡ááºáá«áááºá Kubernetes (á¥ááá¬á Alluxio) ááŸá áá±áá¬áá±áá¬áá±áááᯠáá±áá»á¬á á±ááá·áº á¡áá°ážááŒá¯áá±á¬á·ááºáá²ááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áº á€á¡á¬ážáááºážáá»ááºááᯠáá»á±á¬á·áá«ážáááºáá¬á á±ááá¯ááºáá±á¬áºáááºáž áááºážááẠá¡ááŸááºáááẠKubernetes á¡á á¯á¡áá±ážá node áá»á¬ážááœáẠáá±áá¬áááá¹áá°á¡ááŒáá·áºá¡á á¯á¶ááᯠááááºážáááºážáá¬ážááẠááá¯á¡ááºáááºáᯠááá¯ááá¯áááºá
- áá¯áááá¡áá±ážááŒá®ážáá±á¬á¡á¬ážáááºážáá»ááºááŸá¬ áá¯á¶ááŒá¯á¶áá±ážááŒá áºáááºá áá°áá¡á¬ážááŒáá·áºá Spark áá¯ááºáá±á¬ááºááŸá¯áá»á¬áž áá¯ááºáá±á¬ááºááŒááºážááá¯ááºáᬠáá¯á¶ááŒá¯á¶áá±ážááá¯ááºáᬠá¡ááºá¹áá«áááºáá»á¬ážááᯠááááºáá¬ážáááºá Kerberos á¡áá¯á¶ážááŒá¯ááŸá¯ááᯠááá¬ážáááºá á¬ááœááºá á¬áááºážááœáẠá¡áá»á¯á¶ážááááºáá« (áá±á¬ááºáááºá¡áá¯ááºáá»á¬áž ááá¯á¡ááºááá·áº áá¬ážááŸááºáž 3.0.0 ááœáẠáááºááá¯ááºáᬠááœá±ážáá»ááºááŸá¯áá»á¬ážááᯠááááºáááºáá¬ážáá±á¬áºáááºáž) ááŸáá·áº áá¯á¶ááŒá¯á¶áá±ážá á¬ááœááºá á¬áááºážáá»á¬ážá¡ááœááºá Spark (https://spark.apache.org/docs/2.4.5/security.html) ááá¯á¡áá¯á¶ážááŒá¯á YARNá Mesos ááŸáá·áº Standalone Cluster áá¬áá»áŸáẠá¡áááá ááá¯ážááá¯ááºáá»á¬ážá¡ááŒá Ạáá±á«áºáá¬áá«áááºá áá áºáá»áááºáááºážááŸá¬áááºá Spark áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠá áááºáá¯ááºáá±á¬ááºááá·áº áá¯á¶ážá áœá²áá°ááᯠááá¯ááºááá¯ááºááááºááŸááºááá¯ááºáá« - áá»áœááºá¯ááºááá¯á·ááẠáááºážá¡á±á¬ááºááœáẠá¡áá¯ááºáá¯ááºááá·áº áááºáá±á¬ááºááŸá¯á¡áá±á¬áá·áºááá¯áᬠáááºááŸááºáá±ážááŒá®áž á¡áá¯á¶ážááŒá¯áá°ááᯠááŒá¯ááŒááºáá¬ážáá±á¬ áá¯á¶ááŒá¯á¶áá±ážáá°áá«ááá»á¬ážá¡áá±á«áº á¡ááŒá±áá¶á ááœá±ážáá»ááºáá«áááºá á€ááá á¹á ááŸáá·áº áááºáááºáá á¡áá¯á¶ážááŒá¯áá°á¡á¬áž á¡áá¯á¶ážááŒá¯áááºááŒá áºá á±á ááŒá áºááœááºážáá±á¬áááºáááºážáá»ááºááœáẠáá±ážáááºážááŸá¯áááŸááá±á¬ ááá¯á·ááá¯áẠáá±áá¬á¡áá¯á¶ážááŒá¯ááœáá·áºá¡ááœáá·áºá¡áá±ážáá»á¬ážááᯠááŒáá·áºáá±ááá·áºá¡áá«ááœáẠá¡áááºáááŒá±ááá·áº áá»áááºáž UID ááŸáááá·áºá¡áá¯á¶ážááŒá¯áá° (áááºážááᯠPodSecurityPolicies áááºáá®ážááŒá®áž áááºážááá¯á·ááᯠáá»áááºáááºááŒááºážááŒáá·áº áááºážááᯠááŒá±ááŸááºážááá¯ááºáá«áááºá áááºááá¯ááºáá¬áááºáá±á¬ááºááŸá¯á¡áá±á¬áá·áºáá»á¬áž)á áááºááŸáááœááºá ááŒá±ááŸááºážáá»ááºááŸá¬ ááá¯á¡ááºáá±á¬ááá¯ááºá¡á¬ážáá¯á¶ážááᯠDocker áá¯á¶ááœáẠááá¯ááºááá¯ááºáá±áá¬áá»ááẠááá¯á·ááá¯áẠááá·áºá¡ááœá²á·á¡á ááºážá¡ááœááºážááŸá áá»áŸáá¯á·ááŸááºáá»ááºáá»á¬ážááᯠááááºážáááºážááŒááºážááŸáá·áº ááŒááºáááºááá°ááŒááºážá¡ááœáẠááá¹ááá¬ážá¡á¬áž á¡áá¯á¶ážááŒá¯áááºá¡ááœáẠSpark launch script ááᯠááœááºážáá¶áááºááŒá áºáááºá
- Kubernetes ááᯠá¡áá¯á¶ážááŒá¯á Spark á¡áá¯ááºáá»á¬ážááᯠáá¯ááºáá±á¬ááºááŒááºážááẠá ááºážáááºáá¯ááºááœáẠááá¬ážáááºááŸááá±áá²ááŒá áºááŒá®áž á¡áá¬áááºááœáẠá¡áá¯á¶ážááŒá¯áá¬ážáá±á¬ ááŸá±ážáá±á¬ááºážáá á¹á ááºážáá»á¬áž (ááœá²á·á ááºážáá¯á¶ááá¯ááºáá»á¬ážá Docker á¡ááŒá±áá¶áá¯á¶áá»á¬ážááŸáá·áº á áááºááá·áº scripts) áá»á¬ážááœáẠáááá¬áááºááŸá¬ážáá±á¬ááŒá±á¬ááºážáá²ááŸá¯áá»á¬áž ááŸáááá¯ááºáá«áááºá á¡ááŸááºáááºá áá á¹á ááºážááá¯ááŒááºáááºáá±á¬á¡áá«á áá¬ážááŸááºáž 2.3.0 ááŸáá·áº 2.4.5 ááá¯á ááºážáááºáá²á·ááŒá®ážá á¡ááŒá¯á¡áá°ááẠáááááá¬áá¬ááœá²ááŒá¬ážááœá¬ážáááºá
á¡ááºááááºáá»á¬ážááᯠá á±á¬áá·áºááŒáá«á áá¯á· - Spark (3.0.0) áá¬ážááŸááºážá¡áá áºááẠáááŒá¬áá±ážáá®á ááœááºááŸááá²á·ááŒá®ážá Kubernetes ááŸá Spark á á¡áá¯ááºááœáẠáááá¬áááºááŸá¬ážáá±á¬ á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááᯠáá°áá±á¬ááºáá¬áá²á·áá±á¬áºáááºáž á€á¡áááºážá¡ááŒá áºáááºáá±áá»á¬á¡ááœáẠáá¶á·ááá¯ážááŸá¯á á ááºážáááºááŸá¯á¡ááŒá±á¡áá±ááᯠáááºáááºááááºážááááºážáá¬ážáááºá áá¬ááá·áºá¡ááºááááºáá»á¬ážááẠááá·áºá áá áºááá¯á¶ááŒá¯á¶áá±ážá¡ááœáẠááŒá±á¬ááºááœá¶á·ááŒááºážáááŸááá² áá¯ááºáá±á¬ááºááá¯ááºáá±á¬á¡á áááºá¡ááá¯ááºážáá»á¬ážááᯠááœááºáááºá áœá¬ááœááºážáá¶ááŒááºáááºáááºáááá¯á¡ááºáá² YARN ááŸáá·áº Spark á¡áá¯ááºáá»á¬ážááᯠKubernetes ááœáẠá¡ááŒá®ážá¡ááŒááºáá¯ááºáá±á¬ááºááẠá¡ááŒáá·áºá¡áá¡ááŒá¶ááŒá¯ááá¯ááºá á±áááºááŒá áºáááºá
áá±á¬ááºá
source: www.habr.com