แซแแแ แคแแกแ แแแแแฎแแแแแแ, แจแฃแแแฆแ แแจแแแแแแแกแ. แแฆแแก แฉแแแ แชแแขแแก แแแกแแฃแแ แแแ Apache Spark-แแ แแ แแแกแ แแแแแแแแ แแแแก แแแ แกแแแฅแขแแแแแแ.
Big Data-แแก แแแแแแแแ แแแ แกแแแงแแ แแจแ Apache Spark แแ แแก แแ แคแแฅแขแ แกแขแแแแแ แขแ แแแแแชแแแแ แแแ แขแแฃแแ แแแแฃแจแแแแแแก แแแแชแแแแแแก แจแแแฃแจแแแแแแกแแแแก. แแแ แแ แแแแกแ, แแแ แแกแแแ แแแแแแงแแแแแ แแแแแแแก แแแแแแแชแแแแแก แจแแกแแฅแแแแแแ, แ แแแแแแแช แแฃแจแแแแแ แแแแ แ แแแ แขแแฃแแ แแแแชแแคแชแแแ, แแแฃแจแแแแแแ แแ แแแแแแแแแ แแแแแชแแแแแก แแชแแ แ แแแฌแแแแแจแ (Spark Structured Streaming). แแ แขแ แแแแชแแฃแแแ แแก แแงแ แกแแแ แแ Hadoop แกแขแแแแก แแแฌแแแ, แแงแแแแแแ YARN-แก (แแ แแแแแแ แ แจแแแแฎแแแแแจแ Apache Mesos-แก), แ แแแแ แช แ แแกแฃแ แกแแแแก แแแแแฏแแ แก. 2020 แฌแแแกแแแแก แแแกแ แขแ แแแแชแแฃแแ แคแแ แแแ แแแแแงแแแแแ แแแแฎแแแก แแแจแแแก แฅแแแจ แแแแก แแแแแแแแแแแก แฃแแแขแแกแแแแกแแแแก Hadoop-แแก แฌแแกแแแ แ แแแกแขแ แแแฃแชแแแก แแ แแ แกแแแแแแก แแแแ - HDP แแ CDH แแแแแแแแ แแแ แจแแฉแแ แแแฃแแแ, CDH แแ แแ แแก แแแ แแแ แแแแแแแแ แแแฃแแ แแ แแฅแแก แแแฆแแแ แฆแแ แแแฃแแแแ, แฎแแแ Hadoop-แแก แแแแแ แฉแแ แแแแฌแแแแแแแแก แแฅแแ. แแ แจแแฌแงแแแขแ แแ แกแแแแแ แแ แแฃแแแแแแแ แแแแแแแแ แแฅแแก. แแแแขแแ, Kubernetes-แแก แแแแแงแแแแแแ Apache Spark-แแก แแแจแแแแ แแแแ แ แแแขแแ แแกแก แแฌแแแแก แกแแแแแแแแแแแกแ แแ แแกแฎแแแ แแแแแแแแแแจแ - แฎแแแแ แกแขแแแแแ แขแ แแแแขแแแแแ แแแแก แแ แแแกแขแ แแ แแแแกแ แแ แ แแกแฃแ แกแแแแก แแแแแฏแแแแขแจแ แแแ แซแ แแ แกแแฏแแ แ แฆแ แฃแแแแแจแ, แแก แแแแแ แแแก แแ แแแแแแแก Spark แแแแชแแแแแแก แแ แแกแแกแแแแแแแ แ แแกแฃแ แกแแแแก แแแแแแแแแกแแก YARN-แแ แแ แฃแแ แฃแแแแแงแแคแก. แกแขแแแแแฃแ แแ แแแแแแแแ แแแแแ แแแแขแคแแ แแ แแ แแแแแ แแแแแ แชแแฃแแ แแ แฆแแ แแแกแขแ แแแฃแชแแแ แงแแแแ แแแแแกแ แแ แแแแแก แแแแแแแแแแแกแแแแก. แแแ แแ แแแแกแ, แแแแฃแแแ แแแแก แแแแแแแแแแ, แฃแแแขแแกแแแแ แฃแแแ แแแแฎแแ แฎแ แ แแแแแแแแ แกแแแฃแแแ แ แแแกแขแแแแชแแแก แจแแซแแแ แแ แแแแแ แแ แแแแ แแแแแชแแแแแแ แแแก แแแแแงแแแแแแจแ, แ แแช แแแแ แขแแแแแก แแแแแฏแก.
2.3.0 แแแ แกแแแ แแแฌแงแแแฃแแ, Apache Spark-แแ แแแแฆแ แแคแแชแแแแฃแ แ แแฎแแ แแแญแแ แ Kubernetes แแแแกแขแแ แจแ แแแแชแแแแแแก แจแแกแ แฃแแแแแกแแแแก แแ แแฆแแก แฉแแแ แแแกแแฃแแ แแแ แแ แแแแแแแแก แแแแแแแแแแ แกแแแฌแแคแแแ, แแแกแ แแแแแงแแแแแแก แกแฎแแแแแกแฎแแ แแแ แแแแขแแแแ แแ แฎแแ แแแแแแแ, แ แแแแแแแช แจแแแแฎแแแแแ แแแแฎแแ แชแแแแแแแก แแ แแก.
แฃแแแ แแแแแก แงแแแแแกแ, แแแแแ แจแแแฎแแแแ Apache Spark-แแ แแแคแฃแซแแแแฃแแ แแแแชแแแแแแกแ แแ แแแแแแแชแแแแแก แจแแแฃแจแแแแแแก แแ แแชแแกแก แแ แแแแแแงแแ แขแแแแฃแ แ แจแแแแฎแแแแแแ, แ แแแแกแแช แกแแญแแ แแ แแแแแแแแแก แจแแกแ แฃแแแแ Kubernetes แแแแกแขแแ แแ. แแ แแแกแขแแก แแแแแแแแแแกแแก, OpenShift แแแแแแงแแแแแ แ แแแแ แช แแแกแขแ แแแฃแชแแ แแ แแแชแแแฃแแ แแฅแแแแ แแ แซแแแแแแแ, แ แแแแแแแช แจแแแกแแแแแแแ แแแก แแ แซแแแแแแก แฎแแแก (oc). Kubernetes-แแก แกแฎแแ แแแกแขแ แแแฃแชแแแแแกแแแแก แจแแแซแแแแ แแแแแงแแแแแฃแ แแฅแแแก แจแแกแแแแแแกแ แแ แซแแแแแแแ Kubernetes-แแก แกแขแแแแแ แขแฃแแ แแ แซแแแแแแก แฎแแแแแแ (kubectl) แแ แแแแ แแแแแแแแแ (แแแแแแแแแ, oc adm แแแแแขแแแแกแแแแก).
แแแ แแแแ แแแแแงแแแแแแก แจแแแแฎแแแแ - spark-submit
แแแแชแแแแแแกแ แแ แแแแแแแชแแแแแก แจแแแฃแจแแแแแแกแแก, แแแแแแแแแ แแ แฃแแแ แจแแแกแ แฃแแแก แแแแชแแแแแ แแแแแชแแแแ แขแ แแแกแคแแ แแแชแแแก แแแแแ แแแแก แแแแแแ. แแแแ แแฃแแแ, แแแแแ แแแแก แแแแแงแแแแแ แจแแกแแซแแแแแแแ แแ แแแแแแแแกแแแแแก, แแแแ แแ แกแแแแแแ แกแแกแขแแแแแแก แ แแแแฃแ แ (แแฃแแชแ แกแแขแแกแขแ) แแแกแขแแแชแแแแแก แแแแแฌแแแแแแแ แแแแฃแจแแแแแ แฃแคแ แ แกแฌแ แแคแ แแ แฃแแแแแกแ แแฆแแแฉแแแ แแ แแแแกแจแ. แแ แจแแแแฎแแแแแจแ, แ แแแแกแแช แฉแแแ แแแกแฌแแ แแแ แกแแแแแแ แกแแกแขแแแแแแก แ แแแแฃแ แแแแแแแแแแก, แจแแกแแซแแแแแแแ แแ แ แกแชแแแแ แ:
- แแแแแแแแแ แ แแฌแแ แแแแแก Spark แแแแชแแแแก แแแแแแแแ แแแแ แแแแแฃแแแแแแแ แ แแแแแจแ;
- แแแแแแแแแ แ แแฌแแ แแแแแก Spark แแแแชแแแแก Kubernetes แแแแกแขแแ แแ แกแแขแแกแขแ แชแแแแจแ.
แแแ แแแ แแแ แแแแขแก แแฅแแก แแ แกแแแแแแก แฃแคแแแแ, แแแแ แแ แจแแแชแแแก แฃแแแ แแ แแแแฃแกแก:
- แแแแแแฃแ แแแแแแแแแ แก แฃแแแ แฐแฅแแแแแก แฌแแแแแ แกแแแฃแจแแ แแแแแแแแแ แกแแแแแแ แกแแกแขแแแแแแก แงแแแแ แแแกแขแแแชแแแแ, แ แแแแแแช แแแก แกแญแแ แแแแ;
- แจแแแฃแจแแแแแฃแแ แแแแแแแแแก แจแแกแแกแ แฃแแแแแแ แกแแแฃแจแแ แแแแฅแแแแแ แกแแญแแ แแ แกแแแแแ แแกแ แ แแกแฃแ แกแ.
แแแแ แ แแแ แแแแขแก แแ แแฅแแก แแก แแแแแแแแแแแแแ, แ แแแแแ แแฃแแแ แแแขแแก แแแแกแขแแ แแก แแแแแงแแแแแ แกแแจแฃแแแแแแก แแแซแแแแ แแแแแงแแ แกแแญแแ แ แ แแกแฃแ แกแแแแก แคแแแแ แแแแชแแแแแแก แจแแกแแกแ แฃแแแแแแ แแ แแแแฌแแแแ แแแก แกแแญแแ แ แฌแแแแแ แกแแกแขแแแแก แแแแ แแแกแขแแแชแแแแแ, แแแฅแแแแแ แฃแแ แฃแแแแแงแแ แแแกแแ แฌแแแแแ Kubernetes-แแก แ แแแฃแ แ แแแแแแแก แแแแแงแแแแแแ. แแแแแแแแ แแแแก แแฃแแแแก แงแแแแ แฌแแแ แ. แแแแ แฎแแแแแกแแแ แแฆแแแแจแแแ แแก, แ แแแแ แช แแแแแงแแแแแแก แแแ แแแแ แจแแแแฎแแแแ - Spark แแแแชแแแแแแก แแแจแแแแ แแแแแแแแ แแแ แแแแแแแแแ แฃแแ แแแแฅแแแแแแ Kubernetes แแแแกแขแแ แแ แกแแขแแกแขแ แชแแแแจแ.
แแแแแ แแแกแแฃแแ แแ แฃแคแ แ แแแขแ 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
แกแ แฃแ แแฌแงแแแแก แแแแ แแ แ แกแญแแ แแแแ แแ แแแแแ แแก แกแฃแ แแแแแแก แจแแกแแฅแแแแแแ แแ แแฃแแแ แแแขแแก แแแแกแขแแ แแ แแแกแแจแแแแแ, แแฅแแแ แแแแแแแแแ แแญแแ แแแแแ แแฎแแแแ jar แคแแแแแแ "assembly/" แแแ แแฅแขแแ แแแแแ, แแกแ แ แแ แแฅแแแ แจแแแแซแแแแ แจแแฅแแแแ แแฎแแแแ แแก แฅแแแแ แแแฅแขแ:
./build/mvn -f ./assembly/pom.xml -Pkubernetes -DskipTests clean package
Kubernetes-แแ Spark-แแก แกแแแฃแจแแแแแแก แแแกแแจแแแแแ, แแฅแแแ แฃแแแ แจแแฅแแแแ Docker แกแฃแ แแแ, แ แแแแแแช แแแแแแงแแแแแ แ แแแแ แช แกแแแแแแกแ แกแฃแ แแแก. แแฅ แแ แแก 2 แจแแกแแซแแ แแแแแแแ:
- แแแแแ แแ แแแฃแแ Docker แแแแแกแแฎแฃแแแแ แแแแชแแแก แจแแกแ แฃแแแแแ Spark แแแแแแแแแก แแแแก;
- แจแแฅแแแแแ แกแฃแ แแแ แแแแชแแแก แแฎแแแแ Spark-แก แแ แแฃแชแแแแแแ แแแแแแแแแแฃแแแแแแก, แจแแกแ แฃแแแแแแ แแแแ แแแกแขแแแชแแฃแ แแ แแ แแก แแแแแแแกแแแฃแแ (แแแแแแแแแ, HDFS-แจแ).
แแแ แแแแ, แแแแแ แแแแจแแแแ Docker แกแฃแ แแแ, แ แแแแแแช แจแแแชแแแก Spark แแแแแแแแแก แกแแขแแกแขแ แแแแแแแแก. 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
แแแกแ แแแฎแแแ แแแแ แฉแแแ แแแแ แแแแแ Spark-แแก แซแแ แแแแ แกแฃแ แแแก, แ แแแแแแช แจแแแชแแแก แกแแขแแกแขแ แแแแแแแแแก Pi-แก แแแแแกแแแแแแแแ Spark-แแก แแแแแงแแแแแแ (แแฅ {docker-registry-url} แแ แแก แแฅแแแแ Docker แแแแแกแแฎแฃแแแแแก แ แแแกแขแ แแก URL, {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 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}
แแแแแ แแแแฃแจแแแ spark-submit แแ แซแแแแแ, แ แแ แแแแแแแฅแแแงแแแ Spark แแแแแแแแ OKD แแแแกแขแแ แจแ, แกแแแแช แแแแแแแแฃแแแ แจแแฅแแแแแ แกแแ แแแกแแก แแแแแ แแจแ แแ Docker แกแฃแ แแแ:
/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
ะะดะตัั:
โ แกแแฎแแแ - แแแแแแแแแก แแแกแแฎแแแแแ, แ แแแแแแช แแแแฆแแแก แแแแแฌแแแแแแแก Kubernetes pods-แแก แกแแฎแแแแก แคแแ แแแ แแแแจแ;
โclass โ แจแแกแ แฃแแแแแแ แคแแแแแก แแแแกแ, แ แแแแแแช แแแแแแซแแฎแแแ แแแแแแแแแก แแแฌแงแแแแกแแก;
โconf โ Spark-แแก แแแแคแแแฃแ แแชแแแก แแแ แแแแขแ แแแ;
spark.executor.instances โ แแแกแแจแแแแ Spark แจแแแกแ แฃแแแแแแแแก แ แแแแแแแแ;
spark.kubernetes.authenticate.driver.serviceAccountName - Kubernetes-แแก แกแแ แแแกแแก แแแแแ แแจแแก แกแแฎแแแ, แ แแแแแแช แแแแแแงแแแแแ แแแแแแแก แแแจแแแแแกแแก (แฃแกแแคแ แแฎแแแแแก แแแแขแแฅแกแขแแกแ แแ แจแแกแแซแแแแแแแแแแก แแแกแแแแแแแ Kubernetes API-แกแแแ แฃแ แแแแ แแแแแกแแก);
spark.kubernetes.namespace โ Kubernetes แกแแฎแแแแ แกแแแ แชแ, แ แแแแแจแแช แแแจแแแแฃแแ แแฅแแแแ แแ แแแแแ แแก แแ แจแแแกแ แฃแแแแแแ pods;
spark.submit.deployMode โ Spark-แแก แแแจแแแแแก แแแแแแ (แกแขแแแแแ แขแฃแแ spark-submit-แแกแแแแก แแแแแแงแแแแแ โแแแแกแขแแ แโ, Spark แแแแ แแขแแ แแกแแแแก แแ Spark โแแแแแแขแแกโ แจแแแแแแแ แแแ แกแแแแแกแแแแก);
spark.kubernetes.container.image - แแแแแ แแก แกแฃแ แแแ, แ แแแแแแช แแแแแแงแแแแแ แแแแแแแก แแแกแแจแแแแแ;
spark.master โ Kubernetes API URL (แแแ แแแแแ แแแแแแแแฃแแแ แแกแ, แ แแ แฌแแแแแ แฎแแแแ แแแแแแแแ แแแ แแแแ แแขแแแแ);
local:// แแ แแก แแแ Spark-แแก แจแแกแแกแ แฃแแแแแแ Docker แแแแแกแแฎแฃแแแแแก แจแแแแแ.
แแแแแแแแ แ แจแแกแแแแแแก OKD แแ แแแฅแขแแ แแ แแกแฌแแแแแแ แจแแฅแแแแ แแแแแแก - https://{OKD-WEBUI-URL}/console/project/{project}/browse/pods.
แแแแแแแแ แแแแก แแ แแชแแกแแก แแแกแแแแ แขแแแแแแแ แจแแแซแแแแ แแแแแงแแแแแฃแ แแฅแแแก แกแฎแแ แแแ แแแแขแ, แ แแแแแจแแช แแฅแแแแแ Spark-แแก แกแแแ แแ แกแแแแแแกแ แกแฃแ แแแ, แ แแแแแแช แแแแแแงแแแแแ แงแแแแ แแแแชแแแแก แแแกแแจแแแแแ, แฎแแแ แจแแกแ แฃแแแแแแ แคแแแแแแแก แกแแแแจแแขแแแ แแแแแฅแแแงแแแแแ แแแ แ แแแฎแกแแแ แแแแจแ (แแแแแแแแแ, Hadoop) แแ แแแแแแแแฃแแแ แแแ แแแแแกแแก. spark-submit แ แแแแ แช แแแแแ. แแ แจแแแแฎแแแแแจแ, แแฅแแแ แจแแแแซแแแแ แแแฃแจแแแ Spark แแแแชแแแแแแก แกแฎแแแแแกแฎแแ แแแ แกแแแแ Docker แกแฃแ แแแแแแก แแฆแแแแแแก แแแ แแจแ, แแแแแแแแแ, 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
แแฅแแแ แแแแฆแแแ แแกแแ แแแกแฃแฎแก (แแฅ {location} แแ แแก URL, แ แแแแแแช แฃแแแ แแฅแแแก แแแแแงแแแแแฃแแ แคแแแแแก แฉแแแแกแแขแแแ แแแ):
HTTP/1.1 307 TEMPORARY_REDIRECT
Location: {location}
Content-Length: 0
แฉแแขแแแ แแแ Spark แจแแกแ แฃแแแแแแ แคแแแแ HDFS-แจแ (แแฅ {path-to-local-file} แแ แแก แแแ Spark แจแแกแ แฃแแแแแแ แคแแแแแก แแแแแแแแ แ แฐแแกแขแแ):
curl -i -X PUT -T {path-to-local-file} "{location}"
แแแแก แจแแแแแ, แฉแแแ แจแแแแแซแแแ แแแแแแแแแ spark-submit HDFS-แจแ แแขแแแ แแฃแแ Spark แคแแแแแก แแแแแงแแแแแแ (แแฅ {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}
แฃแแแ แแฆแแแแจแแแก, แ แแ HDFS-แแ แฌแแแแแแกแแแแก แแ แแแแแแแแแก แแฃแจแแแแแก แฃแแ แฃแแแแแกแแงแแคแแ, แจแแแซแแแแ แแแแญแแ แแแ Dockerfile แแ entrypoint.sh แกแแ แแแขแแก แจแแชแแแ - แแแแแแขแแ แแแ แแฅแขแแแ Dockerfile-แจแ, แ แแ แแแแแแแแ แแ แแแแแแแแแแฃแแ แแแแแแแแแแแแ /opt/spark/jars แแแ แแฅแขแแ แแแจแ แแ แฉแแ แแแ HDFS แแแแคแแแฃแ แแชแแแก แคแแแแ SPARK_CLASSPATH-แจแ แจแแกแแกแแแแ แฌแแ แขแแแจแ.
แแแแ แ แแแแแงแแแแแแก แจแแแแฎแแแแ - Apache Livy
แแแ แแ แแแแกแ, แ แแแแกแแช แแแแชแแแ แจแแแฃแจแแแแแฃแแแ แแ แกแแญแแ แแ แจแแแแแแก แขแแกแขแแ แแแ, แฉแแแแแ แแแแฎแแ แแแกแ แแแจแแแแแก, แ แแแแ แช CI/CD แแ แแชแแกแแก แแแฌแแแแกแ แแ แแแกแ แจแแกแ แฃแแแแแก แกแขแแขแฃแกแแก แแแแแงแฃแ แแก แแแแแแแแก แจแแกแแฎแแ. แ แ แแฅแแ แฃแแแ, แจแแแแซแแแแ แแแกแ แแแจแแแแ แแแแแแแแ แแแ spark-submit แแแ แแก แแแแแงแแแแแแ, แแแแ แแ แแก แแ แแฃแแแแก CI/CD แแแคแ แแกแขแ แฃแฅแขแฃแ แแก, แ แแแแแ แแก แแแแแฎแแแก Spark-แแก แแแกแขแแแแชแแแก แแ แแแแคแแแฃแ แแชแแแก CI แกแแ แแแ แแก แแแแแขแแแแ/แแแแจแแแแแแแ แแ แฌแแแแแแก แแแงแแแแแแก Kubernetes API-แแ. แแ แจแแแแฎแแแแแกแแแแก, แกแแแแแแ แแแแแแแแแขแแชแแแ แแแ แฉแแ Apache Livy-แแก แแแแแงแแแแแ, แ แแแแ แช REST API, Spark แแแแชแแแแแแก แจแแกแแกแ แฃแแแแแแ, แ แแแแแแแช แแแแแแแกแแแฃแแแ Kubernetes แแแแกแขแแ แจแ. แแแกแ แแแฎแแแ แแแแ แจแแแแซแแแแ แแฌแแ แแแแ Spark แแแแชแแแแแ Kubernetes แแแแกแขแแ แแ แ แแแฃแแแ แฃแแ cURL แแแแฎแแแแแแแก แแแแแงแแแแแแ, แ แแแแแแช แแแแแแแ แแแแฎแแ แชแแแแแแแ แแแแแกแแแแ แ CI แแแแแฌแงแแแขแแก แกแแคแฃแซแแแแแ แแ แแแกแ แแแแแแแกแแแ Kubernetes แแแแกแขแแ แจแ แฌแงแแแขแก แแแขแแ แแแแชแแแก แกแแแแแฎแก Kubernetes API-แกแแแ แฃแ แแแแ แแแแแกแแก.
แแแแ แฎแแแแแกแแแ แแฆแแแแจแแแ, แ แแแแ แช แแแแ แ แแแแแงแแแแแแก แจแแแแฎแแแแ - Spark แแแแชแแแแแแก แแแจแแแแ, แ แแแแ แช CI/CD แแ แแชแแกแแก แแแฌแแแ Kubernetes แแแแกแขแแ แแ แขแแกแขแแก แชแแแแจแ.
แชแแขแ Apache Livy-แแก แจแแกแแฎแแ - แแก แแฃแจแแแแก แ แแแแ แช HTTP แกแแ แแแ แ, แ แแแแแแช แฃแแ แฃแแแแแงแแคแก แแแ แแแขแแ แคแแแกแก แแ RESTful API-แก, แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แแแกแขแแแชแแฃแ แแ แแแฃแจแแแ spark-submit แกแแญแแ แ แแแ แแแแขแ แแแแก แแแแแแก แแแแ. แขแ แแแแชแแฃแแแ, แแก แแแแแแแแแ แ แแแแ แช HDP แแแกแขแ แแแฃแชแแแก แแแฌแแแ, แแแแ แแ แแกแแแ แจแแแซแแแแ แแแแแแแกแแแก OKD-แแ แแ Kubernetes-แแก แแแแแกแแแแ แกแฎแแ แแแกแขแแแแชแแแแ แจแแกแแแแแแกแ แแแแแคแแกแขแแก แแ Docker แกแฃแ แแแแแแก แแแแ แแแแก แแแแแงแแแแแแ, แ แแแแ แแชแแ แแก -
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"]
แแแแแ แแ แแแฃแแ แกแฃแ แแแ แจแแแซแแแแ แแจแแแแแก แแ แแแขแแแ แแแก แแฅแแแแก แแ แกแแแฃแ Docker แกแแชแแแจแ, แ แแแแ แแชแแ แจแแแ OKD แกแแชแแแ. แแแก แแแแแกแแงแแแแแแแ แแแแแแงแแแแ แจแแแแแแ แแแแแคแแกแขแ ({registry-url} - Docker image แ แแแกแขแ แแก URL, {image-name} - Docker image name, {tag} - Docker image tag, {livy-url} - แกแแกแฃแ แแแแ URL, แกแแแแช แกแแ แแแ แแ แฎแแแแแกแแฌแแแแแ แแฅแแแแ Livy; โแแแ แจแ แฃแขแแกโ แแแแแคแแกแขแ แแแแแแงแแแแแ, แแฃ Red Hat OpenShift แแแแแแงแแแแแ Kubernetes แแแกแขแ แแแฃแชแแแ, แฌแแแแแฆแแแแ แจแแแแฎแแแแแจแ แแแแแงแแแแแฃแแ แแฅแแแแ แจแแกแแแแแแกแ Ingress แแ Service แแแแแคแแกแขแ 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
แแแกแ แแแแแงแแแแแแกแ แแ แแแแแก แฌแแ แแแขแแแแ แแแจแแแแแก แจแแแแแ, Livy แแ แแคแแแฃแแ แแแขแแ แคแแแกแ แฎแแแแแกแแฌแแแแแแ แแแฃแแแ: http://{livy-url}/ui. Livy-แแแ แแ แแแ แฉแแแ แจแแแแแซแแแ แแแแแแแฅแแแงแแแ แฉแแแแ Spark แแแแแแแแ 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-แแก แแ แแ แแคแแแฃแแ แแแขแแ แคแแแกแแก แแแแแงแแแแแแ, แจแแแแซแแแแ แแแแแงแฃแ แ แแแแแแแ แแแแแแแแแก แแ แแแ แแกแก แแ แจแแแกแฌแแแแแ แกแแกแแ. แแแ แแแ.
แแฎแแ แแแฉแแแแแ แ แแแแ แแฃแจแแแแก แแแแ. แแแแกแแแแแก, แแแแแ แจแแแแแแฌแแแ Livy แแแแขแแแแแ แแก แแฃแ แแแแแแ แแแแแก แจแแแแแ Livy แกแแ แแแ แแ - https://{OKD-WEBUI-URL}/console/project/{project}/browse/pods/{livy-pod-name }?tab= แแฃแ แแแแแแ. แแแแแแ แจแแแแแซแแแ แแแแแแแฎแแ, แ แแ Livy REST API-แก แแแแแซแแฎแแแแกแแก แแแแขแแแแแ แจแ แกแแฎแแแแ โlivyโ, แจแแกแ แฃแแแแฃแแแ spark-submit, แแกแแแแกแ, แ แแช แฉแแแ แแแแแ แแแแแแแงแแแแ (แแฅ {livy-pod-name} แแ แแก แจแแฅแแแแแ แแแแแก แกแแฎแแแ. Livy แกแแ แแแ แแแ). แแแแแฅแชแแ แแกแแแ แฌแแ แแแแแแแแแ แแแแ แ แแแแฎแแแแแก, แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แแแฃแจแแแ แแแแชแแแแแ, แ แแแแแแแช แแแกแขแแแชแแฃแ แแ แแแกแแแแซแแแแก Spark แจแแกแ แฃแแแแแแก Livy แกแแ แแแ แแก แแแแแงแแแแแแ.
แแแกแแแ แแแแแงแแแแแแก แจแแแแฎแแแแ - Spark Operator
แแฎแแ, แ แแแแกแแช แแแแแแแแ แจแแแแฌแแแแฃแแแ, แฉแแแแแ แแแกแ แ แแแฃแแแ แฃแแแ แแแจแแแแแก แกแแแแแฎแ. Kubernetes แแแแกแขแแ แจแ แแแแชแแแแแแก แ แแแฃแแแ แฃแแแ แแแจแแแแแก แแจแแแแแฃแ แ แแแ แแ แแก CronJob แแ แแแฃแแ แแ แจแแแแซแแแแ แแแแแแงแแแแ แแแ, แแแแ แแ แแ แแ แแแกแแแแก แแแแ แแขแแ แแแแก แแแแแงแแแแแ แแแแแแแชแแแแแก แแแ แแแแกแแแแก Kubernetes-แจแ แซแแแแแ แแแแฃแแแ แฃแแแ แแ Spark-แแกแแแแก แแ แแก แกแแแแแแ แแแแฌแแคแแแฃแแ แแแแ แแขแแ แ, แ แแแแแแช แแกแแแ แแ แแก แแแแแแงแแแแแ Enterprise-แแก แแแแแก แแแแแฌแงแแแขแแแแแแแจแ (แแแแแแแแแ, Lightbend FastData Platform). แฉแแแ แแแ แฉแแแ แแแก แแแแแงแแแแแแก - Spark-แแก แแแแแแแแแแ แกแขแแแแแฃแ แแแ แกแแแก (2.4.5) แแฅแแก แกแแแแแแ แจแแแฆแฃแแฃแแ แแแแคแแแฃแ แแชแแแก แแแ แแแแขแแแ Spark แแแแชแแแแแแก แจแแกแแกแ แฃแแแแแแ Kubernetes-แจแ, แฎแแแ แจแแแแแแ แซแแ แแแแแ แแแ แกแแ (3.0.0) แแชแฎแแแแแก แกแ แฃแ แแฎแแ แแแญแแ แแก Kubernetes-แแกแแแแก, แแแแ แแ แแแกแ แแแแแจแแแแแก แแแ แแฆแ แฃแชแแแแแ. . Spark Operator แแแแแฆแแฃแ แแแก แแ แฎแแ แแแแก แแแแจแแแแแแแแแ แแแแคแแแฃแ แแชแแแก แแแ แแแแขแแแแก แแแแแขแแแแ (แแแแแแแแแ, ConfigMap-แแก แแแแแแขแแแแแ Hadoop แฌแแแแแแก แแแแคแแแฃแ แแชแแแ Spark pods-แแ) แแ แ แแแฃแแแ แฃแแแ แแแแแแแแแ แแแแแแแแแก แจแแกแ แฃแแแแแก แจแแกแแซแแแแแแแแ.
แแแแแ แแแแแแงแแ แแก, แ แแแแ แช แแแกแแแ แแแแแงแแแแแแก แจแแแแฎแแแแ - แ แแแฃแแแ แฃแแแ แแแจแแแแฃแแ Spark แแแแชแแแแแ Kubernetes แแแแกแขแแ แแ แกแแฌแแ แแแ แชแแแแจแ.
Spark Operator แแ แแก แฆแแ แฌแงแแ แ แแ แแแแแแแแ แแแฃแแแ Google Cloud Platform-แจแ -
- แ แแแแ แช Lightbend FastData แแแแขแคแแ แแแก/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 แแแแแแแชแแแก แแแแแคแแกแขแแก แแฆแฌแแ แแแแแแแ แฃแแแ แแคแฃแซแแแแแแแก Git-แแก แแแแแแแแแแก API-แแก แจแแกแแแแแแกแ แแแ แกแแแ, แแแแแแแแแ, "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โ . แแฅแแแ แจแแแแซแแแแ แจแแแกแฌแแแแแ แฎแแแแแกแแฌแแแแแ Spark แแแแแแแชแแแแ แจแแแแแแ แแ แซแแแแแแ:
oc get sparkapplications -n {project}
Spark Operator-แแก แแแแแงแแแแแแ แแแแชแแแแแแก แจแแกแแกแ แฃแแแแแแ แกแแญแแ แแ 3 แ แแแแก แแแแแแแแ:
- แจแแฅแแแแแ แแแแแ แแก แกแฃแ แแแ, แ แแแแแแช แแแแชแแแก แงแแแแ แกแแญแแ แ แแแแแแแแแแแก, แแกแแแ แแแแคแแแฃแ แแชแแแก แแ แจแแกแ แฃแแแแแ แคแแแแแแก. แกแแแแแแ แกแฃแ แแแจแ แแก แแ แแก แกแฃแ แแแ, แ แแแแแแช แจแแฅแแแแแแ CI/CD แแขแแแแ แแ แขแแกแขแแ แแแฃแแแ แกแแขแแกแขแ แแแแกแขแแ แแ;
- Docker แกแฃแ แแแแก แแแแแฅแแแงแแแแ แ แแแกแขแ แจแ, แ แแแแแแช แฎแแแแแกแแฌแแแแแแ Kubernetes แแแแกแขแแ แแแแ;
- แจแแฅแแแแแ แแแแแคแแกแขแ โSparkApplicationโ แขแแแแกแ แแ แแแกแแจแแแแ แแแแชแแแแก แแฆแฌแแ แแแแแแ. แแแแแคแแกแขแแแแก แแแแแแแแแแ แฎแแแแแกแแฌแแแแแแ แแคแแชแแแแฃแ แกแแชแแแจแ (แแแ.
github.com/GoogleCloudPlatform/spark-on-k8s-operator/blob/v1beta1-0.9.0-2.4.0/examples/spark-pi.yaml ). แแแแแคแแกแขแแก แจแแกแแฎแแ แฃแแแ แแฆแแแแจแแแก แแแแจแแแแแแแแแ แแฃแแฅแขแแแ:- โapiVersionโ แแแฅแกแแแแแจแ แฃแแแ แแงแแก แแแแแแแแฃแแ แแแแ แแขแแ แแก แแแ แกแแแก แจแแกแแแแแแกแ API แแแ แกแแ;
- แแแฅแกแแแแแจแ โmetadata.namespaceโ แฃแแแ แแงแแก แแแแแแแแฃแแ แกแแฎแแแแ แกแแแ แชแ, แ แแแแแจแแช แแแแแแแชแแแก แแแจแแแแ แแแฎแแแแ;
- แแแฅแกแแแแแ โspec.imageโ แฃแแแ แจแแแชแแแแแก แจแแฅแแแแแ Docker แกแฃแ แแแแก แแแกแแแแ แแก แฎแแแแแกแแฌแแแแ แ แแแกแขแ แจแ;
- แแแฅแกแแแแแ โspec.mainClassโ แฃแแแ แจแแแชแแแแแก Spark แแแแชแแแแแแก แแแแกแก, แ แแแแแแช แฃแแแ แแแฃแจแแแ แแ แแชแแกแแก แแแฌแงแแแแกแแก;
- แแแฅแกแแแแแ โspec.mainApplicationFileโ แฃแแแ แจแแแชแแแแแก แจแแกแ แฃแแแแแแ jar แคแแแแแก แแแแก;
- แแแฅแกแแแแแจแ โspec.sparkVersionโ แฃแแแ แแแฃแแแแแแแแก แแแแแงแแแแแฃแแ Spark-แแก แแแ แกแแ;
- โspec.driver.serviceAccountโ แแแฅแกแแแแแจแ แฃแแแ แแงแแก แแแแแแแแฃแแ แกแแ แแแกแแก แแแแแ แแจแ แจแแกแแแแแแก Kubernetes แกแแฎแแแแ แกแแแ แชแแจแ, แ แแแแแแช แแแแแงแแแแแฃแแ แแฅแแแแ แแแแแแแชแแแก แแแกแแจแแแแแ;
- โspec.executorโ แแแฅแกแแแแแจแ แฃแแแ แแงแแก แแแแแแแแฃแแ แแแแแแแชแแแกแแแแก แแแแแงแแคแแแ แ แแกแฃแ แกแแแแก แ แแแแแแแแ;
- "spec.volumeMounts" แแแฅแกแแแแแจแ แฃแแแ แแงแแก แแแแแแแแฃแแ แแแแแแฃแ แ แแแ แแฅแขแแ แแ, แ แแแแแจแแช แจแแแฅแแแแแ แแแแแแฃแ แ Spark แแแแชแแแแแแก แคแแแแแแ.
แแแแแคแแกแขแแก แแแแแ แแ แแแแก แแแแแแแแ (แแฅ {spark-service-account} แแ แแก แกแแ แแแกแแก แแแแแ แแจแ Kubernetes แแแแกแขแแ แจแ Spark แแแแชแแแแแแก แจแแกแแกแ แฃแแแแแแ):
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}
แแกแแแ แแฆแกแแแแจแแแแแ, แ แแ แแแแแคแแกแขแแก แแก แกแแแชแแคแแแแชแแ แจแแแซแแแแ แจแแแชแแแแแก "hadoopConfigMap" แแแ แแแแขแ แก, แ แแแแแแช แกแแจแฃแแแแแแก แแแซแแแแ แแแฃแแแแแ ConfigMap Hadoop-แแก แแแแคแแแฃแ แแชแแแ, แจแแกแแแแแแกแ แคแแแแแก Docker แกแฃแ แแแจแ แฏแแ แแแแแแแกแแแแก แแแ แแจแ. แแก แแกแแแ แจแแกแแคแแ แแกแแ แแแแแแแแแแแก แ แแแฃแแแ แฃแแแ แจแแกแแกแ แฃแแแแแแ - "แแแแ แแแแก" แแแ แแแแขแ แแก แแแแแงแแแแแแ, แจแแแซแแแแ แแแแฃแกแขแแแก แแแชแแแฃแแ แแแแแแแแแก แจแแกแ แฃแแแแแก แแ แแคแแแ.
แแแแก แจแแแแแ, แฉแแแ แแแแแฎแแแ แฉแแแแก แแแแแคแแกแขแก spark-pi.yaml แคแแแแจแ แแ แแแงแแแแแ แแแก แฉแแแแก Kubernetes แแแแกแขแแ แจแ:
oc apply -f spark-pi.yaml
แแก แจแแฅแแแแก "sparkapplications" แขแแแแก แแแแแฅแขแก:
oc get sparkapplications -n {project}
> NAME AGE
> spark-pi 22h
แแ แจแแแแฎแแแแแจแ แจแแแฅแแแแแ แแแแ แแแแแแแชแแแ, แ แแแแแก แกแขแแขแฃแกแ แแแฉแแแแแแ แแฅแแแแ แจแแฅแแแแ โsparkapplicationsโ-แจแ. แแแกแ แแแฎแแ แจแแแแซแแแแ แจแแแแแแ แแ แซแแแแแแ:
oc get sparkapplications spark-pi -o yaml -n {project}
แแแแแแแแแก แจแแกแ แฃแแแแแก แจแแแแแ, POD แแแแแแ "แแแกแ แฃแแแแฃแแ" แกแขแแขแฃแกแแ, แ แแแแแแช แแกแแแ แแแแแฎแแแแแ "sparkapplications"-แจแ. แแแแแแแชแแแก แแฃแ แแแแแก แแแฎแแ แจแแกแแซแแแแแแแ แแ แแฃแแแ แจแ แแ แจแแแแแแ แแ แซแแแแแแก แแแแแงแแแแแแ (แแฅ {sparkapplications-pod-name} แแ แแก แแแจแแแแฃแแ แแแแชแแแแก pod-แแก แกแแฎแแแ):
oc logs {sparkapplications-pod-name} -n {project}
Spark แแแแชแแแแแแก แแแ แแแ แแกแแแ แจแแกแแซแแแแแแแ แกแแแชแแแแแแแแฃแแ 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}
แแแแแ แจแแแฅแแแแ แแฆแฌแแ แ 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}
แแแกแแกแ แฃแแก, แแกแฃแ แก แแแแแแฎแแแ แแฃแแแ แแแขแจแ Spark-แแก (2.4.5) แแแแแแแแ แ แกแขแแแแแฃแ แ แแแ แกแแแก แแแแแงแแแแแแก แแฆแแแฉแแแแแ แฃแแ แงแแคแแแ แแฎแแ แแแแ:
- แแแ แแแแ แแ, แแแแแ, แแแแแแ แ แแแแฃแกแ แแ แแก แแแแแชแแแแ แแแแแแฃแ แแแแก แแแแแแแแแ. YARN-แแก แงแแแแ แแแแแแแแแแแแก แแแฃแฎแแแแแแ, แแแก แแแแแงแแแแแแก แฃแแแ แแขแแกแแแแแแช แฐแฅแแแแ, แแแแแแแแแ, แแแแแก แแแแแชแแแแแแ แแแฌแแแแแแก แแ แแแชแแแ (แแ แแ แ แแแแแชแแแแ แแแแแกแแแแก). แแแกแ แฌแงแแแแแแ Spark-แแก แแแแชแแแแแ แจแแกแ แฃแแแ แแ แแแแแซแแแแ, แกแแแแช แแแแแแ แแแแแ แแแแแแแแแแจแ แฉแแ แแฃแแ แแแแแชแแแแแ แแ แแแแจแแแแแแแแแ แจแแแชแแ แแ แฅแกแแแจแ แแแแแชแแแแแแก แแแฌแแแแแแก แแ แ. Kubernetes-แแก แแแแแงแแแแแแกแแก, แฉแแแ แแแฌแงแแแแแ แแแแชแแแแจแ แฉแแ แแฃแแ แแแแแชแแแแแแก แฅแกแแแจแ แแแแแขแแแแก แแฃแชแแแแแแแแแก. แแฃ แแกแแแ แกแแแแแ แแกแแ แแแแแ, แแแแแแแแแก แจแแกแ แฃแแแแแก แแ แ แจแแแซแแแแ แแแแจแแแแแแแแแ แแแแแแ แแแก แแ แแกแแแ แแแแแฎแแแแก แกแแแแแแ แแแแ แแแแแแ แแแกแแแ, แ แแแแแแช แแแแแงแแคแแแแ Spark แแแแแแแแแก แแแกแขแแแชแแแแแ แแแแ แแ แแแแแแ แจแแแแฎแแแกแแแแก. แแก แแแแฃแกแ แจแแแซแแแแ แจแแแชแแ แแแก แกแแแชแแแแแแแแฃแแ แแ แแแ แแแฃแแ แฃแแ แฃแแแแแงแแคแแก แแแแแงแแแแแแ, แ แแแแแแช แฃแแ แฃแแแแแงแแคแก แแแแแชแแแแ แแแแแแแแแชแแแก Kubernetes-แจแ (แแแแแแแแแ, Alluxio), แแแแ แแ แแก แ แแแแฃแ แแ แแแจแแแแก แแแแแชแแแแ แกแ แฃแแ แแกแแแก แจแแแแฎแแแก แแฃแชแแแแแแแแแก Kubernetes แแแแกแขแแ แแก แแแแแซแแแแ.
- แแแแ แ แแแแจแแแแแแแแแ แแแแฃแกแ แแ แแก แฃแกแแคแ แแฎแแแแ. แแแแฃแแแกแฎแแแแแ, Spark แแแแชแแแแแแก แแแจแแแแแกแแแ แแแแแแจแแ แแแแ แฃแกแแคแ แแฎแแแแแกแแแ แแแแแแจแแ แแแฃแแ แคแฃแแฅแชแแแแ แแแแแ แแฃแแแ, Kerberos-แแก แแแแแงแแแแแ แแ แแ แแก แแแคแแ แฃแแ แแคแแชแแแแฃแ แแแแฃแแแแขแแชแแแจแ (แแฃแแชแ แจแแกแแแแแแกแ แแแ แแแแขแแแ แแแแแแ แแ 3.0.0 แแแ แกแแแจแ, แ แแแแแแช แแแแแขแแแแ แกแแแฃแจแแแก แแแแแฎแแแก) แแ แฃแกแแคแ แแฎแแแแแก แแแแฃแแแแขแแชแแ Spark-แแก แแแแแงแแแแแแ (https ://spark.apache.org/docs/2.4.5/security.html) แแฎแแแแ YARN, Mesos แแ Standalone Cluster แแแแแฉแแแแแ แแแกแแฆแแแแก แแแฆแแแแแแแ. แแแแแแ แแฃแแแ, แแแแฎแแแ แแแแแก, แ แแแแแก แคแแ แแแแแจแแช Spark แแแแชแแแแแ แแฎแกแแแแ, แแ แจแแแซแแแแ แแแ แแแแแ แแแแฃแกแขแแแก - แฉแแแ แแฎแแแแ แแแแแกแแแฆแแ แแแ แกแแ แแแกแแก แแแแแ แแจแก, แ แแแแแแแช แแก แแแฃแจแแแแแก, แฎแแแ แแแแฎแแแ แแแแแ แจแแแ แฉแแแ แแแแคแแแฃแ แแ แแแฃแแ แฃแกแแคแ แแฎแแแแแก แแแแแขแแแแก แกแแคแฃแซแแแแแ. แแแแกแแแ แแแแแแจแแ แแแแ, แแแแแแงแแแแแ แแ root แแแแฎแแแ แแแแแ, แ แแแแแแช แแ แแ แแก แฃแกแแคแ แแฎแ แแ แแแฃแฅแขแแฃแ แแแ แแแแจแ, แแ แจแแแแฎแแแแแแ UID-แแก แแแแฎแแแ แแแแแ, แ แแแแแแช แแ แแกแแกแแแแแแแแ แแแแแชแแแแแแ แฌแแแแแแก แฃแคแแแแแแแก แแแแแฌแแแแแแกแแก (แแแแก แแแแแแ แแแ แจแแกแแซแแแแแแแ PodSecurityPolicies-แแก แจแแฅแแแแ แแ แแแแแแ แแแแแแจแแ แแแแ. แจแแกแแแแแแกแ แแแแกแแฎแฃแ แแแแก แแแแแ แแจแแแ). แแแแแแแ, แแแแแกแแแแแ แแ แแก แแ แแแแแแแแกแแ แงแแแแ แกแแญแแ แ แคแแแแ แแแ แแแแแ Docker แกแฃแ แแแจแ, แแ แจแแชแแแแแ Spark แแแจแแแแแก แกแแ แแแขแ, แ แแแ แแแแแแงแแแแก แแฅแแแแก แแ แแแแแแแชแแแจแ แแแฆแแแฃแแ แกแแแแฃแแแแแแแก แจแแแแฎแแแกแ แแ แแแแฆแแแแก แแแฅแแแแแแ.
- Spark แกแแแฃแจแแแแแแก แแแจแแแแ Kubernetes-แแก แแแแแงแแแแแแ แแคแแชแแแแฃแ แแ แฏแแ แแแแแ แแฅแกแแแ แแแแแขแฃแ แ แแแแแจแแ แแ แแแแแแแแจแ แจแแกแแซแแแ แแแแจแแแแแแแแแ แชแแแแแแแแแ แแแฎแแแก แแแแแงแแแแแฃแ แแ แขแแคแแฅแขแแแจแ (แแแแคแแแฃแ แแชแแแก แคแแแแแแ, Docker-แแก แแแแแก แกแฃแ แแแแแ แแ แแแจแแแแแก แกแแ แแแขแแแ). แแ แแแ แแแแช, แแแกแแแแก แแแแแแแแแแกแแก, 2.3.0 แแ 2.4.5 แแแ แกแแแแ แจแแแแฌแแแ, แฅแชแแแ แแแแจแแแแแแแแแ แแแแกแฎแแแแแแแแแ.
แแแแแ แแแแแแแแแ แแแแแฎแแแแแแก - แแฎแแแฎแแ แแแแแแแแ Spark-แแก แแฎแแแ แแแ แกแแ (3.0.0), แ แแแแแแแช แแแแจแแแแแแแแแ แชแแแแแแแแแ แจแแแขแแแ Spark-แแก แแฃแจแแแแแจแ Kubernetes-แแ, แแแแ แแ แจแแแแแ แฉแฃแแ แแ แ แแกแฃแ แก แแแแแฏแแ แแก แแฎแแ แแแญแแ แแก แแฅแกแแแ แแแแแขแฃแแ แกแขแแขแฃแกแ. แจแแกแแซแแแ, แจแแแแแแ แแแแแฎแแแแแแ แกแแจแฃแแแแแแก แแแแชแแแ แกแ แฃแแแ แแแ แฉแแแ YARN-แแก แแแขแแแแแ แแ Spark แแแแชแแแแแแก แแแจแแแแ Kubernetes-แแ แแฅแแแแ แกแแกแขแแแแก แฃแกแแคแ แแฎแแแแแก แจแแจแแก แแแ แแจแ แแ แคแฃแแฅแชแแฃแ แ แแแแแแแแแขแแแแก แแแแแฃแแแแแแแแ แจแแชแแแแก แแฃแชแแแแแแแแแก แแแ แแจแ.
แแแแ
แฌแงแแ แ: www.habr.com