我应该把 jar 放在 dataproc 集群的什么地方,以便 gcloud dataproc jobs submit spark 可以使用它们?

Where should I put jars on a dataproc cluster so they can be used by gcloud dataproc jobs submit 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 的位置,我会更喜欢它。

我可以把 .jar 放在哪里,这样就不必指定它的位置了?

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

为了获得更广泛的覆盖,您可以将您的罐子添加到 /usr/lib/hadoop/lib; hadoop lib 目录也自动包含在 Dataproc 上的 Spark 作业中,并且是 GCS 连接器 jarfile 等库所在的位置。您可以看到通过 /etc/spark/conf/spark-env.sh.

中配置的 SPARK_DIST_CLASSPATH 环境变量包含了 hadoop lib 目录

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

  1. 使 jarfile 成为用户工作的本地文件space 从中提交作业 - gcloud 将在作业提交时将 jarfile 上传到 GCS 并在 [=42] 时将作业指向 jarfile =]s 在特定于作业的目录中。请注意,这会导致每次作业 运行s 时将 jarfile 重复上传到 GCS,因为它总是暂存到一个唯一的作业目录中;您稍后必须 gcloud dataproc jobs delete 清理那些 jarfiles
  2. 使用的 GCS space
  3. (首选方法):在执行上述步骤后使用 --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