[英]scala code works on spark-shell but not in spark-submit
[英]How can I run uncompiled Spark Scala/spark-shell code as a Dataproc job?
通常,如果我將 Scala 用於 Spark 作業,我將編譯一個 jarfile 並使用gcloud dataproc jobs submit spark
提交它,但有時對於非常輕量級的作業,我可能會在筆記本中使用未編譯的 Scala 代碼或使用spark-shell
REPL ,我假設 SparkContext 已經可用。
對於其中一些輕量級用例,我可以等效地使用 PySpark 並使用gcloud dataproc jobs submit pyspark
但有時我需要更輕松地訪問 Scala/Java 庫,例如直接在 map 函數內創建org.apache.hadoop.fs.FileSystem
對象. 是否有任何簡單的方法可以使用 Dataproc 作業 API 直接從命令行提交此類“spark-shell”等效作業?
目前,對於未編譯的 Spark Scala 沒有專門的頂級 Dataproc 作業類型,但在幕后, spark-shell
只是使用與spark-submit
相同的機制來運行專門的 REPL 驅動程序: org.apache.spark.repl.Main
。 因此,將此與gcloud dataproc jobs submit spark
可用的--files
標志相結合,您只需編寫可能在spark-shell
或筆記本會話中測試過的 Scala 片段,然后將其作為整個 Dataproc 作業運行,假設job.scala
是您機器上的本地文件:
gcloud dataproc jobs submit spark --cluster ${CLUSTER} \
--class org.apache.spark.repl.Main \
--files job.scala \
-- -i job.scala
就像任何其他文件一樣,您也可以在--files
參數中指定任何與 Hadoop 兼容的路徑,例如gs://
甚至hdfs://
,假設您已經將job.scala
文件放在那里:
gcloud dataproc jobs submit spark --cluster ${CLUSTER} \
--class org.apache.spark.repl.Main \
--files gs://${BUCKET}/job.scala \
-- -i job.scala
gcloud dataproc jobs submit spark --cluster ${CLUSTER} \
--class org.apache.spark.repl.Main \
--files hdfs:///tmp/job.scala \
-- -i job.scala
如果您已通過 init 操作將作業文件暫存到 Dataproc 主節點上,則可以使用file:///
指定在集群的本地文件系統上找到該文件,而不是在運行 gcloud 的本地文件系統上找到:
gcloud dataproc jobs submit spark --cluster ${CLUSTER} \
--class org.apache.spark.repl.Main \
--files file:///tmp/job.scala \
-- -i job.scala
請注意,在所有情況下,該文件都將成為主驅動程序作業工作目錄中的本地文件,因此“-i”的參數可以只是文件名的相對路徑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.