首页 > 解决方案 > AWS EMR 多作业依赖争用

问题描述

问题

我正在尝试在 EMR 中运行 2 个 pyspark 步骤,这两个步骤都使用 KinesisUtils 从 Kinesis 读取。这需要依赖库 spark-streaming-kinesis-asl_2.11。

我正在使用 Terraform 建立 EMR 集群并使用 args 调用这些步骤:

--packages org.apache.spark:spark-streaming-kinesis-asl_2.11:2.4.5

从 maven 下载 jar 并导致校验和失败的两个步骤在启动时似乎存在争用。

尝试的事情

  1. 我尝试使用以下方法将 jar 的下载移动到引导 bash 脚本:

sudo spark-shell --packages org.apache.spark:spark-streaming-kinesis-asl_2.11:2.4.5

这会导致问题,因为 spark-shell 仅在主节点上可用,并且引导程序尝试在所有节点上运行。

  1. 我试图将上述内容限制为仅在 master 上运行

grep-q'"isMaster":true'/mnt/var/lib/info/instance.json ||{echo "不在主节点上运行,无事可做" && exit 0;}

那似乎没有用。

  1. 我尝试在 EMR configuration.json 中添加 spark 配置来执行此操作

    {

    "分类": "spark-defaults",

    “特性”: {

    "spark.jars.packages": "org.apache.spark:spark-streaming-kinesis-asl_2.11:2.4.5"
    

    }

    }

这也不起作用,似乎停止了将所有 jar 复制到主节点目录

/home/hadoop/.ivy2/cache

手动工作的是登录到主节点并运行

sudo spark-shell --packages org.apache.spark:spark-streaming-kinesis-asl_2.11:2.4.5

然后在没有 --packages 选项的情况下手动提交作业。

目前,我需要做的就是单独手动启动失败的作业(AWS 控制台中的克隆步骤),一切运行正常。

我只是希望能够在所有步骤成功启动的情况下启动集群,任何帮助将不胜感激。

标签: apache-sparkhadooppysparkamazon-emramazon-kinesis

解决方案


  1. 下载所需的 jar 并上传到 s3。(一次)
  2. 从 step 运行您的 pyspark 作业时,传入--jars <s3 location of jar>您的 spark-submit

推荐阅读