文件访问错误在kubernetes上运行spark

时间:2018-05-22 23:40:32

标签: apache-spark kubernetes openshift

我跟着Spark on Kubernetes blog但是达到了运行作业的程度,但是在工作箱中失败并出现文件访问错误。

2018-05-22 22:20:51 WARN  TaskSetManager:66 - Lost task 0.0 in stage 0.0 (TID 0, 172.17.0.15, executor 3): java.nio.file.AccessDeniedException: ./spark-examples_2.11-2.3.0.jar
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
at sun.nio.fs.UnixCopyFile.copyFile(UnixCopyFile.java:243)
at sun.nio.fs.UnixCopyFile.copy(UnixCopyFile.java:581)
at sun.nio.fs.UnixFileSystemProvider.copy(UnixFileSystemProvider.java:253)
at java.nio.file.Files.copy(Files.java:1274)
at org.apache.spark.util.Utils$.org$apache$spark$util$Utils$$copyRecursive(Utils.scala:632)
at org.apache.spark.util.Utils$.copyFile(Utils.scala:603)
at org.apache.spark.util.Utils$.fetchFile(Utils.scala:478)
at org.apache.spark.executor.Executor$$anonfun$org$apache$spark$executor$Executor$$updateDependencies$5.apply(Executor.scala:755)
at org.apache.spark.executor.Executor$$anonfun$org$apache$spark$executor$Executor$$updateDependencies$5.apply(Executor.scala:747)
at scala.collection.TraversableLike$WithFilter$$anonfun$foreach$1.apply(TraversableLike.scala:733)
at scala.collection.mutable.HashMap$$anonfun$foreach$1.apply(HashMap.scala:99)
at scala.collection.mutable.HashMap$$anonfun$foreach$1.apply(HashMap.scala:99)
at scala.collection.mutable.HashTable$class.foreachEntry(HashTable.scala:230)
at scala.collection.mutable.HashMap.foreachEntry(HashMap.scala:40)
at scala.collection.mutable.HashMap.foreach(HashMap.scala:99)
at scala.collection.TraversableLike$WithFilter.foreach(TraversableLike.scala:732)
at org.apache.spark.executor.Executor.org$apache$spark$executor$Executor$$updateDependencies(Executor.scala:747)
at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)

我用来运行SparkPi示例的命令是:

$DIR/$SPARKVERSION/bin/spark-submit \
--master=k8s://https://192.168.99.101:8443 \
--deploy-mode=cluster \
--conf spark.executor.instances=3 \
--name spark-pi  \
--class org.apache.spark.examples.SparkPi \
--conf spark.kubernetes.container.image=172.30.1.1:5000/myapp/spark-docker:latest \
--conf spark.kubernetes.namespace=$namespace \
--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
--conf spark.kubernetes.driver.pod.name=spark-pi-driver \
 local:///opt/spark/examples/jars/spark-examples_2.11-2.3.0.jar

在处理代码时,似乎将spark jar文件复制到容器内的内部位置。但是:

  1. 如果发生这种情况,因为它们是本地的并且已经存在
  2. 如果确实需要复制到容器中的其他位置,如何使容器的这部分可写,因为它是由主节点创建的。
  3. RBAC的设置如下:(oc get rolebinding -n myapp

    NAME                     ROLE                    USERS       GROUPS                         SERVICE ACCOUNTS   SUBJECTS
    admin                    /admin                  developer                                                     
    spark-role               /edit                                                              spark         
    

    服务帐户(oc get sa -n myapp

    NAME       SECRETS   AGE
    builder    2         18d
    default    2         18d
    deployer   2         18d
    pusher     2         13d
    spark      2         12d
    

    或者我在这里做些蠢事?

    我的kubernetes系统在Docker Machine中运行(通过osx上的virtualbox) 我正在使用:

    • openshift v3.9.0 + d0f9aed-12
    • kubernetes v1.9.1 + a0ce1bc657

    解决这个问题的任何提示都非常感激?

1 个答案:

答案 0 :(得分:0)

我知道这是一本距旧500万的帖子,但看来与此问题相关的信息不足,所以我发布我的答案,以防它对某人有所帮助。

您似乎没有以root用户身份在容器内运行进程,如果是这种情况,可以查看此链接(https://github.com/minishift/minishift/issues/2836)。

由于您似乎也在使用openshift,因此可以执行以下操作:

oc adm policy add-scc-to-user anyuid -z spark-sa -n spark

就我而言,我使用的是kubernetes,我需要使用 runAsUser:XX 。因此,我授予了组对容器内的/ opt / spark的读/写访问权限,从而解决了该问题,只需将以下行添加到 resource-managers / kubernetes / docker / src / main / dockerfiles / spark / Dockerfile。 / em>

RUN chmod g+rwx -R /opt/spark

当然,您必须手动或使用提供的脚本(如下所示)重新构建docker映像。

./bin/docker-image-tool.sh -r YOUR_REPO  -t YOUR_TAG build
./bin/docker-image-tool.sh -r YOUR_REPO -t YOUR_TAG  push