由于 Spot 是一项可中断的服务,如果我们可以移动或重用中间 shuffle 文件,就可以提高作业的整体稳定性和 SLA。
EMR on EKS
集成了Spark的特性来实现此功能。 在本节,我们将使用Fault Injection Simulator(FIS)
模拟Spot中断并检查spark作业运行状态。
进入FIS页面,创建新的实验模板:
添加Action:
编辑Target:
根据标签来寻找Target:
在Service Access
部分,创建一个新的role:
最后点击创建:
检查node:
kubectl get node --show-labels | grep capacityType
现在集群有一个on demand机器,一个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"
}}]
}'
在FIS页面上,点击start experiment
:
在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被创建出来 ;pod在执行时也有一个被终止,后面有新的被创建出来:
在EMR控制台上,也能看到即使有机器中断,任务最终也执行完成了: