gpt4 book ai didi

apache-spark - 本地提交 Spark 作业(2.3)到 Kubernetes 时如何使用本地 Docker 镜像?

转载 作者:行者123 更新时间:2023-12-04 05:09:36 25 4
gpt4 key购买 nike

我正在尝试使用 Apache Spark 2.3 在 Kubernetes 上本地提交 Spark 作业。
当我在 Docker Hub(用于 Spark 2.2)上使用 Docker 镜像时,它可以工作:

bin/spark-submit \
--master k8s://http://localhost:8080 \
--deploy-mode cluster \
--name spark-pi \
--class org.apache.spark.examples.SparkPi \
--conf spark.executor.instances=5 \
--conf spark.kubernetes.container.image=kubespark/spark-driver:v2.2.0-kubernetes-0.5.0 \
local:///home/fedora/spark-2.3.0-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.3.0.jar

但是,当我尝试构建本地 Docker 镜像时,
sudo docker build -t spark:2.3 -f kubernetes/dockerfiles/spark/Dockerfile .

并将作业提交为:
bin/spark-submit \
--master k8s://http://localhost:8080 \
--deploy-mode cluster \
--name spark-pi \
--class org.apache.spark.examples.SparkPi \
--conf spark.executor.instances=5 \
--conf spark.kubernetes.container.image=spark:2.3 \
local:///home/fedora/spark-2.3.0-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.3.0.jar

我收到以下错误; 即“未找到存储库 docker.io/spark:不存在或没有拉取访问权限,原因=ErrImagePull,additionalProperties={})”
status: [ContainerStatus(containerID=null, image=spark:2.3, imageID=, lastState=ContainerState(running=null, terminated=null, waiting=null, additionalProperties={}), name=spark-kubernetes-driver, ready=false, restartCount=0, state=ContainerState(running=null, terminated=null, waiting=ContainerStateWaiting(message=rpc error: code = 2 desc = repository docker.io/spark not found: does not exist or no pull access, reason=ErrImagePull, additionalProperties={}), additionalProperties={}), additionalProperties={})]
2018-03-15 11:09:54 INFO LoggingPodStatusWatcherImpl:54 - State changed, new state:
pod name: spark-pi-3a1a6e8ce615395fa7df81eac06d58ed-driver
namespace: default
labels: spark-app-selector -> spark-8d9fdaba274a4eb69e28e2a242fe86ca, spark-role -> driver
pod uid: 5271602b-2841-11e8-a78e-fa163ed09d5f
creation time: 2018-03-15T11:09:25Z
service account name: default
volumes: default-token-v4vhk
node name: mlaas-p4k3djw4nsca-minion-1
start time: 2018-03-15T11:09:25Z
container images: spark:2.3
phase: Pending
status: [ContainerStatus(containerID=null, image=spark:2.3, imageID=, lastState=ContainerState(running=null, terminated=null, waiting=null, additionalProperties={}), name=spark-kubernetes-driver, ready=false, restartCount=0, state=ContainerState(running=null, terminated=null, waiting=ContainerStateWaiting(message=Back-off pulling image "spark:2.3", reason=ImagePullBackOff, additionalProperties={}), additionalProperties={}), additionalProperties={})]

此外,我尝试运行本地 Docker 注册表,如下所述:
https://docs.docker.com/registry/deploying/#run-a-local-registry
docker run -d -p 5000:5000 --restart=always --name registry registry:2

sudo docker tag spark:2.3 localhost:5000/spark:2.3

sudo docker push localhost:5000/spark:2.3

我可以成功地做到这一点:
docker 拉本地主机:5000/ Spark :2.3

但是,当我提交 Spark 作业时:
bin/spark-submit \
--master k8s://http://localhost:8080 \
--deploy-mode cluster \
--name spark-pi \
--class org.apache.spark.examples.SparkPi \
--conf spark.executor.instances=5 \
--conf spark.kubernetes.container.image=localhost:5000/spark:2.3 \
local:///home/fedora/spark-2.3.0-bin-hadoop2.7/examples/jars/spark-examples_2.11-2.3.0.jar

我再次得到 ErrImagePull:
status: [ContainerStatus(containerID=null, image=localhost:5000/spark:2.3, imageID=, lastState=ContainerState(running=null, terminated=null, waiting=null, additionalProperties={}), name=spark-kubernetes-driver, ready=false, restartCount=0, state=ContainerState(running=null, terminated=null, waiting=ContainerStateWaiting(message=rpc error: code = 2 desc = Error while pulling image: Get http://localhost:5000/v1/repositories/spark/images: dial tcp [::1]:5000: getsockopt: connection refused, reason=ErrImagePull, additionalProperties={}), additionalProperties={}), additionalProperties={})]

在将作业本地提交到 Kubernetes 时,Spark 2.3 中是否可以使用本地 Docker 镜像?

先感谢您。

最佳答案

我猜你使用类似 minikube 的东西用于设置本地 Kubernetes 集群,在大多数情况下,它使用虚拟机来生成集群。
所以,当 Kubernetes 试图从 localhost 拉取图像时地址,它连接到虚拟机本地地址,而不是您的计算机地址。此外,您的本地注册表仅在 localhost 上绑定(bind),无法从虚拟机访问。

修复的想法是使您的 Kubernetes 可以访问您的本地 docker 注册表,并允许从本地不安全的注册表中提取图像。

因此,首先,将您 PC 上的 docker 注册表绑定(bind)到所有接口(interface):
docker run -d -p 0.0.0.0:5000:5000 --restart=always --name registry registry:2
然后,检查您的 PC 的本地 IP 地址。它将类似于 172.X.X.X 或 10.X.X.X。检查的方式取决于您的操作系统,所以如果您不知道如何获取它,只需用谷歌搜索即可。

之后,使用附加选项启动您的 minikube:
minikube start --insecure-registry="<your-local-ip-address>:5000" ,其中 'your-local-ip-address' 是您的本地 IP 地址。

现在您可以尝试使用注册表的新地址运行 spark 作业,并且 K8s 已经能够下载您的图像:
spark.kubernetes.container.image=<your-local-ip-address>:5000/spark:2.3

关于apache-spark - 本地提交 Spark 作业(2.3)到 Kubernetes 时如何使用本地 Docker 镜像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49298345/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com