ááľ á ááŁá˘áá˝ á°á á á¨á°á áľá˘ áᏠáľá Apache Spark áĽá áľá áááľ á°áľááá˝ áľáá˝ áĽáááááŤáá.
á ááááá á¨á˘á áłáł ááá ááľáĽáŁ Apache Spark á¨áŁá˝ áłáł áááá áŞáŤ á°ááŁáŤáľá áááłá á áľááááá á°á¨á ááᢠá á°á¨ááŞá ᣠá áááᎠáŁá˝ á
áá°-ááłáĽ ᣠáááá á áĽá áááᣠáá¨áá á áľáá˝ áááá˝ (Spark Structured Streaming) ááľáĽ á¨áá°áŠ á¨áĽá¨áľ á áááŹá˝áá˝á áááá áá áá á
ááᢠáĽá á á°áááś YARN (áááá á á ááłááľ á ááŁááá˝ Apache Mesos) áĽáá° á¨ááĽá¨áľ á áľá°áłáłáŞ á áá áá á¨á á ááá á¨ááąá ááá á áŤá ááᢠáĽ.á¤.á . á 2020 ᣠá áŁá
ááá ááá á á ááá á á áĽááááš áŠáŁááŤáá˝ ááľáĽ áĽáŠ á¨ááąá áľáááľ áŁáááአáĽáŤá ááľáĽ áá - ᨠHDP áĽá CDH áááľ ááá ᣠCDH á á°áἠáŤááłá ᨠáĽá á¨áá°á á᪠áŤáá á˛áá á¨á°ááŠáľ Hadoop á á
áŤá˘áá˝á á áá¸á ᢠáá ááááá á ááá ááá á¨áá°ááľ á°áľá á¨áááᢠáľááá
Kubernetes á á áá áá Apache Spark áááአá á
áĽá¨á°á°áĄ áĽá á áľááá
áŠáŁááŤáá˝ ááŤá¨á áŤáá ááááľ áĽá¨á¨áᨠáá - á áŽáá´ááá áŚááŹáľáľáŤ áĽá á áá áĽá á ááἠá°áááá˝ ááľáĽ á áŽáá´ááá áŚááŹáľáľáŤ áĽá á ááĽá¨áľ á áľá°áłá°á ááľáĽ áá°á á ááá ᣠá˝ááŠá á YARN áá á¨áľááá á°ááŁáŤáľá á áááá˝ áááááĽá áááłáľ áĽá áŤáááŁá ᢠáĽá á¨áááľ áĽá áááľ áľáááśá˝ á ááá áá áá˝ áĽá ááľááŽá˝ áá áŠáŁááŤáá˝ áŤáááá¨áĽ á áá°á áá áŤá ááľá¨áᢠá á°á¨ááŞá ᣠá áłááááľ áá
ᾠᣠá áĽááááš á¨áŤáłá¸á áááľ áááśá˝á áááááľ á˝ááá áĽá á á á ááá áá áŤáá¸áá áĽáááľ á¨áá¨áá ᣠáá
á áĽáá
áľáá´áá ááá áŤá°ááááá˘
á¨áľáŞáľ 2.3.0 ááᎠApache Spark á Kubernetes áááľá°á ááľáĽ áĽáŤáá˝á áááľáŹáľ áŚáá´áá áľáá á áááˇá áĽáá áᏠáľááá
á ááŤá¨áĽ áá
áłá áĽáľáᾠᣠáľá á á ááá á¨á°ááŤáŠ á ááŤáŽá˝ áĽá á áá°áá አáá
áľ ááŤááĽá áľááá˝á á˝ááŽá˝ áĽáááááŤáá á˘
á ááááŞáŤ á°á¨á á Apache Spark áá á°ááľáá°á á°ááŁáŽá˝á áĽá á áááŹá˝áá˝á á¨áááááľ áá°áąá áĽáá áĽá á Kubernetes áááľá°á áá á ááľá á°ááŁá áááľáŹáľ á¨ááŤáľáááááľá á¨á°áááą ááłáŽá˝á áĽááłáᢠáá
á ááĽá á áááááľ ááᣠOpenShift áĽáá° áá¨áá፠áĽá
á áá áááá áĽá á¨áľáĽáá ááľáá áááááŤá (oc) áá á°ááá
ááľ áŤáá¸áá áľáááá˝ áá°áŁáᢠáááá˝ á¨áŠá áááľáľ áľáááśá˝áŁ á¨áá°á áá Kubernetes á¨áľáĽáá ááľáá áááá፠(kubectl) ááá á áááááťá¸á (áááłáᣠá oc adm ááá˛) á°ááłá áľáááá˝á áá áá ááťááá˘
á¨ááááŞáŤ á á ááá ááŤáŁ - áĽáááł-ááľá¨á¨áĽ
á á°ááŁáŽá˝ áĽá á áááŹá˝áá˝ áááľ áá áľ ááá˘á á¨ááἠáááĽá ááá¨á á°ááŁáŤáľá ááŤááľ á áá áľá˘ á ááľá ááłáĄáŁ áľáąáŚáľ ááĽááá á áááá˝ áĽá á áá ááá áá˝ááᣠááá áá á áĽááá°á (ááá áĽááłá áá°á á˘ááá) á¨ááťá áľáááśá˝ áááłáá˝ á°áłáľá áŤáá áĽáľááľ á áá á¨áľáŤ ááá ááľáĽ ááŁá áĽá á¨á°áťá áá á°áááˇáᢠá¨ááťá áľáááśá˝á áĽááá°á áááłáá˝á áľááľá°áŤáá áááľ áááłáá˝ ááአáá˝ááá˘
- ááá˘á á áĽá¸áááľ áááł ááľáĽ á á áŤáŁá˘á á¨áľááá á°ááŁáá áŤáŤááłá;
- á ááľ ááᢠá áá¨áŤ áá°áľ ááľáĽ á áŠá áááľáľ áááľá°á áá á¨áľááá á°ááŁáá áŤáŤááłáá˘
á¨ááááŞáŤá á ááŤá á¨ááá ááĽáľ á áá ᣠáá áĽá ááłáśá˝á áŤáľá¨áľááá˘
- áĽáŤááłááą ááᢠá¨áĽáŤ áŚáł áá° áĽáą á¨ááŤáľáááá¸á á¨áá¨á¨áť áľáááśá˝ áááłáá˝ áá ááľá¨áľ á áá áľ á˘
- áĽá¨á°ááᣠáŤááá á°ááŁá áááľáŹáľ á áá áŤá áá˝á áá á á áá á áŤáá ááĽáľ áŤáľáááá.
ááá°áá á ááŤá áĽááá ááłáśá˝ á¨ááľá ᣠááááŤáąá á¨áŠá áááľáľ áááľá°á á á ááá á áľááá á¨áááá á¨ááĽááľ áááł ááľáŤ áľáŤáá˝ áááá°áĽ áĽá á áľááááá á¨ááťá áľáááľ áááłáá˝á áĽáá˛áŤáá áľáááŤáľá˝á á¨áŠá áááľáľ á áá ፠á áá áá á ááá ááááľ ááťáá ᢠááá á¨áááľ áĄáľá á áŁááľ. áĽáá° ááááŞáŤá á¨á á ááá ááłá áĽááľáá - á áá¨áŤ áá¨áł ááľáĽ áŁáá á¨áŠá áááľáľ áááľá°á áá á¨áľááá á°ááŁáŤáľá á¨á áŤáŁá˘á ááᢠáá˝á ááľáááá˘
áľáááá á á áá ááľáĽ áááľáŹáľ áľááááááľ áá°áľ á¨á áá áĽáááááᢠáľáááá áá áá ááááá áĽáąá ááŤá áŤáľáááááłááĄ-
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
áá áááŁáł áĽá áá áááľáłá áĽá á¨áśá¨á ááľáá˝á áááá á áĽá á Kubernetes áááľá°á áá áááľáŹáľ á¨"áľáĽá°áŁ/" áá፠ááľáĽ á¨áá áááá˝á áĽáť áá á¨ááŤáľáááá ᣠáľááá áá á áááľ ááŽáááľ áĽáť ááááŁáľ áľá˝ááá áĄ-
./build/mvn -f ./assembly/pom.xml -Pkubernetes -DskipTests clean package
Spark jobs á Kubernetes áá áááľáŹáľ áĽáá° áá°á¨áłá ááľá ááá áá Docker ááľá ááá á áŤáľáááááłáᢠáĽáá 2 ááá á¨áá˝á áá´áá˝ á á-
- á¨ááá¨á Docker ááľá á¨áá°áá á¨áá á¨áľááá á°ááŁá áŽáľ áŤáŤáľáłá;
- á¨á°áá á¨á ááľá áľáááá áĽá á áľááá áĽááá˝á áĽáť áŤáŤáľáłáᣠá¨ááááá áŽáľ á áááľ áá á¨ááľá°ááá°á (áááłá á á¤á˝á˛á¤áá¤áľ)á˘
á ááááŞáŤáŁ á¨áľááá á°ááŁá á¨áá¨áŤ ááłá á¨áŤá Docker ááľá áĽááááŁá˘ Docker ááľáá˝á áááá áᣠSpark "docker-image-tool" á¨ááŁá áááá፠á ááᢠá áĽáą áá áŤááá áĽááłáł áĽáá ááĄ-
./bin/docker-image-tool.sh --help
á áĽáą áĽááłáł Docker ááľáá˝á ááá á áĽá áá° á¨áááľ ááááŚá˝ ááľáá áá˝áá, ááá áá á ááŁáŞááľ á ááŤáł ááłáśá˝ á ááľ:
- áŤáááá á˝áá 3 Docker ááľáá˝á á á ááľ áá áááĽáŤá - á Spark ᣠPySpark áĽá R;
- á¨ááľá áľá áĽáá˛áááš á ááá áľáááľá.
áľááá ᣠá¨áá á áłá˝ á¨á°á°á áá á¨á°áťáťááá á¨áá á áááá፠áľáŞáľ áĽáá áááááĄ-
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
á áĽáą áĽááłáł áľáááá á áá áá áá áááľááľ á¨áá¨áŤ á°ááŁáá á¨áŤá áá°á¨áłá á¨áľááá ááľá áĽáá°á áľáŁáá (áĽáá {docker-registry-url} ᨠDocker ááľá áááἠá¤áľá áŠá áá¤á ááᣠ{repo} á áááᥠááľáĽ áŤáá áá¨ááť áľá ááᣠá¨ááŽáááą áá á¨áááá°á á OpenShift , {image-name} â á¨ááľá áľá (áŁááśáľáľ-á°á¨á á¨ááľáá˝ áááŤá¨áľ áĽá á áá á¨áá áááłá áĽáá° á¨á°áááá ᨠRed Hat OpenShift ááľáá˝ áááἠááľáĽ)ᣠ{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
á¨áŽááśá áááááŤáá á áá áá áá° OKD áááľá°á ááᥠ(áĽáá {OKD-API-URL} á¨OKD áááľá°á API URL áá)áĄ
oc login {OKD-API-URL}
á Docker áááἠá¤áľ ááľáĽ á¨á ááá á°á áá ááľáá°áŤ ááááľ áĽááááĄ
oc whoami -t
áᰠᨠOKD áááľá°á á¨ááľáĽ Docker áááἠááᥠ(á¨ááľááá áľááá á áá áá á¨á°áááá ááľáá°áŤ áĽáá° á¨ááá áá áĽáá áááá)
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 ááľáĽ áááŠá áĽáááľá˝á˘ áá áá áááľá¨á áŠá áá¤áá á á áłáš ááľáĽ á¨á°ááá á¨ááŽáááľ ááľáá˝ áááá áá ááááą (áĽáá {ááŽáááľ} á OpenShift áááľá°á ááľáĽ áŤáá á¨ááŽáááą áľá ááᣠ{OKD-WEBUI-URL} á¨OpenShift Web console URL áá ) - https://{OKD-WEBUI-URL}/console /project/{project}/browse/images/{image-name}á˘
á°ááŁáŤáľá áááľáŹáľ á¨á áááááľ áá፠ááá á á áá áľ ááśá˝á áĽáá° áľá á¨áááľ áአááĽáśá˝ (áá á ááĽáĽ á áá áĽáááááŤáá)
oc create sa spark -n {project}
oc adm policy add-scc-to-user anyuid -z spark -n {project}
á¨á°áá á¨áá á¨á áááááľ áá፠áĽá á¨áśá¨á ááľá á áááá˝ á¨áľááá á°ááŁáá áá° OKD áááľá°á ááá°á ᨠspark-submit áľáááá áĽáááľá˘
/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
áĽáá :
- áľá - á¨áŠá áááľáľ ááľáśá˝ áľá á ááá áá áľ áá á¨ááłá°áá á°ááŁá áľá;
-ááá - á¨ááááá ááá ááá, áľáŤá á˛ááá ááŁáá;
-conf - á¨áľááá áá á¨áľ áááŞáŤáá˝;
spark.executor.instances - ááááá á¨áľááá á áľááááá˝ áĽááľ;
spark.kubernetes.authenticate.driver.serviceAccountName - á¨áŠá áááľáľ á áááááľ áá፠áľá ááľáśá˝á á˛ááአ(á¨áŠá áááľáľ á¤áá á áá á ááááá áľ áá á¨á°á áááľ á ááľ áĽá á˝ááłáá˝á áááá°á);
spark.kubernetes.namespace - á¨áŠá áááľáľ áľá áŚáł ášáá áĽá á áľááá ááśá˝ á¨ááááŠá áľ;
spark.submit.deployMode - áľáááá á¨ááľááá áá´ (ááá°á á áľááá á áľáᣠ"áááľá°á" áĽá á áá ááááᣠááľááá áŚááŹá°á áĽá á áá áá á¨áľááá "á°áá á" áľáŞáśá˝);
spark.kubernetes.container.image - á¨áśá¨á ááľá ááľáá˝á áááľááá á¨ááŤáááá;
spark.master â Kubernetes API URL (ááŤáá á°áááżá áľááá ááłá¨áť á¨á áŤáŁá˘á áá˝á áá¨á°áłá);
local:// á Docker ááľá ááľáĽ áá° Spark executable á¨áááľá°á ááááľ ááá˘
áá° á°ááłá ᨠOKD ááŽáááľ áá°á á¨á°áá áŠáľá ááśá˝ - https://{OKD-WEBUI-URL}/console/project/{project}/browse/pods áĽáá áááá˘
á¨ááľááľ áá°áąá ááááá áá á ááŤá áá áá ááťááᣠáá á á¨á°ááá°á á¨áľááá ááľá á¨ááá áá áľáŁ á ááá á°ááŁáŤáľ ááááľ áĽá á áá á¨áááá áľáŁ áĽá áá°áá አá¨áá˝á áááá˝ á á˝á áłá áá˝ áĽááłáá˝ áá° ááŤá áá¨ááť (áááłá ááąá) á¨ááłá°á áĽá á áá°ááá áľ áá ááááťáᢠáĽáááł-á áľá¨áἠáĽáá° áááá. á áá á ááŁá Docker ááľáá˝á áĽáá°áá áłááááĄáŁ ááľáá˝á ááá°á áááłá WebHDFSá á áá áá á¨á°ááŤáŠ á¨áľááá á°ááŁáŤáľá áľáŞáśá˝ áááľ áá˝ááᢠááá áááá á áĽáŤá áĽáááŤáá (áĽáá {á áľá°ááá } á¨ááĽá¤á˝á˛á¤áá¤áľ á áááááľ á áľá°ááá ááᣠ{áááľ} á¨ááĽá¤á˝á˛á¤áá¤áľ á áááááľ áá°áĽ ááᣠ{path-to-file-on-hdfs} áá° ááá á¨áááľá°á ááááľ áá á á¤á˝á˛á¤áá¤áľ áá)
curl -i -X PUT "http://{host}:{port}/webhdfs/v1/{path-to-file-on-hdfs}?op=CREATE
áĽáá°áá á áááľ ááá˝ áá°ááľááłá (áĽáá {áŚáł} áááá áááá¨áľ áľáŤ áá ááá áŤáá áľ áŠá áá¤á áá)áĄ-
HTTP/1.1 307 TEMPORARY_REDIRECT
Location: {location}
Content-Length: 0
ᨠSpark executable áááá áá° á¤á˝á˛á¤áá¤áľ áŤá (áĽáá {áąáŤ-áá°-á áŤáŁá˘-ááá} á áá áŁáá á áľá°ááá áá áá° áľááá ááťá ááá á¨áááľá°á ááááľ áá)á˘
curl -i -X PUT -T {path-to-local-file} "{location}"
á¨áá á ááᣠáá° á¤á˝á˛á¤áá¤áľ á¨á°á°áááá á¨áľááá ááá á áá áá spark-submit ááľá¨á áĽáá˝ááá (áĽáá áá {class-name} á°ááŁáŠá ááá ááá áááá áŤáá áľ á¨ááá áľá áá)á˘
/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}
á¤á˝á˛á¤áá¤áľá áááááľ áĽá áľáŤá ááľáŤáąá ááá¨ááἠDockerfile áĽá á¨ááá˘áŤ ááĽáĽ.sh áľááŞááľ ááá¨á ááááĽá áĽáá°áá˝á áἠááŁá á¨áááŁá - áĽáá á¤á°-ááťáááľá áá° /opt/spark/jars áá፠ááá áłáľ á Dockerfile áá áááŞáŤ áá¨áአáĽá á¨á¤á˝á˛á¤áá¤áľ ááááŞáŤ áááá á SPARK_CLASSPATH ááá˘áŤ ááĽáĽ ááľáĽ áŤáŤáľáąá˘ sh.
ááá°á á¨á á ááá ááłá - Apache Livy
á á°á¨ááŞá á ááľ á°ááŁá á˛ááá áĽá áá¤áąá ááá¨á á˛áŤáľááá, áĽáá° CI/CD áá°áľ á áŤá áá ááľááá áĽá á¨á ááááá áááł áá¨áłá°á áĽáŤáá áááłá. áĽááἠááᣠá á áŤáŁá˘áŤá áľááá-ááľá¨á¨á˘áŤ áĽáŞ á ááŤáááľ áááľ áá˝ááᣠááá áá áá á¨CI/CD áá á¨á° áááľá áŤááłáľá áá ááááŤáąá á CI á áááá ááŞáá˝/áŻáŽá˝ áá áľáááá ááŤá áĽá áááá áĽá ᨠKubernetes á¤áá á ááłá¨áťá áááá á áľáááááᢠááá á ááŁáᣠá¨áłááá áľáá ፠Apache Livyá áĽáá° REST API ááá áá á Kubernetes áááľá°á ááľáĽ á¨ááľá°áááąáľá á¨áľááá á°ááŁáŤáľá ááá§áᢠá áĽáą áĽáá á¨CURL áĽáŤááá˝á á áá áá ᨠSpark á°ááŁáŽá˝á á Kubernetes áááľá°á áá áááľ áá˝ááᣠáá á á ááááá á¨á˛á áᤠáááľá áá á áááľá¨áľ á ááá áá°áá áŤáᣠáĽá á Kubernetes áááľá°á ááľáĽ áŤáá áá°áŁ á¨Kubernetes API áá á ááááá áľ áá á¨áá¨áá፠ááłáá áááłáá˘
áĽáá° ááá°á á¨á á ááá ááłá áĽááľááá - Spark á°ááŁáŽá˝á áĽáá° á¨CI/á˛á˛ áá°áľ á áŤá á Kubernetes áááľá°á á áá¨áŤ áá ááá˘
áľá Apache Livy áľáá˝ - áĽáá° á¤á˝á˛á˛á á áááá áá áá°áŤá á¨áľá á áááá˝ áĽá á áľááá á¨áááľá áááŞáŤáá˝ á ááá á áááľ áľááá á áľááŁá áááľááá á¨ááŤáľá˝á RESTful APIᢠá á°áááś áĽáá° á¤á˝á˛á áľáááľ á áŤá á°ááłáᣠááá áá áá° OKD ááá áá° áá á¨áŠá áááľáľ ááŤá áá°ááŤáľá ááťáá á°áá˘áá á áá¸áŁáŤá áĽá á¨áśá¨á ááľáá˝ áľáĽáľáĽáŁ áĽáá°áá
áá -
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"]
á¨ááá¨á ááľá ááááŁáľ áĽá áá° ááŁá á¨áśá¨á áá¨ááťá áá°áá áá˝ááᣠáááłá áĽáá° ááľáŁá á¨áŚáŹá˛ áá¨ááťá˘ áĽáąá ááá°ááŤáľáŁ á¨áá¨á°ááá á áá¸áŁáŤá á°á áá ({registry-url} - á¨áśá¨á ááľá áááἠá¤áľ áŠá áá¤áᣠ{image-name} - Docker image nameᣠ{tag} - Docker image tagᣠ{livy-url} - á¨á°ááááá URL á áááአá᪠á°á°áŤá˝ ááááᣠá¨"Route" ááááŤá áĽá á áá á¨áááá Red Hat OpenShift áĽáá° Kubernetes áľáááľ áĽá á áá á¨áá ááᣠáá áŤááá áá 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
áĽáąá á°ááŁáŤá áŤá°á¨á á áá áĽá ááąá á á°áłáŤ áááł áŤáľáááŠáľ á áá á¨á᪠ááŤáá á áááá˝ á http://{livy-url}/ui áá ááááᢠá¨Livy ááᣠá¨REST áĽáŤáá áááłá á¨ááľáł á°áá á áá áá á¨áľááá á°ááŁáŤá˝áá áá°á áĽáá˝áááᢠá¨áĽáŤááá˝ áľáĽáľáĽ ááłá á¨áá á áłá˝ ááá§á (áá°ááá¨á á°ááŁá á áľááá á¨áá á°ááááŽá˝ áá á¨áááá áááá á âargsâ áľááľá ááľáĽ áá°ááá áá˝áá)
{
"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ᢠá á°ááłáłá áá á ááľ ááá-áá á Livy á áááá˝ (http://{livy-url}/ui) ááľáĽ ááłáŤá, á áá ááľáĽ, Livy API ááá graphical interface á áá áá, á¨á°ááŁáŠá áá°áľ áá¨áłá°á áĽá ááá áááá ááĽááľ áá˝áá. ááááŚá˝.
á áá á᪠áĽáá´áľ áĽáá°áá°áŤ áĽááłáᢠáá áá áááľá¨á á ááľ ááľáĽ áŤááá á¨á᪠ááŤáŁ áááἠááľáłááťáá˝ á¨á᪠á áááá áá áĽááááá - https://{OKD-WEBUI-URL}/console/project/{project}/browse/pods/{livy-pod-name }?tab=áááἠááľáłááťáá˝á˘ á¨ááą áĽáá°ááá¨áłá ᨠLivy REST API á áŽáá´ááá ááľáĽ âááŞâ á°áĽá á áá áŤá ááᣠá¨áá á¨á°á áááá áľ áá á°ááłáłá á¨áá áľááá-ááľá¨á¨á˘áŤ ááá¸áá (áĽáá áá {livy-pod-name} á¨á°áá á¨á ááľ áľá ááᢠá¨á᪠á áááá áá)ᢠáľáĽáľáĄ á¨á᪠á ááááá á áá áá áľááá ááťáá á áááľ á¨ááŤáľá°áááą áľáŤáá˝á áĽáá˛áŤá¨ááá á¨ááŤáľá˝áááľá ááá°á áá áá áŤáľá°ááááá˘
áŚáľá°áá á¨á á ááá ááłá - áľááá áŚááŹá°á
á áá á°ááŁáŠ á°ááľáá, á áá°á áááľ á¨áááľ áĽáŤá áááłá. á Kubernetes áááľá°á ááľáĽ áľáŤáá˝á á áá°á áááľ áááľáŹáľ á¤á°á áááᾠᨠCronJob á áŤá áá áĽá áĽáąá áá áá áá˝áá ᣠáá á á áá áá á Kubernetes ááľáĽ áŚááŹá°áŽá˝á áááľá°áłá°á áŚááŹá°áŽá˝á áá áá á áŁá áłáá áá áĽá ááľááá á áľááá á¨á á°á áŚááŹá°á á á ᣠáĽáąá áĽáá˛á ááᢠá áľáá áľ á°á¨á áááľááá˝ (áááłá Lightbend FastData Platform) áĽá á áá ááááᢠáĽáá˛á ááá áľ áĽááááŤáá - á¨á áá á¨á°á¨ááá á¨áľááá áľáŞáľ (2.4.5) á Kubernetes ááľáĽ Spark á°ááŁáŤáľá áááľáŹáľ á¨á°áá°á á¨áá á á ááŤáŽá˝ á áᾠᣠá¨áááĽáá áá áľáŞáľ (3.0.0) á Kubernetes áá áľáá áá°áŁá ᣠáá á¨áááá á áľ áá á ááłáá á . áľááá áŚááŹá°á ááá ááľááľ á áľááá á¨áá á¨áááá á ááŤáŽá˝á á áá¨á (áááłá ConfigMap with Hadoop access áá á áá° Spark pods ááŤá) áĽá á áá°á áááľ á¨á°áŤáááľá á°ááŁá ááŤáŤáľ áá˝ááá˘
áĽáá° áśáľá°á á¨á á ááá ááłá áĽááľáá
- áľááá áľáŤáá˝á á Kubernetes áááľá°á áá á áá°á áááľ á ááá¨áľ áá°áľ ááľáĽ ááľáŹáľá˘
áľááá áŚááŹá°á áááľ ááá áĽá á Google ááááľ áááľááá ááľáĽ á¨á°ááᣠáá -
- áĽáá° Lightbend FastData Platform/Cloudflow ááŤá á áŤá;
- Helmá áá áááĄ-
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 á¤áá á áľáŞáľ v1beta1 áŤáá áŚááŹá°áá áŤáŤáľáłáᢠá¨áá
á áááľ á°á¨á áĽá
á áá á¨áá á¨áľááá á áááŹá˝á á áá¸áŁáŤá ááááŤáá˝ á ááľ ááľáĽ á¨áááŁá á¤áá á áľáŞáľ áá á ááłá áááŤáá˝ áá á¨á°áá°á¨áą ááá á ááŁá¸á áááłá "v1beta1-0.9.0-2.4.0"ᢠá¨áŚááŹá°áŠ áĽáŞáľ á âáľáŞáśá˝â áááá -áááľ ááľáĽ á áŚááŹá°áŠ ááľáĽ á á°áŤá°á°á ᨠCRD ááá፠ááľáĽ áááá-
oc get crd sparkapplications.sparkoperator.k8s.io -o yaml
áŚááŹá°áŠ á áľááá á¨á°áŤá á¨áľááá áŚááŹá°á áá áá á¨áá ááľ á áááá°á ááŽáááľ ááľáĽ ááłáŤá (áááłá áŁCloudflow-fdp-sparkoperator in the Cloudflow space for Cloudflow installation) áĽá âáľááááááŹá˝ááľâ á¨ááŁá á°ááá á¨áŠá áááľáľ á¨áá¨á ááá áááŁáᢠ. á¨ááááľá á¨áľááá á áááŹá˝áá˝ á áá¨á°áá áľááá áá°áľ áá˝ááá˘
oc get sparkapplications -n {project}
áľááá áŚááŹá°áá á áá áá áľáŤáá˝á áááľáŤáľ 3 áááŽá˝á ááľá¨á áŤáľáááááłááĄ-
- áááá á áľááá á¤á°-ááťáááľáŁ áĽáá˛áá áááá áĽá áá°áá አá¨áá˝á áááá˝á á¨ááŤáŤáľáľ á¨áśá¨á ááľá ááá áŠá˘ á áááá ááľá, áá á CI / CD á°á¨á áá á¨á°áá ᨠáĽá á áá¨áŤ áááľá°á áá á¨á°áá¨á¨ ááľá áá;
- á¨áśá¨á ááľá á¨áŠá áááľáľ áááľá°á á°á°áŤá˝ ááłáá áááἠá¤áľ áá°á;
- á "SparkApplication" á áááľ áĽá á¨áááá¨áá á°ááŁá ááá፠á¨áŤá á áá¸áŁáŤá áááá¨áľá˘ á¨ááłá ááááŤáá˝ á áááá áá¨ááť ááľáĽ áááá (áááłááĄ.
github.com/GoogleCloudPlatform/spark-on-k8s-operator/blob/v1beta1-0.9.0-2.4.0/examples/spark-pi.yaml ). áľá ááááľáśá áἠááŁá á¨áááŁá á áľááá ááĽáŚá˝ á á-- ᨠ"apiVersion" áááá -áááľ á¨áŚááŹá°á áľáŞáľ áá á¨áááá°áá á¨á¤áá á áľáŞáľ áááá¨áľ á áá áľ;
- ᨠ"metadata.namespace" áááá áááľ á áááŹá˝á á¨ááááá áľá á¨áľá áŚáł áá áá á áá áľá¤
- ᨠ"spec.image" áááá áááľ á á°á°áŤá˝ áááἠááľáĽ á¨á°áá á¨áá á¨áśá¨á ááľá á áľáŤáť ááŤá á áá áľ;
- á¨"spec.mainClass" áááá áááľ áá°áą á˛ááá ááŤááľ áŤáá áľ á¨áľááá á°ááŁá ááá ááŤá á áá áľá¤
- á¨"spec.mainApplicationFile" áááá áááľ áá° á°ááťáá á¨áá ááá á¨áááľá°áá ááááľ ááŤá á áá áľ.
- á¨"spec.sparkVersion" áááá áááľ áĽá á áá á¨ááááá á¨áľááá áľáŞáľ áá áá á áá áľá¤
- ᨠ"spec.driver.serviceAccount" áááá áááľ á áááŹá˝áá áááľáŹáľ á¨ááŤáááááá á¨á áááááąá áá፠á á°ááá á¨áŠá áááľáľ áľá áŚáł áááá˝ á áá áľá¤
- ᨠ"spec.executor" áááá -áááľ ááá°áá áŞáŤá á¨á°áá°áĄáľá ááĽáśá˝ ááĽá áááá¨áľ á áá áľ;
- á¨"spec.volumeMounts" áááá áááľ á¨á áŤáŁá˘áŤá á¨áľááá á°ááŁá áááá˝ á¨ááá áŠá áľá á¨á áŤáŁá˘ áá፠áááá˝ á áá áľá˘
á áá¸áŁáŤá á¨áááá¨áľ ááłá (áĽáá {spark-service-account} á 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 (á áľááá á¨áá) áá ááľá°ááĽá áááá á á áľááááá á¨ááłá¨áť ááĽáśá˝á á¨ááŤááᥠá áľááá á¨áá áá°áŞáŤáá˝á ááá á á ááĽááľá˘ á áĽá áááł, á áááŹá˝á ááľáľá áááá á ááĽáśá˝á ááááá. á áľááááá áá áľáľáľá áĽááá ááĄ-
oc adm policy add-role-to-user edit system:serviceaccount:{project}:{spark-service-account} -n {project}
á á°á¨ááŞá áá á áá¸áŁáŤá áááá á¨"hadoopConfigMap" áááŞáŤá ááŤáŤáľáľ áĽáá°áá˝á áἠááŁá á¨áááŁá á˛áá áá á ááááŞáŤ á¨áááá°áá ááá á Docker ááľá áá áłáŤáľááᥠConfigMapá á¨ááąá áá á¨áľ áá áĽáá˛áááš áŤáľá˝áááłáᢠáĽáá˛áá á áá°á áááľ áľáŤáá˝á áááľáŤáľ á°áľáá áá - ᨠ"áááááĽá" áááŞáŤá á áá áá, á¨á°á°á áá á°ááŁá áááŤááľ ááá ááĽá áááá˝ áá˝áá.
á¨á፠á áá á¨áá ááá፠áá° spark-pi.yaml ááá áĽááľááá ááá áĽá áá° áŠá áááľáľ áááľá°á áĽáá°ááĽá¨ááĄ
oc apply -f spark-pi.yaml
áá âáľááááááŹá˝áâ á áááľ ááá áááĽáŤááĄ-
oc get sparkapplications -n {project}
> NAME AGE
> spark-pi 22h
á áá áááł, á áááŹá˝á áŤáá ááľ ááá áŤá, áááłá ââá á°áá á¨á "áľáááááááŹá˝á" ááľáĽ ááłáŤá. á áá¨á°áá áľááá áááá¨áąáľ áá˝áá:
oc get sparkapplications spark-pi -o yaml -n {project}
áľáŤá á¨á°á ááá á áá, POD áá° "á¨á°á ááá" áááł ááááłááłá, áĽáąá á "áľááááááľ" ááľáĽá ááááá. á¨áá°áá áŞáŤ áááἠááľáłááťáá˝ á á áłáš ááľáĽ ááłáŠ ááá á áá¨á°áá áľááá ááłáŠ áá˝áá (áĽáá {sparkapplications-pod-name} á¨áŠáŤ á°ááŁá áľá áá)
oc logs {sparkapplications-pod-name} -n {project}
á¨áľááá á°ááŁáŤáľá áአᨠsparkctl á áááááľá á áá áá ááľá°áłá°á ááťááᢠáĽáąá áááŤá áá¨ááťáá á¨ááአáŽáľ áá ááá ᣠGo á ááŤá áĽá áá áá áááá፠ááááĄáĄ
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}
ááľááá á°ááŁá ááá፠áĽááá ááĄ-
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}
á¨á°ááᨠáľááá á°ááŁá á¨ááľá°áśá˝á áááá áĽááááááĄ-
sparkctl event spark-pi -n {project} -f
ᨠSpark á°ááŁáá áááł áĽááááááĄ-
sparkctl status spark-pi -n {project}
ááá ááá ᣠá áá áŤááá á¨á°á¨áá á¨áľááá áľáŞáľ (2.4.5) á áŠá áááľáľ á¨áá áá á¨á°áá ááłáśá˝á áááľ ááľáĽ ááľááŁáľ áĽáááááá˘
- á¨ááááŞáŤá áĽá ááááŁáľá ááá ááłáą á¨ááἠá á¨áŁá˘ á áááá áá. á¨YARN áľáááśá˝ áá á˘ááŠáľá áĽáąá ááá ááá áĽá ááĽá áá˝ áá áŠáľ áááłá áŽáľ áá° áá¨á á¨ááľá¨áľ ááá (á¨áá¨á áá° áŽáľ)ᢠááĽáą ááľáá áááŁáá á áľááśáš ááľáĽ á¨á°áŤá°áąáľ áá¨ááá˝ á ááááŁá¸á ááśá˝ áá á¨áľááá á°ááŁáŤáľ á°áá˝ááá, áĽá á á ááłá¨ áá¨áĄ áá áá¨áá áááľá¨áľ á¨áááľá°á áá á áĽá á áááˇá. Kubernetes áľáá áá á á ááłá¨ áá¨áĄ ááľáĽ á á ááľ á°ááŁá ááľáĽ á¨á°áłá°á áááĽá á¨ááááłááľ á áľáááááľ á ááĽáááᢠá á áá á áŤáá¸áᣠá¨á°ááŁá ááľáá¸á፠áá á á¨áá°á áááł áá¨áá áá˝ááᣠáĽá ááááŤá áá¨ááťá¸á ááľááá á°ááŁá á ááŁááá˝ á¨á°áá°á á á áá á áŤáá á¨á˛áľá áŚáł áááááᢠáá áá ááłáąá á áŠá áááľáľ (áááłá Alluxio) ááľáĽ áŤááá á¨ááἠá áŤáŁá˘ á¨ááŤá¨ááἠáአáśááľááŽá˝á á áá áá ááááľ áá˝áá ááá áá áá áááľ á Kubernetes áááľá°á á áááá˝ áá á¨á°áá á¨ááἠá á áá¨áá¸áľ á áľááá áá áááľ áá á˘
- ááá°áá á áá ááłáľ á°á áááľ áá. á ááŁáŞááľ á¨áľááá á°ááŁáŤáľá áááľá á á°ááá¨á° á¨á°á áááľ áá á¨á°ááá áŁá áŞáŤáľ á°á°áááááᣠá¨á¨áá¤áŽáľ á á ááá á ááá á°ááśá˝ ááľáĽ á áá°áŤá°á°á (ááá áĽááłá á°ááłá á ááŤáŽá˝ á áľáŞáľ 3.0.0 ááľáĽ á˘ááĄá á°á¨á᪠áľáŤ á¨áááá) áĽá á¨á°á áááľ á°ááśá˝ á áľáááá á áá áá (https://spark.apache.org/docs/2.4.5/security.html) YARNᣠMesos áĽá Standalone Cluster áĽáť áĽáá° ááá áá°áĽáŽá˝ ááłáŤáᢠá á°ááłáłá áá áľááá á°ááŁáŤáľ á¨áááŠá áľ á°á áá á ááĽáł áááá˝ á áá˝áá - á¨áá°áŤá áľá á¨á áááááľ áá፠áĽáť áĽáááááá áĽá á°á ááá á á°ááአá¨á°á áááľ ááá˛áá˝ áá°á¨áľ ááá¨áŁáᢠá áá á¨ááľ áľáá á°á ááá áĽá á áá ááááᣠáááłá á áá á áŤáŁá˘ áá á°á áááą áŤáá°á á áᣠááá á áááá° áŠá áᲠáŤáá á°á ááᣠáá á á¨ááἠá¨ááłá¨áť ááĽáśá˝á á˛áŤá°áŤá á¨áááá˝ áá (áá PodSecurityPolicies á ááá á áĽá áĽááąá á áááááľ áááł áá˝áá) á°ááá á¨á áááááľ áááŤáá˝). á á áá áá áááľáá áááá á áľááá áááá˝ á ááĽáł áá° áśá¨á ááľá ááľááἠááá á áľáá áľá ááľáĽ á¨á°áá ááľá ááľá˘áŽá˝ ááá¨áá¸áľ áĽá ááááŁáľ áá´á ááá áá á¨áľááá ááľáááŞáŤ áľááŞááľá ááťáťá ááá˘
- Kubernetes á á áá áá á¨áľááá áľáŤáá˝á ááľáŹáľ á áá á ááá á áá¨áŤ áááł áá áá áĽá ááá°ááą áĽá á áá á ááá á ááśá˝ áá ááá áááŚá˝ ááአáá˝áá (á¨áááá áááὠᣠá¨áśá¨á á¤á ááľáá˝ áĽá á¨ááľáááŞáŤ áľááŞááśá˝)ᢠáĽá á áĽáááĽ, ááłááąá á˛áŤááá, áľáŞáśá˝ 2.3.0 áĽá 2.4.5 á°ááľááá, áŁá áŞá á áŁá á¨á°áᨠáá á.
áááááá˝ áĽáá áĽá - á á˛áľ ᨠSpark (3.0.0) áĽáľá á á áᥠá°áááᣠáá á á áľááá á áŠá áááľáľ áľáŤ áá á¨áá°á áááŚá˝á á ááĽáˇáᣠááá áá ááá á¨ááĽá¨áľ á áľá°áłáłáŞ á¨áľáá á¨áá¨áŤ á°á¨áá áá áááˇáᢠááááŁáľ á¨áááĽááľ ááááὠᨠYARN á áá°á áĽá á¨Spark á°ááŁáŤáľá á Kubernetes áá áŤá ááááľ ááľáááľá á°á áááľ áłááአáĽá á¨á°ááŁá áááá˝á á áŤáľ áá°áŤá¨áľ áłáŤáľááá áá á áá áááá¨á áŤáľá˝ááá˘
ááĽááŤ
ááá: hab.com