使用kubernetes处理spark 2.3中spark-submit的远程依赖项

时间:2018-03-08 12:24:26

标签: apache-spark amazon-s3 kubernetes

我试图使用spark 2.3 docker container image

运行spark-submit到kubernetes集群

我面临的挑战是应用程序有一个mainapplication.jar和其他依赖文件&像AWS s3一样位于远程位置的jar,但根据spark 2.3文档,有一些名为kubernetes init-container的东西可以下载远程依赖项,但在这种情况下我不会创建任何Podspec来在kubernetes中包含init-containers,根据文档Spark 2.3 spark / kubernetes在内部创建Pods(驱动程序,执行程序)因此,当有远程依赖项时,我不知道如何使用init-container进行spark-submit。

https://spark.apache.org/docs/latest/running-on-kubernetes.html#using-remote-dependencies

请建议

2 个答案:

答案 0 :(得分:2)

它与s3a://网址一样工作。不幸的是,使s3a在股票spark-hadoop2.7.3上运行是有问题的(主要是身份验证),所以我选择使用Hadoop 2.9.1构建Spark,因为S3A已经在那里取得了长足的发展

我已经创建了gist并包含了

所需的步骤
  • 使用新的hadoop依赖项构建火花
  • 为k8s构建docker镜像
  • 将图片推送到ECR

该脚本还创建了第二个docker映像,其中添加了S3A依赖项,并使用了基本conf设置来使用IAM凭据启用S3A,因此在AWS上运行不需要将访问/密钥保存在conf文件/ args中

我还没有使用图像运行任何生产Spark作业,但是已经测试了基本的保存和加载到s3a url的确可行。

我尚未尝试使用S3Guard来使用DynamoDB来确保S3写入/读取保持一致-与EMRFS类似

答案 1 :(得分:0)

Spark会自动为您创建Init容器。

例如,您可以使用

  

kubectl描述pod [你的驱动程序svc的名字]   并且您将看到名为spark-init的Init容器。

您还可以通过以下命令从init-container访问日志:

  

kubectl logs [你的驱动程序svc的名字] -c spark-init

警告:我没有在AWS中运行,而是使用自定义K8S。我的init-container成功运行了来自HTTP服务器的下载依赖项(但不是S3,奇怪的是)。