簡體   English   中英

如何在 Kubernetes 上讀取 spark-submit 上傳的文件

[英]How to read files uploaded by spark-submit on Kubernetes

我在 Yarn 上運行 Spark Jobs。 這些天我在 Kubernetes 上搬到 Spark。

在 Kubernetes 上,我遇到了一個問題:通過--files上傳的文件無法被 Spark 驅動程序讀取。

在 Yarn 上,如許多答案中所述,我可以使用Source.fromFile(filename)讀取這些文件。

但我無法在 Kubernetes 上讀取 Spark 中的文件。

  • 火花版本:3.0.1
  • Scala 版本:2.12.6
  • 部署模式:集群
  • 提交命令
    $ spark-submit --class <className> \ --name=<jobName> \ --master=k8s://https://api-hostname:6443 \... --deploy-mode=cluster \ --files app.conf \ --conf spark.kubernetes.file.upload.path=hdfs://<nameservice>/path/to/sparkUploads/ \ app.jar

執行上述命令后, app.conf被上傳到hdfs://<nameservice>/path/to/sparkUploads/spark-upload-xxxxxxx/

在 Driver 的 pod 中,我在/tmp/spark-******/目錄下找到了app.conf ,還有app.jar

但是 Driver 無法讀取app.confSource.fromFile(filename)返回null ,沒有權限問題。

更新 1

在 Spark Web UI->“環境”選項卡中,“類路徑條目”菜單中spark://<pod-name>-svc.ni.svc:7078/files/app.conf 這是否意味着app.conf在類路徑中可用?

另一方面,在 Spark on Yarn 中, user.dir屬性包含在 System 類路徑中。


我發現SPARK-31726: Make spark.files available in driver with cluster deploy mode on kubernetes

更新 2

我發現驅動程序 pod 的/opt/spark/work-dir/目錄包含在類路徑中。

但是/opt/spark/work-dir/在驅動程序 pod 上是空的,而在執行程序 pod 上它包含app.confapp.jar

我認為這就是問題所在, SPARK-31726對此進行了描述。

更新 3

在閱讀了 Jacek 的回答后,我測試org.apache.spark.SparkFiles.getRootDirectory()

它返回/var/data/spark-357eb33e-1c17-4ad4-b1e8-6f878b1d8253/spark-e07d7e84-0fa7-410e-b0da-7219c412afa3/userFiles-59084588-f7f6-4ba2-a3a3-9997a780af24

更新 4 - 變通

  • 首先,我制作 ConfigMaps 來保存我想讀取驅動程序/執行程序的文件
  • 接下來,將 ConfigMap 安裝在驅動程序/執行程序上。 要掛載 ConfigMap,請使用Pod 模板Spark Operator

--files文件應使用SparkFiles.get實用程序訪問:

獲取(文件名:字符串):字符串

獲取通過SparkContext.addFile()添加的文件的絕對路徑。

我在 spark 3.3.0 中找到了另一個臨時解決方案

我們可以使用標志--archives 沒有tartar.gzzip的文件將被忽略解包步驟,然后將它們放在驅動程序和執行程序的工作目錄中。

雖然--archive的文檔沒有提到執行者,但我測試過並且它正在工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM