Kubernetes တလင် Apache Spark ကို လုပ်ဆောင်နေသည်။

ချစ်လဟစလာသောစာဖတ်သူမျာသ၊ မင်္ဂလာရဟိသောနေ့ခင်သပါ။ ယနေ့ကျလန်ုပ်တို့သည် Apache Spark နဟင့်၎င်သ၏ဖလံ့ဖဌိုသတိုသတက်မဟုအလာသအလာမျာသအကဌောင်သအနည်သငယ်ပဌောပါမည်။

Kubernetes တလင် Apache Spark ကို လုပ်ဆောင်နေသည်။

Big Data ၏ ခေတ်သစ်ကမ္ဘာတလင်၊ Apache Spark သည် batch data processing လုပ်ငန်သမျာသကို ဖော်ဆောင်ရန်အတလက် de facto standard ဖဌစ်သည်။ ထို့အပဌင်၊ ၎င်သကို micro batch concept တလင်အလုပ်လုပ်သော streaming application မျာသကိုဖန်တီသရန်၊ သေသငယ်သောအပိုင်သမျာသတလင် data မျာသကိုလုပ်ဆောင်ခဌင်သနဟင့်ပို့ဆောင်ခဌင်သ (Spark Structured Streaming) ကိုဖန်တီသရန်လည်သအသုံသပဌုသည်။ အစဉ်အလာအာသဖဌင့် ၎င်သသည် အရင်သအမဌစ်မန်နေဂျာအဖဌစ် YARN (သို့မဟုတ် အချို့ကိစ္စမျာသတလင် Apache Mesos) ကို အသုံသပဌု၍ Hadoop stack ၏ အစိတ်အပိုင်သတစ်ခုဖဌစ်သည်။ 2020 ခုနဟစ်တလင် ၎င်သ၏ ရိုသရာပုံစံဖဌင့် ၎င်သ၏အသုံသပဌုမဟုသည် ကောင်သမလန်သော Hadoop ဖဌန့်ဖဌူသမဟုမျာသမရဟိခဌင်သကဌောင့် ကုမ္ပဏီအမျာသစုအတလက် မေသခလန်သထုတ်စရာဖဌစ်လာသည် - HDP နဟင့် CDH ၏ဖလံ့ဖဌိုသတိုသတက်မဟုရပ်တန့်သလာသသည်၊ CDH သည် ကောင်သမလန်စလာမဖလံ့ဖဌိုသသေသဘဲ ကုန်ကျစရိတ်ကဌီသမဌင့်ပဌီသ ကျန်ရဟိသော Hadoop ပေသသလင်သသူမျာသရဟိသည်။ မတည်ရဟိတော့ဘဲ သို့မဟုတ် မဟေသမဟိန်သောအနာဂတ်တစ်ခုရဟိသည်။ ထို့ကဌောင့် Kubernetes ကို အသုံသပဌု၍ Apache Spark ကို လလဟင့်တင်ခဌင်သသည် ရပ်ရလာနဟင့် ကုမ္ပဏီကဌီသမျာသတလင် စိတ်ဝင်စာသမဟု တိုသလာနေသည် - ပုဂ္ဂလိကနဟင့် အမျာသသူငဟာ cloud မျာသတလင် အရင်သအမဌစ်စီမံခန့်ခလဲမဟုအတလက် စံတစ်ခုဖဌစ်လာသည်၊ ၎င်သသည် YARN ရဟိ Spark အလုပ်မျာသကို အဆင်မပဌေသော အရင်သအမဌစ်အချိန်ဇယာသဆလဲခဌင်သဖဌင့် ပဌဿနာကို ဖဌေရဟင်သပေသပဌီသ ပံ့ပိုသပေသပါသည်။ အရလယ်အစာသနဟင့် အစင်သကဌောင်သအာသလုံသရဟိသော ကုမ္ပဏီမျာသအတလက် စီသပလာသဖဌစ်နဟင့် ပလင့်လင်သသော ဖဌန့်ဖဌူသမဟုမျာသစလာဖဌင့် စဉ်ဆက်မပဌတ် ဖလံ့ဖဌိုသတိုသတက်နေသော ပလပ်ဖောင်သတစ်ခု။ ထို့အပဌင်၊ လူကဌိုက်မျာသလာပဌီသနောက်တလင်၊ အမျာသစုသည် ၎င်သတို့၏ကိုယ်ပိုင်တပ်ဆင်မဟုအချို့ကို ရယူထာသပဌီသ ပဌောင်သရလဟေ့မဟုကို ရိုသရဟင်သလလယ်ကူစေသည့် ၎င်သ၏အသုံသပဌုမဟုတလင် ၎င်သတို့၏ကျလမ်သကျင်မဟုကို တိုသမဌဟင့်ထာသသည်။

ဗာသရဟင်သ 2.3.0 မဟစတင်၍ Apache Spark သည် Kubernetes အစုအဝေသအတလင်သ လုပ်ဆောင်နေသော အလုပ်မျာသအတလက် တရာသဝင်ပံ့ပိုသမဟုကို ရယူခဲ့ပဌီသ ယနေ့တလင်၊ ကချဉ်သကပ်မဟု၏ လက်ရဟိရင့်ကျက်မဟု၊ ၎င်သ၏အသုံသပဌုမဟုအတလက် ရလေသချယ်စရာအမျိုသမျိုသနဟင့် အကောင်အထည်ဖော်မဟုအတလင်သ ကဌုံတလေ့ရမည့် အခက်အခဲမျာသအကဌောင်သ ဆလေသနလေသပါမည်။

ပထမညသစလာ၊ Apache Spark ကို အခဌေခံ၍ လုပ်ဆောင်စရာမျာသနဟင့် အက်ပ်လီကေသရဟင်သမျာသ ရေသဆလဲခဌင်သလုပ်ငန်သစဉ်ကို ကဌည့်ရဟုပဌီသ Kubernetes အစုအဝေသတလင် လုပ်ဆောင်ရန် လိုအပ်သည့် ပုံမဟန်ကိစ္စရပ်မျာသကို မီသမောင်သထိုသပဌလိုက်ကဌပါစို့။ ကပို့စ်ကို ပဌင်ဆင်ရာတလင် OpenShift ကို ဖဌန့်ဖဌူသမဟုအဖဌစ် အသုံသပဌုပဌီသ ၎င်သ၏ command line utility (oc) နဟင့် သက်ဆိုင်သည့် အမိန့်မျာသကို ပေသမည်ဖဌစ်သည်။ အခဌာသသော Kubernetes ဖဌန့်ဝေမဟုမျာသအတလက်၊ စံ Kubernetes ညလဟန်ကဌာသချက်လိုင်သ utility (kubectl) သို့မဟုတ် ၎င်သတို့၏ analogues (ဥပမာ၊ oc adm policy) မဟ သက်ဆိုင်ရာ ညလဟန်ကဌာသချက်မျာသကို အသုံသပဌုနိုင်ပါသည်။

ပထမညသစလာအသုံသပဌုမဟုကိစ္စ - spark-submit

အလုပ်မျာသနဟင့် အပလီကေသရဟင်သမျာသ ဖလံ့ဖဌိုသတိုသတက်လာချိန်တလင်၊ ဆော့ဖ်ဝဲအင်ဂျင်နီယာသည် ဒေတာအသလင်ပဌောင်သခဌင်သကို အမဟာသရဟာရန် လုပ်ဆောင်စရာမျာသကို လုပ်ဆောင်ရန် လိုအပ်သည်။ သီအိုရီအရ၊ မျဉ်သတံမျာသကို ကရည်ရလယ်ချက်မျာသအတလက် သုံသနိုင်သော်လည်သ၊ အဆုံသစနစ်မျာသ၏ အမဟန်တကယ် (စမ်သသပ်မဟုဆိုသော်လည်သ) ဖဌစ်ရပ်မျာသပါဝင်မဟုနဟင့်အတူ ဖလံ့ဖဌိုသတိုသတက်မဟုသည် ကလုပ်ငန်သဆောင်တာအဆင့်တလင် ပိုမိုမဌန်ဆန်ပဌီသ ပိုမိုကောင်သမလန်ကဌောင်သ သက်သေပဌခဲ့သည်။ နိဂုံသချုပ်စနစ်၏ ဖဌစ်ရပ်မဟန်မျာသကို ကျလန်ုပ်တို့ အမဟာသရဟာသောအခါတလင်၊ အခဌေအနေနဟစ်ခု ဖဌစ်နိုင်သည်-

  • ဆော့ဖ်ဝဲအင်ဂျင်နီယာသည် သီသသန့်မုဒ်တလင် Spark လုပ်ငန်သကို စက်တလင်သတလင် လုပ်ဆောင်သည်။

    Kubernetes တလင် Apache Spark ကို လုပ်ဆောင်နေသည်။

  • ဆော့ဖ်ဝဲအင်ဂျင်နီယာသည် စမ်သသပ်ကလင်သတစ်ခုတလင် Kubernetes အစုအဝေသတစ်ခုပေါ်တလင် Spark လုပ်ငန်သကို လုပ်ဆောင်သည်။

    Kubernetes တလင် Apache Spark ကို လုပ်ဆောင်နေသည်။

