我应该将 jar 放在 dataproc 集群上的什么位置,以便 gcloud dataproc 作业提交 Spark



我有一个初始化脚本,可以从我们的本地工件存储库下载.jar并将其放入群集上每个节点的/usr/local/bin中。我可以使用

gcloud dataproc jobs submit spark --cluster=my_cluster 
--region=us-central1 --jar=file:///usr/local/bin/myjar.jar -- arg1 arg2

但是,如果我的最终用户不必知道罐子的位置,我更喜欢它。

我可以将.jar放在哪里,以便不必指定它的位置?

对于 Spark 作业,您应该能够将 jarfile 放在所有节点上的/usr/lib/spark/jars中,以便在类路径上自动可用。

为了获得更一般的覆盖范围,您可以将jar添加到/usr/lib/hadoop/lib;hadoop lib目录也自动包含在Dataproc上的Spark作业中,并且是GCS连接器jarfile等库所在的位置。您可以通过/etc/spark/conf/spark-env.sh中配置的SPARK_DIST_CLASSPATH环境变量看到包含的 hadoop lib 目录。

如果所需的行为仍然是使用--jar标志指定"主 jar"而不是--jars指定仅提供类的库 jar,不幸的是,集群上目前没有"工作目录"的概念,只允许指定"主 jar"的相对(而不是绝对(路径。但是,有两种方法具有类似的行为:

  1. 将 jarfile 设置为从中提交作业的用户工作区的本地 - 然后 gcloud 会在作业提交时将 jarfile 上传到 GCS,并在作业在特定于作业的目录中运行时将作业指向 jarfile。请注意,这会导致每次作业运行时将 jarfile 重复上传到 GCS,因为它始终暂存到唯一的作业目录中;您稍后必须gcloud dataproc jobs delete清理这些jar文件使用的GCS空间
  2. (首选方法(:使用--class而不是--jar参数来指定在执行上述步骤后要运行的作业,以使 jar 已在 Spark 类路径中可用。虽然类名的调用有点冗长,但它仍然实现了向用户隐藏 jarfile 位置详细信息的目标。

例如,用于"spark-shell"实现的类已经在类路径上,所以如果你想运行一个scala文件,就像你通过spark-shell运行它一样,你可以运行:

gcloud dataproc jobs submit spark --cluster my-cluster 
--class org.apache.spark.repl.Main 
-- -i myjob.scala

相关内容

最新更新