[英]How to read files uploaded by spark-submit on Kubernetes
我在 Yarn 上運行 Spark Jobs。 這些天我在 Kubernetes 上搬到 Spark。
在 Kubernetes 上,我遇到了一個問題:通過--files
上傳的文件無法被 Spark 驅動程序讀取。
在 Yarn 上,如許多答案中所述,我可以使用Source.fromFile(filename)
讀取這些文件。
但我無法在 Kubernetes 上讀取 Spark 中的文件。
$ 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.conf
, Source.fromFile(filename)
返回null
,沒有權限問題。
在 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
我發現驅動程序 pod 的/opt/spark/work-dir/
目錄包含在類路徑中。
但是/opt/spark/work-dir/
在驅動程序 pod 上是空的,而在執行程序 pod 上它包含app.conf
和app.jar
。
我認為這就是問題所在, SPARK-31726對此進行了描述。
在閱讀了 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
--files
文件應使用SparkFiles.get實用程序訪問:
獲取(文件名:字符串):字符串
獲取通過
SparkContext.addFile()
添加的文件的絕對路徑。
我在 spark 3.3.0 中找到了另一個臨時解決方案
我們可以使用標志--archives
。 沒有tar
、 tar.gz
、 zip
的文件將被忽略解包步驟,然后將它們放在驅動程序和執行程序的工作目錄中。
雖然--archive
的文檔沒有提到執行者,但我測試過並且它正在工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.