如何在独立模式下更轻松地将Jar部署到Spark Cluster?

hak*_*ami 9 jar apache-spark

我有一个包含3台机器的小型集群,以及另一台用于开发和测试的机器.在开发时,我设置SparkContextlocal.当一切正常时,我想将我构建的Jar文件部署到每个节点.基本上我手动将此jar移动到群集并复制到群集共享的HDFS.然后我可以将代码更改为:

//standalone mode
val sc = new SparkContext(
     "spark://mymaster:7077", 
     "Simple App", 
     "/opt/spark-0.9.1-bin-cdh4",   //spark home
     List("hdfs://namenode:8020/runnableJars/SimplyApp.jar") //jar location
) 
Run Code Online (Sandbox Code Playgroud)

在我的IDE中运行它.我的问题:有没有办法更容易将此jar移动到群集?

maa*_*asg 24

在Spark中,创建SparkContext的程序称为"驱动程序".将作业的jar文件提供给驱动程序的本地文件系统就足够了,以便将其提取并将其发送给主/工作人员.

具体来说,您的配置将如下所示:

//favor using Spark Conf to configure your Spark Context
val conf = new SparkConf()
             .setMaster("spark://mymaster:7077")
             .setAppName("SimpleApp")
             .set("spark.local.ip", "172.17.0.1")
             .setJars(Array("/local/dir/SimplyApp.jar"))

val sc = new SparkContext(conf)
Run Code Online (Sandbox Code Playgroud)

在引擎盖下,驱动程序将启动一个服务器,工作人员将从驱动程序下载jar文件.因此,工作人员可以通过网络访问驱动程序,这一点很重要(通常也是一个问题).这通常可以通过在可从工作人员访问/路由的网络中的驱动程序上设置'spark.local.ip'来确保.

  • 你也可以使用`SparkContext.jarOfClass(this.getClass)`而不是硬编码`Array("/ local/dir/SimplyApp.jar")`. (4认同)
  • @samthebest该方法确定从中加载所提供的类的jar并且对依赖项工作正常,但可能不适用于IDE中不会从JAR加载的驱动程序类.最简单的方法是使用Maven Shade或SBT程序集构建一个uberjar,并将其作为唯一依赖项. (2认同)
  • 只是FWIW这个答案取决于接受--deploy-mode的默认设置,即客户端,如果你使用--deploy-mode cluster,那么你不知道驱动程序将在哪个工作节点上运行,因此你需要根据高级依赖管理,所有工作人员都可以看到这些罐子,无论如何它都是一个好主意,因为它可以减少网络流量.http://spark.apache.org/docs/latest/submitting-applications.html#advanced-dependency-management.此外,由于主人不处理代码,而且只是在Spark中调用代码"应用程序",因此罐子不会运送到主服务器 (2认同)