【问题标题】:Executing Multiple scala Object using single Spark-submit使用单个 Spark-submit 执行多个 scala 对象
【发布时间】:2020-03-28 07:25:58
【问题描述】:

您好,已经使用 Eclipse 创建了一个 Maven 项目(spark/scala)并在该项目中有 4 个 scala 对象(1st_layer.scala,2nd_layer.scala,3rd_layer.scala,4th_layer.scala)。我已经生成了我的项目 jar(/ home/test/Demo2-0.0.1-SNAPSHOT.jar)。现在我想使用 spark submit 命令运行这些所有层。

    spark-submit --master local[*]  --class com.pkg.data.1st_layer  /home/test /Demo2-0.0.1-SNAPSHOT.jar

您能否给我一个提示,我如何使用单火花提交传递所有类(1st_layer、2nd_layer、3rd_layer、4th_layer)。 注意(所有层都是依赖的(dataload,transform..etc)。

示例层代码:

object Layer1 {
  def main(args: Array[String]) {
    //created spark session
    var a1 = sparksession.sql(" loadstmt")
    sparksession.stop()
  }
}

object Layer2 {
  def main(args: Array[String]) {
    //created spark session
    var a1 = sparksession.sql(" insert and select(temp) st")
    sparksession.stop()
  }
}

object Layer3 {
  def main(args: Array[String]) {
    //created sparksession
    var a1 = sparksession.sql(" insert and select(orc)")
    sparksession.stop()
  }
}

【问题讨论】:

  • 你能分享你包含这些scala对象的类程序吗?
  • 问题范围很广,将其缩小到特定要求。 ETL 可以使用单个 spark 驱动程序完成,其中数据加载步骤和转换步骤等......在每个步骤中,您可以调用不同的封装对象 Main Driver -> object DataLoadStep -> object TranformStep 等......它在 spark 世界中非常常见的模式
  • @Ram Ghadiyaram 我是编程和 Spark 的新手。请你帮我我应该怎么做,我已经创建了 4 个不同的 scala/spark 对象。在第一层,我将数据加载到 temp来自 csv 文件的表,然后我再次以 orc 格式加载到一个配置单元表中,在第三层中,我在加载到最终表时应用所有转换。
  • @Raghavendra Gupta...请参阅下面的示例代码(流程)不共享确切的代码。
  • object 1st_layer { def main(args: Array[String]) { //created sparksession var a1=sparksession.sql("loadstmt") sparksession.stop() } } object 2nd_layer { def main( args: Array[String]) { //created sparksession var a1=sparksession.sql(" insert and select(temp) st") sparksession.stop()}} object 3rd_layer { def main(args: Array[String]) { //sparksession var a1=sparksession.sql("插入和选择(orc)") sparksession.stop() } }

标签: scala apache-spark


【解决方案1】:

有两种选择

1) 使用单个驱动程序执行 spark-submit。

2) 执行多个 spark-submits,即每个一个......

正如您希望在一个 spark 提交和驱动程序中执行的操作一样,您可以执行此操作。

您可以通过将参数传递给驱动程序来使用单个驱动程序,您可以绕过流程,您可以单独(单独)执行步骤(如加载转换),也可以一次执行算法中的 ETL 步骤。

这是示例代码(而不是多个类/对象,我为每个步骤使用了一个函数,尽管您可以使用不同的对象来封装您的逻辑并且是可选的):

package examples

import org.apache.log4j.Level
import org.apache.spark.sql.SparkSession

object ETLDriver {
  val spark = SparkSession.builder().appName("ETLDriver").master("local").getOrCreate()
  val logger = org.apache.log4j.Logger.getLogger("org")
  logger.setLevel(Level.WARN)

  import spark.implicits._

  def layer1() = {
    //created spark session
    var a1 = spark.sql(" loadstmt")
  }

  def layer2() {
    //created spark session
    var a1 = spark.sql(" insert and select(temp) st")
  }

  def layer3() {
    //created sparksession
    var a1 = spark.sql(" insert and select(orc)")
  }

  def main(args: Array[String]): Unit = {
// you can pass arguments through your spark submit to by pass the flow  here I have
    // not included since its a sudo code.
    layer1()
    layer2()
    layer3()
  }
}

示例 Spark 提交如下所示

    spark-submit --master local[*]  --class examples.ETLDriver  /home/test /Demo2-0.0.1-SNAPSHOT.jar

如果您的 ETL 步骤是相关的,那么您可以使用单个火花驱动器来执行此操作。

结论:

执行单独的spark-submit 即选项 2,对于您提到的所有 3 个步骤,您将一次又一次地获得 sparksession。将要 花一些时间来掌握会话并执行工作。因此我会 显然更喜欢选项 1

【讨论】:

  • 我给出了psedo代码示例。如果需要,您可以检查并提出问题。
  • @Ram Ghadiyaram 是的,尝试了第二个选项,它成功了。现在将尝试第一个选项。非常感谢!!还有一个问题在这里发布stackoverflow.com/questions/60984121/…如果您有任何建议,请提供帮助。提前感谢@Ram Ghadiyaram
  • 它应该可以工作,我有这种要求的实践经验(特别是第一个选项)并且像魅力一样工作
猜你喜欢
  • 2015-12-25
  • 2020-04-24
  • 2016-09-04
  • 1970-01-01
  • 2019-10-10
  • 1970-01-01
  • 2017-01-27
  • 2018-05-19
  • 2020-10-07
相关资源
最近更新 更多