EKS上的spot中断

由于 Spot 是一项可中断的服务,如果我们可以移动或重用中间 shuffle 文件,就可以提高作业的整体稳定性和 SLA。

EMR on EKS 集成了Spark的特性来实现此功能。 在本节,我们将使用Fault Injection Simulator(FIS)模拟Spot中断并检查spark作业运行状态。

创建FIS 模板

进入FIS页面,创建新的实验模板:

image-20231030202436533

添加Action:

FIS

编辑Target:

FIS

根据标签来寻找Target:

FIS

Service Access部分,创建一个新的role:

FIS

最后点击创建:

image-20231030202954539

提交任务到spot机器

检查node:

kubectl get node --show-labels | grep capacityType

现在集群有一个on demand机器,一个spot机器:

Spot

提交Spark任务到spot机器上跑:

aws emr-containers start-job-run \
  --virtual-cluster-id=$VIRTUAL_CLUSTER_ID \
  --name=pi-2 \
  --execution-role-arn=$EMR_ROLE_ARN \
  --release-label=emr-6.9.0-latest \
  --job-driver='{
    "sparkSubmitJobDriver": {
      "entryPoint": "local:///usr/lib/spark/examples/src/main/python/pi.py",
      "entryPointArguments": ["1000"],
      "sparkSubmitParameters": "--conf spark.executor.instances=2 --conf spark.executor.memory=2G --conf spark.executor.cores=1 --conf spark.driver.cores=1"                             
    }}' \
  --configuration-overrides '{
    "applicationConfiguration": [
      {
        "classification": "spark-defaults", 
        "properties": {
          "spark.kubernetes.node.selector.eks.amazonaws.com/nodegroup": "etl-spot"
      }}]
    }'

触发Spot中断

在FIS页面上,点击start experiment

image-20231031110258609

在cloud 9控制台上,查看pod的状态:

watch kubectl get pod -n emr

新创建另一个页面,查看node的状态:

watch kubectl get node --label-columns=app,topology.kubernetes.io/zone,node.kubernetes.io/instance-type,eks.amazonaws.com/nodegroup

Spot

我们看到一个spot机器被终止,新的spot被创建出来 ;pod在执行时也有一个被终止,后面有新的被创建出来:

Spot

在EMR控制台上,也能看到即使有机器中断,任务最终也执行完成了:

image-20231031111507768