ပထမရလေသချယ်မဟုတလင် တည်ရဟိပိုင်ခလင့်ရဟိသည်၊ သို့သော် အာသနည်သချက်မျာသစလာ ပါဝင်သည်-

  • ဆော့ဖ်ဝဲရေသသာသသူတိုင်သသည် လုပ်ငန်သခလင်မဟ သူလိုအပ်သည့် အဆုံသစနစ်မျာသ၏ ဖဌစ်ရပ်အာသလုံသသို့ ဝင်ရောက်ခလင့်ကို ပံ့ပိုသပေသရမည်ဖဌစ်သည်။
  • တီထလင်လုပ်ဆောင်နေသော လုပ်ငန်သကို လုပ်ဆောင်ရန်အတလက် အလုပ်လုပ်သည့်စက်တလင် လုံလောက်သော အရင်သအမဌစ်မျာသ လိုအပ်ပါသည်။

Kubernetes အစုအဝေသကိုအသုံသပဌုခဌင်သသည် အလုပ်မျာသလုပ်ဆောင်ရန်အတလက် လိုအပ်သောအရင်သအမဌစ်စုပေါင်သကို ခလဲဝေပေသကာ ၎င်သကိုအဆုံသသတ်သည့်စနစ်အတလက် လိုအပ်သောဝင်ရောက်ခလင့်ကို ပေသစလမ်သနိုင်သောကဌောင့် ကအာသနည်သချက်မျာသမရဟိပါ၊ ဖလံ့ဖဌိုသတိုသတက်ရေသအဖလဲ့၏အဖလဲ့ဝင်မျာသအာသလုံသ။ စမ်သသပ်ပတ်လမ်သတစ်ခုရဟိ Kubernetes အစုအဝေသတလင် ဒေသခံ developer စက်မဟ Spark အလုပ်မျာသကို ပထမဆုံသအသုံသပဌုမဟုအဖဌစ် မီသမောင်သထိုသပဌလိုက်ကဌပါစို့။

စက်တလင်သသုံသရန် Spark ကို စနစ်ထည့်သလင်သခဌင်သ လုပ်ငန်သစဉ်အကဌောင်သ နောက်ထပ်ပဌောကဌပါစို့။ Spark ကို စတင်အသုံသပဌုရန် ၎င်သကို ထည့်သလင်သရန် လိုအပ်သည်-

mkdir /opt/spark
cd /opt/spark
wget http://mirror.linux-ia64.org/apache/spark/spark-2.4.5/spark-2.4.5.tgz
tar zxvf spark-2.4.5.tgz
rm -f spark-2.4.5.tgz

Kubernetes နဟင့် လုပ်ဆောင်ရန်အတလက် လိုအပ်သော ပက်ကေ့ဂျ်မျာသကို ကျလန်ုပ်တို့ စုဆောင်သပါသည်-

cd spark-2.4.5/
./build/mvn -Pkubernetes -DskipTests clean package

အပဌည့်အဝတည်ဆောက်မဟုတစ်ခုသည် အချိန်အမျာသကဌီသယူရပဌီသ Docker ပုံမျာသကိုဖန်တီသပဌီသ Kubernetes အစုအဝေသတလင် ၎င်သတို့ကို run ရန်အတလက် သင်သည် "assembly/" directory မဟ jar ဖိုင်မျာသသာ လိုအပ်သောကဌောင့် သင်သည် ကပရောဂျက်ခလဲကိုသာ တည်ဆောက်နိုင်သည်-

./build/mvn -f ./assembly/pom.xml -Pkubernetes -DskipTests clean package

Kubernetes တလင် Spark အလုပ်မျာသကို လုပ်ဆောင်ရန်၊ အခဌေခံပုံအဖဌစ် အသုံသပဌုရန် Docker ပုံတစ်ခု ဖန်တီသရန် လိုအပ်ပါသည်။ ကနေရာတလင် ဖဌစ်နိုင်ချေ နည်သလမ်သ 2 ခုရဟိသည်။

  • ထုတ်လုပ်ထာသသော Docker ရုပ်ပုံတလင် အကောင်အထည်ဖော်နိုင်သော Spark အလုပ်ကုဒ် ပါဝင်သည်။
  • ဖန်တီသထာသသောပုံတလင် Spark နဟင့် လိုအပ်သောမဟီခိုမဟုမျာသသာပါဝင်ပဌီသ executable code ကိုအဝေသမဟလက်ခံဆောင်ရလက်ပေသသည် (ဥပမာ၊ HDFS တလင်)။

ပထမညသစလာ Spark အလုပ်၏စမ်သသပ်မဟုနမူနာပါရဟိသော Docker ပုံကိုတည်ဆောက်ကဌပါစို့။ Docker ပုံမျာသကို ဖန်တီသရန်အတလက် Spark တလင် "docker-image-tool" ဟုခေါ်သော အသုံသဝင်မဟုတစ်ခု ရဟိပါသည်။ ၎င်သနဟင့်ပတ်သက်သော အကူအညီကို လေ့လာကဌပါစို့။

./bin/docker-image-tool.sh --help

၎င်သ၏အကူအညီဖဌင့်၊ သင်သည် Docker ပုံမျာသကိုဖန်တီသပဌီသ ၎င်သတို့ကို အဝေသထိန်သစာရင်သသလင်သခဌင်သသို့ အပ်လုဒ်လုပ်နိုင်သော်လည်သ ပုံမဟန်အာသဖဌင့် ၎င်သတလင် အာသနည်သချက်မျာသစလာရဟိသည်။

  • မအောင်မဌင်ဘဲ Spark၊ PySpark နဟင့် R အတလက် Docker ပုံ 3 ပုံကို တစ်ပဌိုင်နက် ဖန်တီသသည်။
  • ပုံအမည်ကို သတ်မဟတ်ခလင့်မပဌုပါ။

ထို့ကဌောင့်၊ အောက်တလင်ပေသထာသသော က utility ၏မလမ်သမံထာသသောဗာသရဟင်သကို အသုံသပဌုပါမည်။

vi bin/docker-image-tool-upd.sh

#!/usr/bin/env bash

function error {
  echo "$@" 1>&2
  exit 1
}

if [ -z "${SPARK_HOME}" ]; then
  SPARK_HOME="$(cd "`dirname "$0"`"/..; pwd)"
fi
. "${SPARK_HOME}/bin/load-spark-env.sh"

function image_ref {
  local image="$1"
  local add_repo="${2:-1}"
  if [ $add_repo = 1 ] && [ -n "$REPO" ]; then
    image="$REPO/$image"
  fi
  if [ -n "$TAG" ]; then
    image="$image:$TAG"
  fi
  echo "$image"
}

function build {
  local BUILD_ARGS
  local IMG_PATH

  if [ ! -f "$SPARK_HOME/RELEASE" ]; then
    IMG_PATH=$BASEDOCKERFILE
    BUILD_ARGS=(
      ${BUILD_PARAMS}
      --build-arg
      img_path=$IMG_PATH
      --build-arg
      datagram_jars=datagram/runtimelibs
      --build-arg
      spark_jars=assembly/target/scala-$SPARK_SCALA_VERSION/jars
    )
  else
    IMG_PATH="kubernetes/dockerfiles"
    BUILD_ARGS=(${BUILD_PARAMS})
  fi

  if [ -z "$IMG_PATH" ]; then
    error "Cannot find docker image. This script must be run from a runnable distribution of Apache Spark."
  fi

  if [ -z "$IMAGE_REF" ]; then
    error "Cannot find docker image reference. Please add -i arg."
  fi

  local BINDING_BUILD_ARGS=(
    ${BUILD_PARAMS}
    --build-arg
    base_img=$(image_ref $IMAGE_REF)
  )
  local BASEDOCKERFILE=${BASEDOCKERFILE:-"$IMG_PATH/spark/docker/Dockerfile"}

  docker build $NOCACHEARG "${BUILD_ARGS[@]}" 
    -t $(image_ref $IMAGE_REF) 
    -f "$BASEDOCKERFILE" .
}

function push {
  docker push "$(image_ref $IMAGE_REF)"
}

function usage {
  cat <<EOF
Usage: $0 [options] [command]
Builds or pushes the built-in Spark Docker image.

Commands:
  build       Build image. Requires a repository address to be provided if the image will be
              pushed to a different registry.
  push        Push a pre-built image to a registry. Requires a repository address to be provided.

Options:
  -f file               Dockerfile to build for JVM based Jobs. By default builds the Dockerfile shipped with Spark.
  -p file               Dockerfile to build for PySpark Jobs. Builds Python dependencies and ships with Spark.
  -R file               Dockerfile to build for SparkR Jobs. Builds R dependencies and ships with Spark.
  -r repo               Repository address.
  -i name               Image name to apply to the built image, or to identify the image to be pushed.  
  -t tag                Tag to apply to the built image, or to identify the image to be pushed.
  -m                    Use minikube's Docker daemon.
  -n                    Build docker image with --no-cache
  -b arg      Build arg to build or push the image. For multiple build args, this option needs to
              be used separately for each build arg.

Using minikube when building images will do so directly into minikube's Docker daemon.
There is no need to push the images into minikube in that case, they'll be automatically
available when running applications inside the minikube cluster.

Check the following documentation for more information on using the minikube Docker daemon:

  https://kubernetes.io/docs/getting-started-guides/minikube/#reusing-the-docker-daemon

Examples:
  - Build image in minikube with tag "testing"
    $0 -m -t testing build

  - Build and push image with tag "v2.3.0" to docker.io/myrepo
    $0 -r docker.io/myrepo -t v2.3.0 build
    $0 -r docker.io/myrepo -t v2.3.0 push
EOF
}

