CienÄ«jamie lasÄ«tÄji, laba pÄcpusdiena. Å odien mÄs nedaudz runÄsim par Apache Spark un tÄs attÄ«stÄ«bas perspektÄ«vÄm.
MÅ«sdienu lielo datu pasaulÄ Apache Spark ir de facto standarts pakeÅ”u datu apstrÄdes uzdevumu izstrÄdei. TurklÄt to izmanto arÄ«, lai izveidotu straumÄÅ”anas lietojumprogrammas, kas darbojas mikropakeÅ”u koncepcijÄ, apstrÄdÄjot un nosÅ«tot datus nelielÄs porcijÄs (Spark Structured Streaming). Un tradicionÄli tÄ ir bijusi daļa no kopÄjÄs Hadoop steka, izmantojot YARN (vai dažos gadÄ«jumos Apache Mesos) kÄ resursu pÄrvaldnieku. LÄ«dz 2020. gadam tÄ izmantoÅ”ana tradicionÄlajÄ formÄ ir apÅ”aubÄma lielÄkajai daļai uzÅÄmumu, jo trÅ«kst pienÄcÄ«gas Hadoop izplatÄ«Å”anas ā HDP un CDH attÄ«stÄ«ba ir apstÄjusies, CDH nav labi attÄ«stÄ«ts un tam ir augstas izmaksas, un pÄrÄjiem Hadoop piegÄdÄtÄjiem ir vai nu beidza pastÄvÄt, vai arÄ« tiem ir blÄva nÄkotne. TÄpÄc Apache Spark palaiÅ”ana, izmantojot Kubernetes, rada arvien lielÄku interesi sabiedrÄ«bÄ un lielos uzÅÄmumos - kļūstot par standartu konteineru orÄ·estrÄÅ”anÄ un resursu pÄrvaldÄ«bÄ privÄtajos un publiskajos mÄkoÅos, tas atrisina problÄmu ar neÄrto resursu plÄnoÅ”anu Spark uzdevumiem YARN un nodroÅ”ina stabili attÄ«stoÅ”a platforma ar daudzÄm komerciÄlÄm un atvÄrtÄm izplatÄ«bÄm visu izmÄru un joslu uzÅÄmumiem. TurklÄt, Åemot vÄrÄ popularitÄti, vairums jau ir paspÄjuÅ”i iegÄdÄties pÄris savas instalÄcijas un ir palielinÄjuÅ”i savas zinÄÅ”anas tÄs lietoÅ”anÄ, kas vienkÄrÅ”o pÄrvietoÅ”anos.
SÄkot ar versiju 2.3.0, Apache Spark ieguva oficiÄlu atbalstu uzdevumu izpildei Kubernetes klasterÄ«, un Å”odien mÄs runÄsim par Ŕīs pieejas paÅ”reizÄjo briedumu, dažÄdÄm tÄs izmantoÅ”anas iespÄjÄm un kļūmÄm, ar kurÄm saskarsies ievieÅ”anas laikÄ.
Vispirms apskatÄ«sim uzdevumu un lietojumprogrammu izstrÄdes procesu, pamatojoties uz Apache Spark, un izcelsim tipiskus gadÄ«jumus, kad jums ir jÄpalaiž uzdevums Kubernetes klasterÄ«. Sagatavojot Å”o ziÅu, OpenShift tiek izmantots kÄ izplatÄ«Å”ana, un tiks dotas komandas, kas attiecas uz tÄ komandrindas utilÄ«tu (oc). Citiem Kubernetes izplatÄ«jumiem var izmantot atbilstoÅ”Äs komandas no standarta Kubernetes komandrindas utilÄ«ta (kubectl) vai to analogiem (piemÄram, oc adm politikai).
Pirmais lietoÅ”anas gadÄ«jums ā spark-submit
Uzdevumu un lietojumprogrammu izstrÄdes laikÄ izstrÄdÄtÄjam ir jÄpalaiž uzdevumi, lai atkļūdotu datu transformÄciju. TeorÄtiski Å”iem mÄrÄ·iem var izmantot stubus, taÄu Å”ajÄ uzdevumu klasÄ ÄtrÄka un labÄka ir izrÄdÄ«jusies izstrÄde ar reÄlu (kaut arÄ« testa) gala sistÄmu eksemplÄru piedalÄ«Å”anos. GadÄ«jumÄ, ja mÄs atkļūdojam reÄlos gala sistÄmu gadÄ«jumos, ir iespÄjami divi scenÄriji:
izstrÄdÄtÄjs palaiž Spark uzdevumu lokÄli savrupajÄ režīmÄ;
izstrÄdÄtÄjs testa cilpÄ izpilda Spark uzdevumu Kubernetes klasterÄ«.
Pirmajai iespÄjai ir tiesÄ«bas pastÄvÄt, taÄu tai ir vairÄki trÅ«kumi:
Katram izstrÄdÄtÄjam ir jÄnodroÅ”ina piekļuve no darba vietas visiem viÅam nepiecieÅ”amajiem gala sistÄmu gadÄ«jumiem;
darba maŔīnai ir nepiecieÅ”ams pietiekams resursu apjoms, lai izpildÄ«tu izstrÄdÄjamo uzdevumu.
Otrajai iespÄjai nav Å”o trÅ«kumu, jo Kubernetes klastera izmantoÅ”ana ļauj pieŔķirt nepiecieÅ”amo resursu kopu palaiÅ”anas uzdevumiem un nodroÅ”inÄt tai nepiecieÅ”amo piekļuvi gala sistÄmas gadÄ«jumiem, elastÄ«gi nodroÅ”inot piekļuvi tai, izmantojot Kubernetes lomu modeli. visi izstrÄdes komandas locekļi. Izcelsim to kÄ pirmo lietoÅ”anas gadÄ«jumu ā Spark uzdevumu palaiÅ”ana no vietÄjÄ izstrÄdÄtÄja maŔīnas Kubernetes klasterÄ« testa Ä·ÄdÄ.
ParunÄsim vairÄk par Spark iestatÄ«Å”anas procesu vietÄjai darbÄ«bai. Lai sÄktu lietot Spark, tas jÄinstalÄ:
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
SavÄcam nepiecieÅ”amÄs paketes darbam ar Kubernetes:
cd spark-2.4.5/
./build/mvn -Pkubernetes -DskipTests clean package
Pilna bÅ«vÄÅ”ana aizÅem daudz laika, un, lai izveidotu Docker attÄlus un palaistu tos Kubernetes klasterÄ«, jums patieÅ”Äm ir nepiecieÅ”ami tikai jar faili no direktorija āassembly/ā, lai jÅ«s varÄtu izveidot tikai Å”o apakÅ”projektu:
Lai palaistu Spark darbus vietnÄ Kubernetes, jums ir jÄizveido Docker attÄls, ko izmantot kÄ pamata attÄlu. Å eit ir 2 iespÄjamÄs pieejas:
Ä¢enerÄtajÄ Docker attÄlÄ ir iekļauts izpildÄmais Spark uzdevuma kods;
IzveidotajÄ attÄlÄ ir iekļauts tikai Spark un nepiecieÅ”amÄs atkarÄ«bas, izpildÄmais kods tiek mitinÄts attÄlinÄti (piemÄram, HDFS).
Vispirms izveidosim Docker attÄlu, kurÄ ir Spark uzdevuma testa piemÄrs. Lai izveidotu Docker attÄlus, Spark ir utilÄ«ta ar nosaukumu "docker-image-tool". IzpÄtÄ«sim palÄ«dzÄ«bu par to:
./bin/docker-image-tool.sh --help
Ar tÄs palÄ«dzÄ«bu jÅ«s varat izveidot Docker attÄlus un augÅ”upielÄdÄt tos attÄlos reÄ£istros, taÄu pÄc noklusÄjuma tam ir vairÄki trÅ«kumi:
bez kļūmÄm izveido 3 Docker attÄlus vienlaikus - Spark, PySpark un R;
neļauj norÄdÄ«t attÄla nosaukumu.
TÄpÄc mÄs izmantosim Ŕīs utilÄ«tas modificÄto versiju, kas norÄdÄ«ta tÄlÄk:
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
Ar tÄ palÄ«dzÄ«bu mÄs apkopojam pamata Spark attÄlu, kurÄ ir testa uzdevums Pi aprÄÄ·inÄÅ”anai, izmantojot Spark (Å”eit {docker-registry-url} ir jÅ«su Docker attÄlu reÄ£istra URL, {repo} ir repozitorija nosaukums reÄ£istrÄ, kas atbilst projektam OpenShift , {image-name} ā attÄla nosaukums (ja tiek izmantota trÄ«s lÄ«meÅu attÄlu atdalÄ«Å”ana, piemÄram, kÄ integrÄtajÄ Red Hat OpenShift attÄlu reÄ£istrÄ), {tag} ā Ŕī atzÄ«me attÄla versija):
PÄrbaudÄ«sim, vai samontÄtais attÄls ir pieejams OKD. Lai to izdarÄ«tu, pÄrlÅ«kprogrammÄ atveriet URL ar atbilstoÅ”Ä projekta attÄlu sarakstu (Å”eit {project} ir projekta nosaukums OpenShift klasterÄ«, {OKD-WEBUI-URL} ir OpenShift Web konsoles URL. ) - https://{OKD-WEBUI-URL}/console /project/{project}/browse/images/{image-name}.
Lai palaistu uzdevumus, ir jÄizveido pakalpojuma konts ar privilÄÄ£ijÄm palaist pods kÄ root (Å”o punktu apspriedÄ«sim vÄlÄk):
spark.kubernetes.authenticate.driver.serviceAccountName ā Kubernetes pakalpojuma konta nosaukums, kas tiek izmantots, palaižot apvidus (lai definÄtu droŔības kontekstu un iespÄjas, mijiedarbojoties ar Kubernetes API);
spark.kubernetes.namespace ā Kubernetes nosaukumtelpa, kurÄ tiks palaisti draiveru un izpildÄ«tÄju podi;
spark.submit.deployMode ā Spark palaiÅ”anas metode (standarta spark-submit tiek izmantots āklasterisā, Spark Operator un jaunÄkÄm Spark versijÄm āklientsā);
spark.kubernetes.container.image ā Docker attÄls, ko izmanto, lai palaistu pÄkstis;
spark.master ā Kubernetes API URL (ir norÄdÄ«ts ÄrÄjais, tÄpÄc piekļuve notiek no vietÄjÄs maŔīnas);
local:// ir ceļŔ uz Spark izpildÄmo failu Docker attÄlÄ.
MÄs ejam uz atbilstoÅ”o OKD projektu un pÄtÄm izveidotos podi - https://{OKD-WEBUI-URL}/console/project/{project}/browse/pods.
Lai vienkÄrÅ”otu izstrÄdes procesu, var izmantot citu opciju, kurÄ tiek izveidots kopÄ«gs Spark bÄzes attÄls, kuru izmanto visi uzdevumi, lai palaistu, un izpildÄmo failu momentuzÅÄmumi tiek publicÄti ÄrÄjÄ krÄtuvÄ (piemÄram, Hadoop) un norÄdÄ«ti zvanot. spark-iesniegt kÄ saiti. Å ÄdÄ gadÄ«jumÄ varat palaist dažÄdas Spark uzdevumu versijas, nepÄrbÅ«vÄjot Docker attÄlus, izmantojot, piemÄram, WebHDFS, lai publicÄtu attÄlus. MÄs nosÅ«tÄm pieprasÄ«jumu izveidot failu (Å”eit {host} ir WebHDFS pakalpojuma resursdators, {port} ir WebHDFS pakalpojuma ports, {path-to-file-on-hdfs} ir vÄlamais ceļŔ uz failu uz HDFS):
curl -i -X PUT "http://{host}:{port}/webhdfs/v1/{path-to-file-on-hdfs}?op=CREATE
JÅ«s saÅemsit Å”Ädu atbildi (Å”eit {location} ir URL, kas jÄizmanto faila lejupielÄdei):
IelÄdÄjiet Spark izpildÄmo failu HDFS (Å”eit {path-to-local-file} ir ceļŔ uz Spark izpildÄmo failu paÅ”reizÄjÄ resursdatorÄ):
curl -i -X PUT -T {path-to-local-file} "{location}"
PÄc tam mÄs varam veikt spark-iesniegÅ”anu, izmantojot Spark failu, kas augÅ”upielÄdÄts HDFS (Å”eit {class-name} ir tÄs klases nosaukums, kas jÄpalaiž, lai pabeigtu uzdevumu):
JÄÅem vÄrÄ, ka, lai piekļūtu HDFS un nodroÅ”inÄtu uzdevuma darbÄ«bu, iespÄjams, bÅ«s jÄmaina Dockerfile un enterpoint.sh skripts - Dockerfile jÄpievieno direktÄ«va, lai kopÄtu atkarÄ«gÄs bibliotÄkas direktorijÄ /opt/spark/jars un iekļaut HDFS konfigurÄcijas failu ievades punktÄ SPARK_CLASSPATH. sh.
Otrais lietoŔanas gadījums - Apache Livy
TurklÄt, kad uzdevums ir izstrÄdÄts un rezultÄts ir jÄpÄrbauda, āārodas jautÄjums par tÄ palaiÅ”anu kÄ daļu no CI/CD procesa un izsekot tÄ izpildes statusam. Protams, varat to palaist, izmantojot lokÄlo spark-submit izsaukumu, taÄu tas sarežģī CI/CD infrastruktÅ«ru, jo ir jÄinstalÄ un jÄkonfigurÄ Spark CI servera aÄ£entos/skrÄjÄjiem un jÄiestata piekļuve Kubernetes API. Å ajÄ gadÄ«jumÄ mÄrÄ·a ievieÅ”ana ir izvÄlÄjusies izmantot Apache Livy kÄ REST API, lai palaistu Spark uzdevumus, kas mitinÄti Kubernetes klasterÄ«. Ar tÄs palÄ«dzÄ«bu jÅ«s varat palaist Spark uzdevumus Kubernetes klasterÄ«, izmantojot parastos cURL pieprasÄ«jumus, kas ir viegli ievieÅ”ami, pamatojoties uz jebkuru CI risinÄjumu, un tÄ ievietoÅ”ana Kubernetes klasterÄ« atrisina autentifikÄcijas problÄmu, mijiedarbojoties ar Kubernetes API.
Izcelsim to kÄ otro lietoÅ”anas gadÄ«jumu ā Spark uzdevumu izpilde kÄ daļa no CI/CD procesa Kubernetes klasterÄ« testa cilpÄ.
Nedaudz par Apache Livy - tas darbojas kÄ HTTP serveris, kas nodroÅ”ina tÄ«mekļa saskarni un RESTful API, kas ļauj attÄlinÄti palaist spark-submit, nododot nepiecieÅ”amos parametrus. TradicionÄli tas tiek piegÄdÄts kÄ daļa no HDP izplatÄ«Å”anas, taÄu to var izvietot arÄ« OKD vai jebkurÄ citÄ Kubernetes instalÄcijÄ, izmantojot atbilstoÅ”o manifestu un Docker attÄlu kopu, piemÄram, Å”o - github.com/ttauveron/k8s-big-data-experiments/tree/master/livy-spark-2.3. MÅ«su gadÄ«jumÄ tika izveidots lÄ«dzÄ«gs Docker attÄls, tostarp Spark versija 2.4.5 no Å”Äda Dockerfile:
Ä¢enerÄto attÄlu var izveidot un augÅ”upielÄdÄt esoÅ”ajÄ Docker repozitorijÄ, piemÄram, iekÅ”ÄjÄ OKD repozitorijÄ. Lai to izvietotu, izmantojiet Å”o manifestu ({registry-url} ā Docker attÄlu reÄ£istra URL, {image-name} ā Docker attÄla nosaukums, {tag} ā Docker attÄla tags, {livy-url} ā vÄlamais URL, kur serveris bÅ«s pieejams Livy; manifests āMarÅ”rutsā tiek izmantots, ja Red Hat OpenShift tiek izmantots kÄ Kubernetes izplatÄ«Å”ana, pretÄjÄ gadÄ«jumÄ tiek izmantots atbilstoÅ”ais NodePort tipa Ingress vai pakalpojuma manifests):
PÄc tÄ lietoÅ”anas un veiksmÄ«gas podziÅas palaiÅ”anas Livy grafiskais interfeiss ir pieejams saitÄ: http://{livy-url}/ui. Izmantojot Livy, mÄs varam publicÄt savu Spark uzdevumu, izmantojot REST pieprasÄ«jumu no, piemÄram, Pastnieka. TÄlÄk ir parÄdÄ«ts kolekcijas ar pieprasÄ«jumiem piemÄrs (konfigurÄcijas argumentus ar mainÄ«gajiem, kas nepiecieÅ”ami palaistÄ uzdevuma darbÄ«bai, var nodot āargsā masÄ«vÄ):
IzpildÄ«sim pirmo pieprasÄ«jumu no kolekcijas, ejam uz OKD saskarni un pÄrbaudÄ«sim, vai uzdevums ir veiksmÄ«gi palaists - https://{OKD-WEBUI-URL}/console/project/{project}/browse/pods. TajÄ paÅ”Ä laikÄ Livy saskarnÄ (http://{livy-url}/ui) parÄdÄ«sies sesija, kurÄ, izmantojot Livy API vai grafisko interfeisu, varat izsekot uzdevuma gaitai un izpÄtÄ«t sesiju. baļķi.
Tagad parÄdÄ«sim, kÄ LÄ«vija strÄdÄ. Lai to izdarÄ«tu, izpÄtÄ«sim Livy konteinera žurnÄlus podÄ ar Livy serveri ā https://{OKD-WEBUI-URL}/console/project/{project}/browse/pods/{livy-pod-name }?tab=logs. No tiem mÄs varam redzÄt, ka, izsaucot Livy REST API konteinerÄ ar nosaukumu ālivyā, tiek izpildÄ«ts spark-submit, lÄ«dzÄ«gs tam, ko izmantojÄm iepriekÅ” (Å”eit {livy-pod-name} ir izveidotÄ pod nosaukums ar Livy serveri). KolekcijÄ ir iekļauts arÄ« otrs vaicÄjums, kas ļauj izpildÄ«t uzdevumus, kas attÄlinÄti mitina Spark izpildÄmo failu, izmantojot Livy serveri.
TreŔais lietoŔanas gadījums - Spark Operator
Tagad, kad uzdevums ir pÄrbaudÄ«ts, rodas jautÄjums par tÄ regulÄru izpildi. VietÄjais veids, kÄ regulÄri palaist uzdevumus Kubernetes klasterÄ«, ir entÄ«tija CronJob, un jÅ«s to varat izmantot, taÄu Å”obrÄ«d operatoru izmantoÅ”ana lietojumprogrammu pÄrvaldÄ«bai Kubernetes ir ļoti populÄra, un Spark ir diezgan nobriedis operators, kas arÄ« ir izmanto uzÅÄmuma lÄ«meÅa risinÄjumos (piemÄram, Lightbend FastData Platform). MÄs iesakÄm to izmantot ā paÅ”reizÄjai stabilajai Spark versijai (2.4.5) ir diezgan ierobežotas konfigurÄcijas iespÄjas Spark uzdevumu izpildei Kubernetes, savukÄrt nÄkamÄ lielÄkÄ versija (3.0.0) deklarÄ pilnÄ«gu Kubernetes atbalstu, taÄu tÄs izlaiÅ”anas datums joprojÄm nav zinÄms. . Spark Operator kompensÄ Å”o trÅ«kumu, pievienojot svarÄ«gas konfigurÄcijas opcijas (piemÄram, uzstÄdot ConfigMap ar Hadoop piekļuves konfigurÄciju Spark podiem) un iespÄju palaist regulÄri ieplÄnotu uzdevumu.
Izcelsim to kÄ treÅ”o lietoÅ”anas gadÄ«jumu ā regulÄra Spark uzdevumu izpilde Kubernetes klasterÄ« ražoÅ”anas cikla ietvaros.
Izmantojiet manifestus no oficiÄlÄ repozitorija (https://github.com/GoogleCloudPlatform/spark-on-k8s-operator/tree/master/manifest). Ir vÄrts atzÄ«mÄt sekojoÅ”o - Cloudflow ietver operatoru ar API versiju v1beta1. Ja tiek izmantota Å”Äda veida instalÄÅ”ana, Spark lietojumprogrammu manifestu aprakstiem ir jÄbÅ«t balstÄ«tiem uz Git tagu paraugiem ar atbilstoÅ”u API versiju, piemÄram, "v1beta1-0.9.0-2.4.0". Operatora versiju var atrast CRD aprakstÄ, kas iekļauts operatora vÄrdnÄ«cÄ āversijasā:
oc get crd sparkapplications.sparkoperator.k8s.io -o yaml
Ja operators ir pareizi instalÄts, attiecÄ«gajÄ projektÄ parÄdÄ«sies aktÄ«vs pods ar Spark operatoru (piemÄram, cloudflow-fdp-sparkoperator Cloudflow instalÄcijas Cloudflow telpÄ) un tiks parÄdÄ«ts atbilstoÅ”s Kubernetes resursa veids ar nosaukumu āsparkapplicationsā. . Varat izpÄtÄ«t pieejamÄs Spark lietojumprogrammas, izmantojot Å”Ädu komandu:
oc get sparkapplications -n {project}
Lai izpildÄ«tu uzdevumus, izmantojot Spark Operator, ir jÄveic 3 darbÄ«bas:
izveidot Docker attÄlu, kas ietver visas nepiecieÅ”amÄs bibliotÄkas, kÄ arÄ« konfigurÄcijas un izpildÄmos failus. MÄrÄ·a attÄlÄ Å”is ir attÄls, kas izveidots CI/CD stadijÄ un pÄrbaudÄ«ts testa klasterÄ«;
publicÄt Docker attÄlu reÄ£istrÄ, kas pieejams no Kubernetes klastera;
vÄrdnÄ«cÄ āspec.driver.serviceAccountā ir jÄnorÄda pakalpojuma konts attiecÄ«gajÄ Kubernetes nosaukumvietÄ, kas tiks izmantots lietojumprogrammas palaiÅ”anai;
vÄrdnÄ«cÄ āspec.izpildÄ«tÄjsā jÄnorÄda pieteikumam pieŔķirto resursu skaits;
vÄrdnÄ«cÄ "spec.volumeMounts" ir jÄnorÄda lokÄlais direktorijs, kurÄ tiks izveidoti lokÄlie Spark uzdevumu faili.
Manifesta Ä£enerÄÅ”anas piemÄrs (Å”eit {spark-service-account} ir pakalpojuma konts Kubernetes klasterÄ« Spark uzdevumu izpildei):
Å ajÄ manifestÄ ir norÄdÄ«ts pakalpojuma konts, kuram pirms manifesta publicÄÅ”anas ir jÄizveido nepiecieÅ”amie lomu saistÄ«jumi, kas nodroÅ”ina nepiecieÅ”amÄs piekļuves tiesÄ«bas Spark lietojumprogrammai mijiedarbÄ«bai ar Kubernetes API (ja nepiecieÅ”ams). MÅ«su gadÄ«jumÄ lietojumprogrammai ir nepiecieÅ”amas tiesÄ«bas, lai izveidotu Pods. Izveidosim nepiecieÅ”amo lomu saiti:
Ir arÄ« vÄrts atzÄ«mÄt, ka Å”ajÄ manifesta specifikÄcijÄ var bÅ«t ietverts parametrs "hadoopConfigMap", kas ļauj norÄdÄ«t ConfigMap ar Hadoop konfigurÄciju, vispirms neievietojot attiecÄ«go failu Docker attÄlÄ. Tas ir piemÄrots arÄ« regulÄrai uzdevumu izpildei - izmantojot parametru āgrafiksā, var norÄdÄ«t konkrÄtÄ uzdevuma izpildes grafiku.
PÄc tam mÄs saglabÄjam manifestu failÄ spark-pi.yaml un lietojam to mÅ«su Kubernetes klasterÄ«:
oc apply -f spark-pi.yaml
Tas izveidos āsparkapplicationsā tipa objektu:
oc get sparkapplications -n {project}
> NAME AGE
> spark-pi 22h
Å ajÄ gadÄ«jumÄ tiks izveidots pods ar lietojumprogrammu, kuras statuss tiks parÄdÄ«ts izveidotajÄs āsparkaplikÄcijÄsā. To var apskatÄ«t ar Å”Ädu komandu:
oc get sparkapplications spark-pi -o yaml -n {project}
PÄc uzdevuma pabeigÅ”anas POD pÄries uz statusu āPabeigtsā, kas tiks atjauninÄts arÄ« sadaÄ¼Ä āSparkapplicationsā. Lietojumprogrammu žurnÄlus var skatÄ«t pÄrlÅ«kprogrammÄ vai izmantojot Å”Ädu komandu (Å”eit {sparkapplications-pod-name} ir izpildÄmÄ uzdevuma apgabala nosaukums):
oc logs {sparkapplications-pod-name} -n {project}
Spark uzdevumus var pÄrvaldÄ«t arÄ«, izmantojot specializÄto sparkctl utilÄ«tu. Lai to instalÄtu, klonÄjiet repozitoriju ar tÄ avota kodu, instalÄjiet Go un izveidojiet Å”o utilÄ«tu:
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
Izpildīsim aprakstīto uzdevumu, izmantojot sparkctl:
sparkctl create spark-app.yaml -n {project}
Apskatīsim esoŔo Spark uzdevumu sarakstu:
sparkctl list -n {project}
ApskatÄ«sim palaistÄ Spark uzdevuma notikumu sarakstu:
sparkctl event spark-pi -n {project} -f
ApskatÄ«sim palaistÄ Spark uzdevuma statusu:
sparkctl status spark-pi -n {project}
NoslÄgumÄ es vÄlos apsvÄrt atklÄtos trÅ«kumus, izmantojot paÅ”reizÄjo stabilo Spark versiju (2.4.5) Kubernetes:
Pirmais un, iespÄjams, galvenais trÅ«kums ir datu lokÄcijas trÅ«kums. Neskatoties uz visiem YARN trÅ«kumiem, tÄ izmantoÅ”anai bija arÄ« priekÅ”rocÄ«bas, piemÄram, koda piegÄdes princips datiem (nevis datiem kodÄ). Pateicoties tam, Spark uzdevumi tika izpildÄ«ti mezglos, kuros atradÄs aprÄÄ·inos iesaistÄ«tie dati, un ievÄrojami samazinÄjÄs laiks, kas bija nepiecieÅ”ams datu piegÄdei tÄ«klÄ. Lietojot Kubernetes, mÄs saskaramies ar nepiecieÅ”amÄ«bu pÄrvietot ar uzdevumu saistÄ«tos datus tÄ«klÄ. Ja tie ir pietiekami lieli, uzdevumu izpildes laiks var ievÄrojami palielinÄties, kÄ arÄ« nepiecieÅ”ams diezgan liels diska vietas apjoms, kas tiek atvÄlÄts Spark uzdevumu gadÄ«jumiem to pagaidu glabÄÅ”anai. Å o trÅ«kumu var mazinÄt, izmantojot specializÄtu programmatÅ«ru, kas nodroÅ”ina datu atraÅ”anÄs vietu Kubernetes (piemÄram, Alluxio), taÄu patiesÄ«bÄ tas nozÄ«mÄ nepiecieÅ”amÄ«bu Kubernetes klastera mezglos saglabÄt pilnÄ«gu datu kopiju.
Otrs svarÄ«gais trÅ«kums ir droŔība. PÄc noklusÄjuma ir atspÄjoti ar droŔību saistÄ«tie lÄ«dzekļi saistÄ«bÄ ar Spark uzdevumu izpildi, Kerberos lietoÅ”ana nav ietverta oficiÄlajÄ dokumentÄcijÄ (lai gan atbilstoÅ”Äs opcijas tika ieviestas versijÄ 3.0.0, kas prasÄ«s papildu darbu), un droŔības dokumentÄcija izmantojot Spark (https://spark.apache.org/docs/2.4.5/security.html), tikai YARN, Mesos un Standalone Cluster tiek parÄdÄ«ti kÄ galvenie veikali. TajÄ paÅ”Ä laikÄ nevar tieÅ”i norÄdÄ«t lietotÄju, kuram tiek palaisti Spark uzdevumi - mÄs norÄdÄm tikai pakalpojuma kontu, kurÄ tas darbosies, un lietotÄjs tiek atlasÄ«ts, pamatojoties uz konfigurÄtajÄm droŔības politikÄm. Å ajÄ sakarÄ tiek izmantots vai nu root lietotÄjs, kas nav droÅ”s produktÄ«vÄ vidÄ, vai arÄ« lietotÄjs ar nejauÅ”u UID, kas ir neÄrti, sadalot piekļuves tiesÄ«bas datiem (to var atrisinÄt, izveidojot PodSecurityPolicies un saistot tÄs ar atbilstoÅ”os pakalpojumu kontos). PaÅ”laik risinÄjums ir vai nu ievietot visus nepiecieÅ”amos failus tieÅ”i Docker attÄlÄ, vai modificÄt Spark palaiÅ”anas skriptu, lai izmantotu jÅ«su organizÄcijÄ pieÅemto noslÄpumu glabÄÅ”anas un izguves mehÄnismu.
Spark darbu izpilde, izmantojot Kubernetes, oficiÄli joprojÄm ir eksperimentÄlÄ režīmÄ, un nÄkotnÄ var bÅ«t bÅ«tiskas izmaiÅas izmantotajos artefaktos (konfigurÄcijas faili, Docker bÄzes attÄli un palaiÅ”anas skripti). Un patieÅ”Äm, sagatavojot materiÄlu, tika pÄrbaudÄ«tas versijas 2.3.0 un 2.4.5, uzvedÄ«ba bija ievÄrojami atŔķirÄ«ga.
GaidÄ«sim atjauninÄjumus - nesen tika izlaista jauna Spark versija (3.0.0), kas ienesa bÅ«tiskas izmaiÅas Spark darbÄ uz Kubernetes, taÄu saglabÄja Ŕī resursa pÄrvaldnieka atbalsta eksperimentÄlo statusu. IespÄjams, ka nÄkamie atjauninÄjumi patieÅ”Äm ļaus pilnÄ«bÄ ieteikt atteikties no YARN un palaist Spark uzdevumus Kubernetes, nebaidoties par savas sistÄmas droŔību un bez nepiecieÅ”amÄ«bas neatkarÄ«gi modificÄt funkcionÄlos komponentus.