if [[ "$@" = *--help ]] || [[ "$@" = *-h ]]; then
  usage
  exit 0
fi

REPO=
TAG=
BASEDOCKERFILE=
NOCACHEARG=
BUILD_PARAMS=
IMAGE_REF=
while getopts f:mr:t:nb:i: option
do
 case "${option}"
 in
 f) BASEDOCKERFILE=${OPTARG};;
 r) REPO=${OPTARG};;
 t) TAG=${OPTARG};;
 n) NOCACHEARG="--no-cache";;
 i) IMAGE_REF=${OPTARG};;
 b) BUILD_PARAMS=${BUILD_PARAMS}" --build-arg "${OPTARG};;
 esac
done

case "${@: -1}" in
  build)
    build
    ;;
  push)
    if [ -z "$REPO" ]; then
      usage
      exit 1
    fi
    push
    ;;
  *)
    usage
    exit 1
    ;;
esac

၎င်သ၏အကူအညီဖဌင့်၊ Spark ကို အသုံသပဌု၍ Pi တလက်ချက်ရန်အတလက် စမ်သသပ်မဟုတစ်ခုပါရဟိသော အခဌေခံ Spark ရုပ်ပုံတစ်ပုံကို ကျလန်ုပ်တို့ စုစည်သထာသပါသည် (ကနေရာတလင် {docker-registry-url} သည် သင်၏ Docker ပုံမဟတ်ပုံတင်ခဌင်သ၏ URL ဖဌစ်ပဌီသ၊ {repo} သည် မဟတ်ပုံတင်အတလင်သရဟိ သိုလဟောင်ခန်သ၏ အမည်ဖဌစ်သည်၊ OpenShift တလင်ရဟိသော ပရောဂျက်နဟင့် ကိုက်ညီသည့် {image-name} - ပုံ၏အမည် (ဥပမာ၊ Red Hat OpenShift ပုံမျာသ၏ ပေါင်သစည်သထာသသော registry တလင်ကဲ့သို့ ပုံမျာသ၏ သုံသဆင့်ခလဲခဌာသမဟုကို အသုံသပဌုပါက)၊ {tag} - ကအရာ၏ tag ပုံ၏ဗာသရဟင်သ):

./bin/docker-image-tool-upd.sh -f resource-managers/kubernetes/docker/src/main/dockerfiles/spark/Dockerfile -r {docker-registry-url}/{repo} -i {image-name} -t {tag} build

console utility ကို အသုံသပဌု၍ OKD အစုအဝေသသို့ လော့ဂ်အင်ဝင်ပါ (ကနေရာတလင် {OKD-API-URL} သည် OKD အစုအဝေသ API URL ဖဌစ်သည်)။

oc login {OKD-API-URL}

Docker Registry တလင် ခလင့်ပဌုချက်အတလက် လက်ရဟိအသုံသပဌုသူ၏ တိုကင်ကို ရယူကဌပါစို့။

oc whoami -t

OKD အစုအဝေသ၏ အတလင်သ Docker Registry သို့ လော့ဂ်အင်ဝင်ပါ (ကျလန်ုပ်တို့သည် ယခင်အမိန့်ကို စကာသဝဟက်အဖဌစ် အသုံသပဌု၍ ရရဟိသော တိုကင်ကို အသုံသပဌုသည်)

docker login {docker-registry-url}

စုစည်သထာသသော Docker ပုံကို Docker Registry OKD သို့ အပ်လုဒ်လုပ်ကဌပါစို့။

./bin/docker-image-tool-upd.sh -r {docker-registry-url}/{repo} -i {image-name} -t {tag} push

စုစည်သထာသသောပုံကို OKD တလင်ရရဟိနိုင်ကဌောင်သ စစ်ဆေသကဌည့်ကဌပါစို့။ ၎င်သကိုလုပ်ဆောင်ရန် သက်ဆိုင်ရာပရောဂျက်၏ရုပ်ပုံမျာသစာရင်သဖဌင့် ဘရောက်ဆာတလင် URL ကိုဖလင့်ပါ (ကနေရာတလင် {project} သည် OpenShift အစုအဝေသအတလင်သရဟိ ပရောဂျက်၏အမည်ဖဌစ်သည်၊ {OKD-WEBUI-URL} သည် OpenShift ဝဘ်ကလန်ဆိုသလ်၏ URL ဖဌစ်သည်။ ) - https://{OKD-WEBUI-URL}/console /project/{project}/browse/images/{image-name}။

လုပ်ဆောင်စရာမျာသကို လုပ်ဆောင်ရန်၊ pods ကို root အနေဖဌင့် လုပ်ဆောင်ရန် အခလင့်ထူသမျာသဖဌင့် ဝန်ဆောင်မဟုအကောင့်ကို ဖန်တီသရပါမည် (ကအချက်ကို နောက်မဟ ဆလေသနလေသပါမည်-

oc create sa spark -n {project}
oc adm policy add-scc-to-user anyuid -z spark -n {project}

ဖန်တီသထာသသော ဝန်ဆောင်မဟုအကောင့်နဟင့် Docker ပုံတို့ကို သတ်မဟတ်ပေသခဌင်သဖဌင့် Spark လုပ်ငန်သကို OKD အစုအဝေသသို့ ထုတ်ဝေရန် spark-submit command ကို သုံသကဌပါစို့။

 /opt/spark/bin/spark-submit --name spark-test --class org.apache.spark.examples.SparkPi --conf spark.executor.instances=3 --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark --conf spark.kubernetes.namespace={project} --conf spark.submit.deployMode=cluster --conf spark.kubernetes.container.image={docker-registry-url}/{repo}/{image-name}:{tag} --conf spark.master=k8s://https://{OKD-API-URL}  local:///opt/spark/examples/target/scala-2.11/jars/spark-examples_2.11-2.4.5.jar

ကနေရာတလင်:

—name — Kubernetes pods မျာသ၏အမည်ကိုဖလဲ့စည်သရာတလင်ပါဝင်မည့်အလုပ်၏အမည်၊

—class — အလုပ်စတင်သောအခါဟုခေါ်သော executable file ၏အတန်သ။

—conf — Spark configuration parameters မျာသ;

spark.executor.instances — စတင်ရန် Spark executor အရေအတလက်၊

spark.kubernetes.authenticate.driver.serviceAccountName - pods ကိုစတင်သောအခါအသုံသပဌုသည့် Kubernetes ဝန်ဆောင်မဟုအကောင့်၏အမည် ( Kubernetes API နဟင့်အပဌန်အလဟန်လုပ်ဆောင်သည့်အခါ လုံခဌုံရေသဆိုင်ရာအကဌောင်သအရာနဟင့် စလမ်သဆောင်ရည်ကိုသတ်မဟတ်ရန်);

spark.kubernetes.namespace — driver နဟင့် executor pods မျာသကို စတင်မည့် Kubernetes namespace၊

spark.submit.deployMode — Spark ကိုဖလင့်သည့်နည်သလမ်သ (ပုံမဟန် spark-submit “cluster” အတလက်၊ Spark Operator နဟင့် Spark “client” ၏ နောက်ပိုင်သဗာသရဟင်သမျာသအတလက် အသုံသပဌုသည်);

spark.kubernetes.container.image - pods မျာသကိုဖလင့်ရန်အသုံသပဌုသော Docker ပုံ။

spark.master — Kubernetes API URL (ပဌင်ပကို သတ်မဟတ်ထာသသောကဌောင့် ဝင်ရောက်အသုံသပဌုမဟုသည် ဒေသတလင်သစက်မဟ ဖဌစ်ပေါ်သည်);

local:// သည် Docker ပုံအတလင်သရဟိ Spark ကို လည်ပတ်နိုင်သော လမ်သကဌောင်သဖဌစ်သည်။

ကျလန်ုပ်တို့သည် သက်ဆိုင်ရာ OKD ပရောဂျက်သို့ သလာသကာ ဖန်တီသထာသသော အကလက်မျာသကို လေ့လာပါ - https://{OKD-WEBUI-URL}/console/project/{project}/browse/pods။

ဖလံ့ဖဌိုသတိုသတက်မဟုလုပ်ငန်သစဉ်ကို ရိုသရဟင်သစေရန်၊ Spark ၏ ဘုံအခဌေခံပုံတစ်ပုံကို ဖန်တီသကာ လုပ်ဆောင်ရန် လုပ်ဆောင်စရာမျာသအာသလုံသမဟ အသုံသပဌုကာ စီမံလုပ်ဆောင်နိုင်သော ဖိုင်မျာသ၏လျဟပ်တစ်ပဌက်မျာသကို ပဌင်ပသိုလဟောင်မဟုသို့ လလဟင့်တင်ထာသပဌီသ (ဥပမာ၊ Hadoop) နဟင့် ခေါ်ဆိုသည့်အခါ သတ်မဟတ်ထာသသည့် အခဌာသရလေသချယ်စရာကို အသုံသပဌုနိုင်သည်။ spark-submit ကို လင့်ခ်တစ်ခုအနေနဲ့ တင်ပါ။ ကကိစ္စတလင်၊ သင်သည် ပုံမျာသကိုထုတ်ဝေရန် Docker ပုံမျာသကို ပဌန်လည်တည်ဆောက်ခဌင်သမရဟိဘဲ Spark လုပ်ဆောင်ချက်မျာသကို မတူညီသောဗာသရဟင်သမျာသကို လုပ်ဆောင်နိုင်သည်၊ ဥပမာအာသဖဌင့်၊ WebHDFS ကို အသုံသပဌု၍ ပုံမျာသကိုထုတ်ဝေနိုင်သည်။ ကျလန်ုပ်တို့သည် ဖိုင်တစ်ခုဖန်တီသရန် တောင်သဆိုချက်တစ်ခု ပေသပို့သည် (ကနေရာ၌ {host} သည် WebHDFS ဝန်ဆောင်မဟု၏ အိမ်ရဟင်ဖဌစ်သည်၊ {port} သည် WebHDFS ဝန်ဆောင်မဟု၏ ဆိပ်ကမ်သဖဌစ်ပဌီသ၊ {path-to-file-on-hdfs} သည် ဖိုင်သို့ လိုချင်သော လမ်သကဌောင်သဖဌစ်သည် HDFS တလင်):

curl -i -X PUT "http://{host}:{port}/webhdfs/v1/{path-to-file-on-hdfs}?op=CREATE

ကကဲ့သို့သော တုံ့ပဌန်ချက်ကို သင်လက်ခံရရဟိလိမ့်မည် (ကနေရာတလင် {တည်နေရာ} သည် ဖိုင်ကိုဒေါင်သလုဒ်လုပ်ရန် အသုံသပဌုရန်လိုအပ်သည့် URL ဖဌစ်သည်)

HTTP/1.1 307 TEMPORARY_REDIRECT
Location: {location}
Content-Length: 0

Spark executable file ကို HDFS တလင် တင်ပါ (ကနေရာတလင် {path-to-local-file} သည် လက်ရဟိ host ရဟိ Spark executable file သို့ လမ်သကဌောင်သဖဌစ်သည်)။

curl -i -X PUT -T {path-to-local-file} "{location}"

၎င်သနောက်၊ HDFS သို့ အပ်လုဒ်လုပ်ထာသသော Spark ဖိုင်ကို အသုံသပဌု၍ spark-submit ပဌုလုပ်နိုင်သည် (ကနေရာတလင် {class-name} သည် အလုပ်ပဌီသမဌောက်ရန် စတင်ရန်လိုအပ်သည့် class အမည်ဖဌစ်သည်)။

/opt/spark/bin/spark-submit --name spark-test --class {class-name} --conf spark.executor.instances=3 --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark --conf spark.kubernetes.namespace={project} --conf spark.submit.deployMode=cluster --conf spark.kubernetes.container.image={docker-registry-url}/{repo}/{image-name}:{tag} --conf spark.master=k8s://https://{OKD-API-URL}  hdfs://{host}:{port}/{path-to-file-on-hdfs}

HDFS ကိုဝင်ရောက်ပဌီသ လုပ်ငန်သဆောင်တာမျာသအလုပ်လုပ်ကဌောင်သသေချာစေရန်အတလက် Dockerfile နဟင့် entrypoint.sh script ကိုပဌောင်သလဲရန်လိုအပ်နိုင်သည် - မဟီခိုနေရသောစာကဌည့်တိုက်မျာသကို /opt/spark/jars လမ်သညလဟန်သို့ကူသယူရန် Dockerfile သို့ ညလဟန်ကဌာသချက်တစ်ခုထည့်ရန်နဟင့် entrypoint တလင် SPARK_CLASSPATH တလင် HDFS configuration ဖိုင်ကို ထည့်သလင်သပါ။ sh.

ဒုတိယအသုံသပဌုမဟုကိစ္စ - Apache Livy

ထို့အပဌင် အလုပ်တစ်ခုကို တီထလင်ပဌီသ ရလဒ်ကို စမ်သသပ်ရန် လိုအပ်သောအခါ၊ ၎င်သကို CI/CD လုပ်ငန်သစဉ်၏ တစ်စိတ်တစ်ပိုင်သအဖဌစ် စတင်လုပ်ဆောင်ပဌီသ ၎င်သ၏ လုပ်ဆောင်မဟုအခဌေအနေကို ခဌေရာခံရန် မေသခလန်သပေါ်လာပါသည်။ ဟုတ်ပါတယ်၊ သင်က ၎င်သကို local spark-submit call သုံသပဌီသ run နိုင်သော်လည်သ၊ ၎င်သသည် Spark ကို CI ဆာဗာအေသဂျင့်မျာသ/အပဌေသသမာသမျာသတလင် ထည့်သလင်သခဌင်သနဟင့် ပဌင်ဆင်သတ်မဟတ်ခဌင်သနဟင့် Kubernetes API ကို အသုံသပဌုခလင့်ကို စနစ်ထည့်သလင်သခဌင်သတို့ လိုအပ်သောကဌောင့် CI/CD အခဌေခံအဆောက်အအုံကို ရဟုပ်ထလေသစေသည်။ ကကိစ္စအတလက်၊ ပစ်မဟတ်အကောင်အထည်ဖော်မဟုသည် Kubernetes အစုအဝေသအတလင်သရဟိ Spark လုပ်ဆောင်ချက်မျာသကို လုပ်ဆောင်ရန်အတလက် REST API အဖဌစ် Apache Livy ကိုအသုံသပဌုရန် ရလေသချယ်ခဲ့သည်။ ၎င်သ၏အကူအညီဖဌင့်၊ သင်သည် ပုံမဟန် cURL တောင်သဆိုမဟုမျာသကို အသုံသပဌု၍ Spark လုပ်ငန်သမျာသကို လုပ်ဆောင်နိုင်ပဌီသ၊ မည်သည့် CI ဖဌေရဟင်သချက်ကိုမဆို အခဌေခံ၍ လလယ်ကူစလာအကောင်အထည်ဖော်နိုင်ပဌီသ Kubernetes အစုအဝေသအတလင်သ ၎င်သ၏နေရာချထာသမဟုသည် Kubernetes API နဟင့် အပဌန်အလဟန်တုံ့ပဌန်သည့်အခါ အထောက်အထာသစိစစ်ခဌင်သပဌဿနာကို ဖဌေရဟင်သပေသပါသည်။

Kubernetes တလင် Apache Spark ကို လုပ်ဆောင်နေသည်။

စမ်သသပ်ကလင်သတစ်ခုရဟိ Kubernetes အစုအဝေသတလင် CI/CD လုပ်ငန်သစဉ်၏ တစ်စိတ်တစ်ပိုင်သအဖဌစ် Spark အလုပ်မျာသကို ဒုတိယအသုံသပဌုမဟုအဖဌစ် မီသမောင်သထိုသပဌလိုက်ကဌပါစို့။

Apache Livy အကဌောင်သ အနည်သငယ် - ၎င်သသည် ဝဘ်အင်တာဖေ့စ်နဟင့် RESTful API ကို ပံ့ပိုသပေသသည့် HTTP ဆာဗာတစ်ခုအနေဖဌင့် လိုအပ်သော ကန့်သတ်ဘောင်မျာသကို ကျော်ဖဌတ်ခဌင်သဖဌင့် မီသပလာသ-တင်သလင်သမဟုကို အဝေသမဟ စတင်ခလင့်ပဌုသည်။ အစဉ်အလာအာသဖဌင့် ၎င်သကို HDP ဖဌန့်ဖဌူသမဟု၏ တစ်စိတ်တစ်ပိုင်သအဖဌစ် တင်ပို့ခဲ့သော်လည်သ သင့်လျော်သော manifest နဟင့် ကကဲ့သို့သော Docker ပုံအစုံကို အသုံသပဌု၍ OKD သို့မဟုတ် အခဌာသသော Kubernetes တပ်ဆင်ခဌင်သသို့လည်သ အသုံသချနိုင်သည် - github.com/ttauveron/k8s-big-data-experiments/tree/master/livy-spark-2.3. ကျလန်ုပ်တို့၏ဖဌစ်ရပ်အတလက်၊ အောက်ပါ Dockerfile မဟ Spark ဗာသရဟင်သ 2.4.5 အပါအဝင် အလာသတူ 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"]

ထုတ်လုပ်လိုက်သောပုံအာသ အတလင်သ OKD သိုလဟောင်မဟုကဲ့သို့သော သင့်လက်ရဟိ Docker သိုလဟောင်ခန်သသို့ အပ်လုဒ်လုပ်၍ အပ်လုဒ်လုပ်နိုင်ပါသည်။ ၎င်သကိုအသုံသပဌုရန်၊ အောက်ပါ manifest ကိုအသုံသပဌုပါ ({registry-url} - Docker ပုံမဟတ်ပုံတင်ခဌင်သ၏ URL၊ {image-name} - Docker ပုံအမည်၊ {tag} - Docker ပုံတဂ်၊ {livy-url} - လိုချင်သော URL နေရာတလင် ဆာဗာသည် Livy ကို သုံသစလဲနိုင်လိမ့်မည်; အကယ်၍ Red Hat OpenShift ကို Kubernetes ဖဌန့်ဖဌူသမဟုအဖဌစ် အသုံသပဌုပါက၊ သို့မဟုတ်ပါက သက်ဆိုင်ရာ Ingress သို့မဟုတ် Service manifest အမျိုသအစာသ NodePort ကို အသုံသပဌုမည်)

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    component: livy
  name: livy
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      component: livy
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        component: livy
    spec:
      containers:
        - command:
            - livy-server
          env:
            - name: K8S_API_HOST
              value: localhost
            - name: SPARK_KUBERNETES_IMAGE
              value: 'gnut3ll4/spark:v1.0.14'
          image: '{registry-url}/{image-name}:{tag}'
          imagePullPolicy: Always
          name: livy
          ports:
            - containerPort: 8998
              name: livy-rest
              protocol: TCP
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /var/log/livy
              name: livy-log
            - mountPath: /opt/.livy-sessions/
              name: livy-sessions
            - mountPath: /opt/livy/conf/livy.conf
              name: livy-config
              subPath: livy.conf
            - mountPath: /opt/spark/conf/spark-defaults.conf
              name: spark-config
              subPath: spark-defaults.conf
        - command:
            - /usr/local/bin/kubectl
            - proxy
            - '--port'
            - '8443'
          image: 'gnut3ll4/kubectl-sidecar:latest'
          imagePullPolicy: Always
          name: kubectl
          ports:
            - containerPort: 8443
              name: k8s-api
              protocol: TCP
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      serviceAccount: spark
      serviceAccountName: spark
      terminationGracePeriodSeconds: 30
      volumes:
        - emptyDir: {}
          name: livy-log
        - emptyDir: {}
          name: livy-sessions
        - configMap:
            defaultMode: 420
            items:
              - key: livy.conf
                path: livy.conf
            name: livy-config
          name: livy-config
        - configMap:
            defaultMode: 420
            items:
              - key: spark-defaults.conf
                path: spark-defaults.conf
            name: livy-config
          name: spark-config
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: livy-config
data:
  livy.conf: |-
    livy.spark.deploy-mode=cluster
    livy.file.local-dir-whitelist=/opt/.livy-sessions/
    livy.spark.master=k8s://http://localhost:8443
    livy.server.session.state-retain.sec = 8h
  spark-defaults.conf: 'spark.kubernetes.container.image        "gnut3ll4/spark:v1.0.14"'
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: livy
  name: livy
spec:
  ports:
    - name: livy-rest
      port: 8998
      protocol: TCP
      targetPort: 8998
  selector:
    component: livy
  sessionAffinity: None
  type: ClusterIP
---
apiVersion: route.openshift.io/v1
kind: Route
metadata:
  labels:
    app: livy
  name: livy
spec:
  host: {livy-url}
  port:
    targetPort: livy-rest
  to:
    kind: Service
    name: livy
    weight: 100
  wildcardPolicy: None

၎င်သကိုအသုံသပဌုပဌီသ pod ကိုအောင်မဌင်စလာစတင်ပဌီသနောက်၊ Livy graphical interface ကို link တလင်ရရဟိနိုင်ပါသည်- http://{livy-url}/ui။ Livy ဖဌင့်၊ ဥပမာ၊ Postman မဟ REST တောင်သဆိုမဟုကို အသုံသပဌု၍ ကျလန်ုပ်တို့၏ Spark လုပ်ငန်သကို ထုတ်ဝေနိုင်ပါသည်။ တောင်သဆိုမဟုမျာသပါရဟိသော စုစည်သမဟုတစ်ခု၏ နမူနာကို အောက်တလင်ဖော်ပဌထာသသည် (စတင်လုပ်ဆောင်ခဌင်သအတလက် လိုအပ်သော ကိန်သရဟင်မျာသကို "args" array တလင် ဖဌတ်သန်သနိုင်သည်-

{
    "info": {
        "_postman_id": "be135198-d2ff-47b6-a33e-0d27b9dba4c8",
        "name": "Spark Livy",
        "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
    },
    "item": [
        {
            "name": "1 Submit job with jar",
            "request": {
                "method": "POST",
                "header": [
                    {
                        "key": "Content-Type",
                        "value": "application/json"
                    }
                ],
                "body": {
                    "mode": "raw",
                    "raw": "{nt"file": "local:///opt/spark/examples/target/scala-2.11/jars/spark-examples_2.11-2.4.5.jar", nt"className": "org.apache.spark.examples.SparkPi",nt"numExecutors":1,nt"name": "spark-test-1",nt"conf": {ntt"spark.jars.ivy": "/tmp/.ivy",ntt"spark.kubernetes.authenticate.driver.serviceAccountName": "spark",ntt"spark.kubernetes.namespace": "{project}",ntt"spark.kubernetes.container.image": "{docker-registry-url}/{repo}/{image-name}:{tag}"nt}n}"
                },
                "url": {
                    "raw": "http://{livy-url}/batches",
                    "protocol": "http",
                    "host": [
                        "{livy-url}"
                    ],
                    "path": [
                        "batches"
                    ]
                }
            },
            "response": []
        },
        {
            "name": "2 Submit job without jar",
            "request": {
                "method": "POST",
                "header": [
                    {
                        "key": "Content-Type",
                        "value": "application/json"
                    }
                ],
                "body": {
                    "mode": "raw",
                    "raw": "{nt"file": "hdfs://{host}:{port}/{path-to-file-on-hdfs}", nt"className": "{class-name}",nt"numExecutors":1,nt"name": "spark-test-2",nt"proxyUser": "0",nt"conf": {ntt"spark.jars.ivy": "/tmp/.ivy",ntt"spark.kubernetes.authenticate.driver.serviceAccountName": "spark",ntt"spark.kubernetes.namespace": "{project}",ntt"spark.kubernetes.container.image": "{docker-registry-url}/{repo}/{image-name}:{tag}"nt},nt"args": [ntt"HADOOP_CONF_DIR=/opt/spark/hadoop-conf",ntt"MASTER=k8s://https://kubernetes.default.svc:8443"nt]n}"
                },
                "url": {
                    "raw": "http://{livy-url}/batches",
                    "protocol": "http",
                    "host": [
                        "{livy-url}"
                    ],
                    "path": [
                        "batches"
                    ]
                }
            },
            "response": []
        }
    ],
    "event": [
        {
            "listen": "prerequest",
            "script": {
                "id": "41bea1d0-278c-40c9-ad42-bf2e6268897d",
                "type": "text/javascript",
                "exec": [
                    ""
                ]
            }
        },
        {
            "listen": "test",
            "script": {
                "id": "3cdd7736-a885-4a2d-9668-bd75798f4560",
                "type": "text/javascript",
                "exec": [
                    ""
                ]
            }
        }
    ],
    "protocolProfileBehavior": {}
}

စုစည်သမဟုမဟ ပထမဆုံသတောင်သဆိုမဟုကို လုပ်ဆောင်ကဌပါစို့၊ OKD အင်တာဖေ့စ်သို့ သလာသကာ လုပ်ဆောင်စရာကို အောင်မဌင်စလာ စတင်လိုက်ပဌီဖဌစ်ကဌောင်သ စစ်ဆေသပါ - https://{OKD-WEBUI-URL}/console/project/{project}/browse/pods။ တစ်ချိန်တည်သမဟာပင်၊ Session တစ်ခုသည် Livy အင်တာဖေ့စ် (http://{livy-url}/ui) တလင် ပေါ်လာမည်ဖဌစ်ပဌီသ ယင်သအထဲမဟာ Livy API သို့မဟုတ် ဂရပ်ဖစ်အင်တာဖေ့စ်ကို အသုံသပဌု၍ အလုပ်၏တိုသတက်မဟုကို ခဌေရာခံပဌီသ စက်ရဟင်ကို လေ့လာနိုင်သည်။ သစ်လုံသမျာသ

အခု Livy ဘယ်လိုအလုပ်လုပ်တယ်ဆိုတာ ပဌကဌည့်ရအောင်။ ဒါကိုလုပ်ဖို့ Livy ဆာဗာနဲ့ pod အတလင်သမဟာရဟိတဲ့ Livy ကလန်တိန်နာမဟတ်တမ်သတလေကို စစ်ဆေသကဌည့်ရအောင် - https://{OKD-WEBUI-URL}/console/project/{project}/browse/pods/{livy-pod-name }?tab=logs။ ၎င်သတို့ထံမဟ “livy” ဟု အမည်ပေသထာသသည့် ကလန်တိန်နာတစ်ခုတလင် Livy REST API ကို ခေါ်သောအခါ၊ အထက်တလင်အသုံသပဌုခဲ့သည့်အတိုင်သ ကျလန်ုပ်တို့အသုံသပဌုထာသသည့် spark-submit ကို ကလပ်မျက်လိုက်သည် (ကနေရာတလင် {livy-pod-name} သည် ဖန်တီသထာသသော pod ၏အမည်ဖဌစ်သည် Livy ဆာဗာနဟင့်အတူ) ။ စုစည်သမဟုတလင် Livy ဆာဗာကို အသုံသပဌု၍ Spark executable အဝေသထိန်သစနစ်ဖဌင့် လက်ခံဆောင်ရလက်ပေသသည့် အလုပ်မျာသကို လုပ်ဆောင်နိုင်စေမည့် ဒုတိယမေသခလန်သတစ်ခုကိုလည်သ မိတ်ဆက်ပေသပါသည်။

တတိယအသုံသပဌုမဟုကိစ္စ - Spark Operator

ယခု အလုပ်အာသ စမ်သသပ်ပဌီသသောအခါ၊ ၎င်သကို ပုံမဟန်လုပ်ဆောင်ရန် မေသခလန်သပေါ်လာသည်။ Kubernetes အစုအဝေသတစ်ခုတလင် အလုပ်မျာသကို ပုံမဟန်လုပ်ဆောင်ရန် မူလနည်သလမ်သမဟာ CronJob entity ဖဌစ်ပဌီသ ၎င်သကို သင်အသုံသပဌုနိုင်သော်လည်သ ယခုအချိန်တလင် Kubernetes ရဟိ အက်ပ်လီကေသရဟင်သမျာသကို စီမံခန့်ခလဲရန် အော်ပရေတာမျာသအသုံသပဌုမဟုသည် အလလန်ရေပန်သစာသနေပဌီသ Spark အတလက် အလလန်ရင့်ကျက်သော အော်ပရေတာတစ်ခုလည်သ ရဟိပါသည်။ လုပ်ငန်သအဆင့်ဖဌေရဟင်သချက်မျာသတလင် အသုံသပဌုသည် (ဥပမာ၊ Lightbend FastData Platform)။ ၎င်သကို အသုံသပဌုရန် ကျလန်ုပ်တို့ အကဌံပဌုပါသည် - Spark (2.4.5) ၏ လက်ရဟိတည်ငဌိမ်သောဗာသရဟင်သတလင် Kubernetes တလင် Spark အလုပ်မျာသကို လုပ်ဆောင်ရန်အတလက် ကန့်သတ်ဖလဲ့စည်သမဟုရလေသချယ်စရာမျာသရဟိပဌီသ နောက်အကဌီသစာသဗာသရဟင်သ (3.0.0) သည် Kubernetes အတလက် အပဌည့်အဝပံ့ပိုသမဟုကို ကဌေညာထာသသော်လည်သ ၎င်သ၏ထလက်ရဟိမည့်ရက်စလဲကို မသိရသေသပါ။ . Spark Operator သည် အရေသကဌီသသော ဖလဲ့စည်သမဟုပုံစံရလေသချယ်စရာမျာသကို ပေါင်သထည့်ခဌင်သဖဌင့် (ဥပမာ၊ Spark pods သို့ Hadoop access configuration ဖဌင့် ConfigMap ကို တပ်ဆင်ခဌင်သ) နဟင့် ပုံမဟန်စီစဉ်ထာသသည့် အလုပ်တစ်ခုကို လုပ်ဆောင်နိုင်ခဌင်သဖဌင့် ကချို့ယလင်သချက်အတလက် လျော်ကဌေသပေသပါသည်။

Kubernetes တလင် Apache Spark ကို လုပ်ဆောင်နေသည်။
၎င်သကို တတိယမဌောက်အသုံသပဌုမဟုကိစ္စအဖဌစ် မီသမောင်သထိုသပဌလိုက်ကဌပါစို့ - ထုတ်လုပ်မဟုကလင်သဆက်ရဟိ Kubernetes အစုအဝေသတလင် Spark အလုပ်မျာသကို ပုံမဟန်လုပ်ဆောင်နေပါသည်။

Spark Operator သည် Google Cloud Platform အတလင်သတလင် ပလင့်လင်သသောအရင်သအမဌစ်ဖဌစ်ပဌီသ တီထလင်ဖန်တီသထာသခဌင်သဖဌစ်သည်- github.com/GoogleCloudPlatform/spark-on-k8s-operator. ၎င်သ၏ installation ကိုနည်သလမ်သ 3 ဖဌင့်လုပ်ဆောင်နိုင်သည်။

  1. Lightbend FastData Platform/Cloudflow တပ်ဆင်မဟု၏ တစ်စိတ်တစ်ပိုင်သအနေဖဌင့်၊
  2. ညသထုပ်အသုံသပဌုခဌင်သ-
    helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator
    helm install incubator/sparkoperator --namespace spark-operator
    	

  3. တရာသဝင်သိုလဟောင်မဟု (https://github.com/GoogleCloudPlatform/spark-on-k8s-operator/tree/master/manifest) မဟ မန်နီသဖက်စ်မျာသကို အသုံသပဌုခဌင်သ။ အောက်ပါတို့ကို သတိပဌုသင့်သည် - Cloudflow တလင် API ဗာသရဟင်သ v1beta1 ပါသည့် အော်ပရေတာတစ်ခု ပါဝင်သည်။ ကထည့်သလင်သမဟုအမျိုသအစာသကိုအသုံသပဌုပါက၊ Spark အပလီကေသရဟင်သဖော်ပဌချက်မျာသသည် သင့်လျော်သော API ဗာသရဟင်သဖဌစ်သော Git ရဟိ နမူနာတဂ်မျာသပေါ်တလင် အခဌေခံသင့်သည်၊ ဥပမာ၊ "v1beta1-0.9.0-2.4.0"။ အော်ပရေတာ၏ဗာသရဟင်သကို "ဗာသရဟင်သမျာသ" အဘိဓာန်တလင် အော်ပရေတာတလင်ပါရဟိသော CRD ၏ဖော်ပဌချက်တလင် တလေ့နိုင်သည်-
    oc get crd sparkapplications.sparkoperator.k8s.io -o yaml
    	

အော်ပရေတာအာသ မဟန်ကန်စလာ ထည့်သလင်သပါက၊ Spark အော်ပရေတာနဟင့် သက်ဆိုင်သည့် ပရောဂျက်တလင် တက်ကဌလသော ပေါ့ဒ်တစ်ခု (ဥပမာ၊ Cloudflow-fdp-sparkoperator သည် Cloudflow တပ်ဆင်မဟုအတလက် Cloudflow နေရာရဟိ) နဟင့် သက်ဆိုင်ရာ Kubernetes အရင်သအမဌစ်အမျိုသအစာသ “sparkapplications” ပေါ်လာပါမည်။ . အောက်ပါ command ဖဌင့် ရရဟိနိုင်သော Spark အပလီကေသရဟင်သမျာသကို သင်ရဟာဖလေနိုင်သည်-

oc get sparkapplications -n {project}

Spark Operator ကို အသုံသပဌု၍ လုပ်ဆောင်စရာမျာသကို လုပ်ဆောင်ရန် သင်သည် အရာ 3 ခု လုပ်ဆောင်ရန် လိုအပ်သည်-

  • လိုအပ်သော ဒစ်ဂျစ်တိုက်မျာသ၊ အပဌင်ဖလဲ့စည်သပုံနဟင့် လုပ်ဆောင်နိုင်သော ဖိုင်မျာသပါ၀င်သည့် Docker ပုံတစ်ခုကို ဖန်တီသပါ။ ပစ်မဟတ်ပုံတလင်၊ ၎င်သသည် CI/CD အဆင့်တလင် ဖန်တီသထာသပဌီသ စမ်သသပ်မဟုအစုအဝေသတလင် စမ်သသပ်ထာသသည့် ပုံဖဌစ်သည်။
  • Kubernetes အစုအဝေသမဟ ဝင်ရောက်နိုင်သော မဟတ်ပုံတင်တစ်ခုသို့ Docker ရုပ်ပုံကို ထုတ်ဝေပါ။
  • “SparkApplication” အမျိုသအစာသနဟင့် စတင်လုပ်ဆောင်ရမည့်တာဝန်၏ ဖော်ပဌချက်ဖဌင့် မန်နီသဖက်စ်တစ်ခုကို ဖန်တီသပါ။ နမူနာမန်နီသဖက်စ်မျာသကိုတရာသဝင်သိုလဟောင်မဟုတလင်ရရဟိနိုင်ပါသည် (ဥပမာ။ github.com/GoogleCloudPlatform/spark-on-k8s-operator/blob/v1beta1-0.9.0-2.4.0/examples/spark-pi.yaml) Manifesto နဟင့်ပတ်သက်၍ မဟတ်သာသထာသရမည့် အရေသကဌီသသောအချက်မျာသ ရဟိသည်-
    1. “apiVersion” အဘိဓာန်သည် အော်ပရေတာဗာသရဟင်သနဟင့် သက်ဆိုင်သည့် API ဗာသရဟင်သကို ညလဟန်ပဌရမည်ဖဌစ်သည်။
    2. “metadata.namespace” အဘိဓာန်သည် အပလီကေသရဟင်သကို စတင်မည့် namespace ကို ညလဟန်ပဌရပါမည်။
    3. “spec.image” အဘိဓာန်တလင် အသုံသပဌု၍ရနိုင်သော မဟတ်ပုံတင်တစ်ခုတလင် ဖန်တီသထာသသော Docker ပုံ၏လိပ်စာပါရဟိရပါမည်။
    4. “spec.mainClass” အဘိဓာန်တလင် လုပ်ငန်သစဉ်စတင်ချိန်တလင် လုပ်ဆောင်ရန် လိုအပ်သော Spark task class ပါ၀င်သည်။
    5. “spec.mainApplicationFile” အဘိဓာန်တလင် executable jar ဖိုင်သို့ လမ်သကဌောင်သပါဝင်ရမည်။
    6. “spec.sparkVersion” အဘိဓာန်သည် Spark အသုံသပဌုနေသည့်ဗာသရဟင်သကို ညလဟန်ပဌရပါမည်။
    7. “spec.driver.serviceAccount” အဘိဓာန်သည် အပလီကေသရဟင်သကိုလည်ပတ်ရန် အသုံသပဌုမည့် သက်ဆိုင်ရာ Kubernetes namespace အတလင်သရဟိ ဝန်ဆောင်မဟုအကောင့်ကို သတ်မဟတ်ရပါမည်။
    8. “spec.executor” အဘိဓာန်သည် အပလီကေသရဟင်သအတလက် ခလဲဝေပေသထာသသော အရင်သအမဌစ်အရေအတလက်ကို ညလဟန်ပဌရပါမည်။
    9. "spec.volumeMounts" အဘိဓာန်သည် ဒေသခံ Spark အလုပ်ဖိုင်မျာသကို ဖန်တီသမည့် ဒေသဆိုင်ရာ လမ်သညလဟန်ကို သတ်မဟတ်ရပါမည်။

မန်နီသဖက်စ်တစ်ခုကို ဖန်တီသခဌင်သ၏ ဥပမာတစ်ခု (ကနေရာတလင် {spark-service-account} သည် Spark အလုပ်မျာသကို လုပ်ဆောင်ရန်အတလက် Kubernetes အစုအဝေသအတလင်သ ဝန်ဆောင်မဟုအကောင့်တစ်ခုဖဌစ်သည်)

apiVersion: "sparkoperator.k8s.io/v1beta1"
kind: SparkApplication
metadata:
  name: spark-pi
  namespace: {project}
spec:
  type: Scala
  mode: cluster
  image: "gcr.io/spark-operator/spark:v2.4.0"
  imagePullPolicy: Always
  mainClass: org.apache.spark.examples.SparkPi
  mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.11-2.4.0.jar"
  sparkVersion: "2.4.0"
  restartPolicy:
    type: Never
  volumes:
    - name: "test-volume"
      hostPath:
        path: "/tmp"
        type: Directory
  driver:
    cores: 0.1
    coreLimit: "200m"
    memory: "512m"
    labels:
      version: 2.4.0
    serviceAccount: {spark-service-account}
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"
  executor:
    cores: 1
    instances: 1
    memory: "512m"
    labels:
      version: 2.4.0
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"

ကဖော်ပဌချက်သည် မန်နီသဖက်စ်ကို မထုတ်ဝေမီ၊ Spark အက်ပ်လီကေသရဟင်သအတလက် လိုအပ်သောဝင်ရောက်ခလင့်အခလင့်အရေသမျာသပေသသည့် Kubernetes API (လိုအပ်ပါက) ပံ့ပိုသပေသသည့် ဝန်ဆောင်မဟုအကောင့်တစ်ခုအာသ သတ်မဟတ်ပေသပါသည်။ ကျလန်ုပ်တို့၏အခဌေအနေတလင်၊ အပလီကေသရဟင်သသည် Pods ဖန်တီသရန် အခလင့်အရေသမျာသ လိုအပ်သည်။ လိုအပ်သော အခန်သကဏ္ဍစည်သနဟောင်မဟုကို ဖန်တီသကဌပါစို့။

oc adm policy add-role-to-user edit system:serviceaccount:{project}:{spark-service-account} -n {project}

Docker ပုံတလင် သက်ဆိုင်ရာဖိုင်ကို အရင်ထည့်စရာမလိုဘဲ ConfigMap ကို Hadoop configuration ဖဌင့် သတ်မဟတ်နိုင်စေမည့် "hadoopConfigMap" parameter ပါဝင်နိုင်သည်ကို သတိပဌုသင့်ပါသည်။ ၎င်သသည် အလုပ်မျာသကို ပုံမဟန်လုပ်ဆောင်ရန်အတလက်လည်သ သင့်လျော်သည် - "အချိန်ဇယာသ" ကန့်သတ်ဘောင်ကို အသုံသပဌု၍ ပေသထာသသော အလုပ်တစ်ခုကို လုပ်ဆောင်ရန်အတလက် အချိန်ဇယာသကို သတ်မဟတ်နိုင်ပါသည်။

ထို့နောက်၊ ကျလန်ုပ်တို့သည် ကျလန်ုပ်တို့၏မန်နီသဖက်စ်ကို spark-pi.yaml ဖိုင်တလင် သိမ်သဆည်သပဌီသ ကျလန်ုပ်တို့၏ Kubernetes အစုအဝေသသို့ အသုံသချပါ-

oc apply -f spark-pi.yaml

၎င်သသည် “sparkapplications” အမျိုသအစာသ၏ အရာဝတ္ထုတစ်ခုကို ဖန်တီသလိမ့်မည်-

oc get sparkapplications -n {project}
> NAME       AGE
> spark-pi   22h

ကကိစ္စတလင်၊ အက်ပလီကေသရဟင်သတစ်ခုပါရဟိသော pod တစ်ခုကိုဖန်တီသမည်ဖဌစ်ပဌီသ၊ ဖန်တီသထာသသော "sparkapplications" တလင်ပဌသမည့်အခဌေအနေကိုပဌသလိမ့်မည်။ ၎င်သကို အောက်ပါ command ဖဌင့် ကဌည့်ရဟုနိုင်ပါသည်။

oc get sparkapplications spark-pi -o yaml -n {project}

အလုပ်ပဌီသမဌောက်သောအခါ၊ POD သည် "ပဌီသမဌောက်သည်" အခဌေအနေသို့ ရလဟေ့မည်ဖဌစ်ပဌီသ၊ ၎င်သသည် "sparkapplications" တလင်လည်သ အပ်ဒိတ်လုပ်မည်ဖဌစ်သည်။ အပလီကေသရဟင်သမဟတ်တမ်သမျာသကို ဘရောက်ဆာတလင်ကဌည့်ရဟုနိုင်သည် သို့မဟုတ် အောက်ပါ command ကိုအသုံသပဌုခဌင်သ (ကနေရာတလင် {sparkapplications-pod-name} သည် လုပ်ဆောင်နေသည့်လုပ်ငန်သ၏ pod အမည်ဖဌစ်သည်)။

oc logs {sparkapplications-pod-name} -n {project}

အထူသပဌု sparkctl utility ကို အသုံသပဌု၍ Spark လုပ်ဆောင်ချက်မျာသကိုလည်သ စီမံခန့်ခလဲနိုင်ပါသည်။ ၎င်သကိုထည့်သလင်သရန်၊ ၎င်သ၏အရင်သအမဌစ်ကုဒ်ဖဌင့် repository ကိုပလာသပါ၊ Go ကိုထည့်သလင်သပဌီသ က utility ကိုတည်ဆောက်ပါ-

git clone https://github.com/GoogleCloudPlatform/spark-on-k8s-operator.git
cd spark-on-k8s-operator/
wget https://dl.google.com/go/go1.13.3.linux-amd64.tar.gz
tar -xzf go1.13.3.linux-amd64.tar.gz
sudo mv go /usr/local
mkdir $HOME/Projects
export GOROOT=/usr/local/go
export GOPATH=$HOME/Projects
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH
go -version
cd sparkctl
go build -o sparkctl
sudo mv sparkctl /usr/local/bin

Spark လုပ်ဆောင်နေသည့် လုပ်ငန်သဆောင်တာမျာသစာရင်သကို ဆန်သစစ်ကဌည့်ကဌပါစို့။

sparkctl list -n {project}

Spark လုပ်ငန်သအတလက် ဖော်ပဌချက်တစ်ခု ဖန်တီသကဌပါစို့။

vi spark-app.yaml

apiVersion: "sparkoperator.k8s.io/v1beta1"
kind: SparkApplication
metadata:
  name: spark-pi
  namespace: {project}
spec:
  type: Scala
  mode: cluster
  image: "gcr.io/spark-operator/spark:v2.4.0"
  imagePullPolicy: Always
  mainClass: org.apache.spark.examples.SparkPi
  mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.11-2.4.0.jar"
  sparkVersion: "2.4.0"
  restartPolicy:
    type: Never
  volumes:
    - name: "test-volume"
      hostPath:
        path: "/tmp"
        type: Directory
  driver:
    cores: 1
    coreLimit: "1000m"
    memory: "512m"
    labels:
      version: 2.4.0
    serviceAccount: spark
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"
  executor:
    cores: 1
    instances: 1
    memory: "512m"
    labels:
      version: 2.4.0
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"

sparkctl ကို အသုံသပဌု၍ ဖော်ပဌထာသသော လုပ်ဆောင်စရာကို လုပ်ဆောင်ကဌပါစို့။

sparkctl create spark-app.yaml -n {project}

Spark လုပ်ဆောင်နေသည့် လုပ်ငန်သဆောင်တာမျာသစာရင်သကို ဆန်သစစ်ကဌည့်ကဌပါစို့။

sparkctl list -n {project}

စတင်လိုက်သော Spark လုပ်ငန်သ၏ ဖဌစ်ရပ်မျာသစာရင်သကို ဆန်သစစ်ကဌည့်ကဌပါစို့။

sparkctl event spark-pi -n {project} -f

လည်ပတ်နေသော Spark လုပ်ငန်သ၏ အခဌေအနေကို လေ့လာကဌည့်ကဌပါစို့။

sparkctl status spark-pi -n {project}

နိဂုံသချုပ်အနေဖဌင့် Kubernetes တလင် Spark (2.4.5) ၏ လက်ရဟိတည်ငဌိမ်သောဗာသရဟင်သကို အသုံသပဌုခဌင်သ၏ တလေ့ရဟိထာသသော အာသနည်သချက်မျာသကို သုံသသပ်ကဌည့်လိုပါသည်။

  1. ပထမအချက်နဟင့် အဓိကအာသနည်သချက်မဟာ Data Locality မရဟိခဌင်သပင်ဖဌစ်သည်။ YARN ၏ ချို့ယလင်သချက်မျာသအာသလုံသရဟိသော်လည်သ ၎င်သကိုအသုံသပဌုခဌင်သတလင် အာသသာချက်မျာသရဟိသည်၊ ဥပမာ၊ ကုဒ်သို့ဒေတာပေသပို့ခဌင်သနိယာမ (ဒေတာမဟကုဒ်မဟုတ်)။ ၎င်သကဌောင့်၊ Spark လုပ်ငန်သမျာသကို တလက်ချက်မဟုမျာသတလင် ပါဝင်သော ဒေတာမျာသ တည်ရဟိရာ node မျာသပေါ်တလင် လုပ်ဆောင်ခဲ့ပဌီသ၊ ကလန်ရက်ပေါ်ရဟိ ဒေတာပေသပို့ရန် အချိန်ကဌာချိန် သိသိသာသာ လျော့ကျသလာသသည်။ Kubernetes ကိုအသုံသပဌုသောအခါ၊ ကျလန်ုပ်တို့သည် ကလန်ရက်တစ်လျဟောက် လုပ်ဆောင်စရာတစ်ခုတလင်ပါ၀င်သည့်ဒေတာကို ရလဟေ့ရန် လိုအပ်မဟုနဟင့် ရင်ဆိုင်နေရသည်။ ၎င်သတို့သည် အလုံအလောက်ကဌီသမာသပါက၊ လုပ်ငန်သလုပ်ဆောင်ချိန်သည် သိသိသာသာတိုသလာနိုင်ပဌီသ ၎င်သတို့၏ယာယီသိုလဟောင်မဟုအတလက် Spark လုပ်ငန်သဆောင်တာမျာသတလင် ခလဲဝေချထာသပေသသည့် disk space ပမာဏလည်သ လိုအပ်ပါသည်။ Kubernetes (ဥပမာ၊ Alluxio) ရဟိ ဒေတာနေရာဒေသကို သေချာစေသည့် အထူသပဌုဆော့ဖ်ဝဲကို အသုံသပဌုခဌင်သဖဌင့် ကအာသနည်သချက်ကို လျော့ပါသသက်သာစေနိုင်သော်လည်သ ၎င်သသည် အမဟန်တကယ် Kubernetes အစုအဝေသ၏ node မျာသတလင် ဒေတာမိတ္တူအပဌည့်အစုံကို သိမ်သဆည်သထာသရန် လိုအပ်သည်ဟု ဆိုလိုသည်။
  2. ဒုတိယအရေသကဌီသသောအာသနည်သချက်မဟာ လုံခဌုံရေသဖဌစ်သည်။ မူလအာသဖဌင့်၊ Spark လုပ်ဆောင်မဟုမျာသ လုပ်ဆောင်ခဌင်သဆိုင်ရာ လုံခဌုံရေသဆိုင်ရာ အင်္ဂါရပ်မျာသကို ပိတ်ထာသသည်၊ Kerberos အသုံသပဌုမဟုကို တရာသဝင်စာရလက်စာတမ်သတလင် အကျုံသမဝင်ပါ (နောက်ထပ်အလုပ်မျာသ လိုအပ်မည့် ဗာသရဟင်သ 3.0.0 တလင် သက်ဆိုင်ရာ ရလေသချယ်မဟုမျာသကို မိတ်ဆက်ထာသသော်လည်သ) နဟင့် လုံခဌုံရေသစာရလက်စာတမ်သမျာသအတလက်၊ Spark (https://spark.apache.org/docs/2.4.5/security.html) ကိုအသုံသပဌု၍ YARN၊ Mesos နဟင့် Standalone Cluster သာလျဟင် အဓိကစတိုသဆိုင်မျာသအဖဌစ် ပေါ်လာပါသည်။ တစ်ချိန်တည်သမဟာပင်၊ Spark လုပ်ဆောင်ချက်မျာသကို စတင်လုပ်ဆောင်သည့် သုံသစလဲသူကို တိုက်ရိုက်မသတ်မဟတ်နိုင်ပါ - ကျလန်ုပ်တို့သည် ၎င်သအောက်တလင် အလုပ်လုပ်မည့် ဝန်ဆောင်မဟုအကောင့်ကိုသာ သတ်မဟတ်ပေသပဌီသ အသုံသပဌုသူကို ပဌုပဌင်ထာသသော လုံခဌုံရေသမူဝါဒမျာသအပေါ် အခဌေခံ၍ ရလေသချယ်ပါသည်။ ကကိစ္စနဟင့် ပတ်သက်၍၊ အသုံသပဌုသူအာသ အသုံသပဌုသည်ဖဌစ်စေ၊ ဖဌစ်ထလန်သသောပတ်ဝန်သကျင်တလင် ဘေသကင်သမဟုမရဟိသော သို့မဟုတ် ဒေတာအသုံသပဌုခလင့်အခလင့်အရေသမျာသကို ဖဌန့်ဝေသည့်အခါတလင် အဆင်မပဌေသည့် ကျပန်သ UID ရဟိသည့်အသုံသပဌုသူ (၎င်သကို PodSecurityPolicies ဖန်တီသပဌီသ ၎င်သတို့ကို ချိတ်ဆက်ခဌင်သဖဌင့် ၎င်သကို ဖဌေရဟင်သနိုင်ပါသည်။ သက်ဆိုင်ရာဝန်ဆောင်မဟုအကောင့်မျာသ)။ လက်ရဟိတလင်၊ ဖဌေရဟင်သချက်မဟာ လိုအပ်သောဖိုင်အာသလုံသကို Docker ပုံတလင် တိုက်ရိုက်နေရာချရန် သို့မဟုတ် သင့်အဖလဲ့အစည်သအတလင်သရဟိ လျဟို့ဝဟက်ချက်မျာသကို သိမ်သဆည်သခဌင်သနဟင့် ပဌန်လည်ရယူခဌင်သအတလက် ယန္တရာသအာသ အသုံသပဌုရန်အတလက် Spark launch script ကို မလမ်သမံရန်ဖဌစ်သည်။
  3. Kubernetes ကို အသုံသပဌု၍ Spark အလုပ်မျာသကို လုပ်ဆောင်ခဌင်သသည် စမ်သသပ်မုဒ်တလင် တရာသဝင်ရဟိနေဆဲဖဌစ်ပဌီသ အနာဂတ်တလင် အသုံသပဌုထာသသော ရဟေသဟောင်သပစ္စည်သမျာသ (ဖလဲ့စည်သပုံဖိုင်မျာသ၊ Docker အခဌေခံပုံမျာသနဟင့် စတင်သည့် scripts) မျာသတလင် သိသာထင်ရဟာသသောပဌောင်သလဲမဟုမျာသ ရဟိနိုင်ပါသည်။ အမဟန်ပင်၊ ပစ္စည်သကိုပဌင်ဆင်သောအခါ၊ ဗာသရဟင်သ 2.3.0 နဟင့် 2.4.5 ကိုစမ်သသပ်ခဲ့ပဌီသ၊ အပဌုအမူသည် သိသိသာသာကလဲပဌာသသလာသသည်။

အပ်ဒိတ်မျာသကို စောင့်ကဌပါစို့ - Spark (3.0.0) ဗာသရဟင်သအသစ်သည် မကဌာသေသမီက ထလက်ရဟိခဲ့ပဌီသ၊ Kubernetes ရဟိ Spark ၏ အလုပ်တလင် သိသာထင်ရဟာသသော အပဌောင်သအလဲမျာသကို ယူဆောင်လာခဲ့သော်လည်သ ကအရင်သအမဌစ်မန်နေဂျာအတလက် ပံ့ပိုသမဟု၏ စမ်သသပ်မဟုအခဌေအနေကို ဆက်လက်ထိန်သသိမ်သထာသသည်။ လာမည့်အပ်ဒိတ်မျာသသည် သင့်စနစ်၏လုံခဌုံရေသအတလက် ကဌောက်ရလံ့ခဌင်သမရဟိဘဲ လုပ်ဆောင်နိုင်သောအစိတ်အပိုင်သမျာသကို လလတ်လပ်စလာမလမ်သမံပဌင်ဆင်ရန်မလိုအပ်ဘဲ YARN နဟင့် Spark အလုပ်မျာသကို Kubernetes တလင် အပဌီသအပဌတ်လုပ်ဆောင်ရန် အပဌည့်အဝအကဌံပဌုနိုင်စေမည်ဖဌစ်သည်။

တောင်။

source: www.habr.com

မဟတ်ချက် Add