首页 > 解决方案 > 如何在intelliJ中调试scala spark代码

问题描述

我是 Scala 和 Spark 的新手,目前正在从事 scala spark 作业项目,让我感到沮丧的一件事是我不知道如何像使用 java 那样在 IntelliJ 中调试代码。

在我导入 scala 项目后,我注意到一件事是 spark-jobs 文件夹未标记为源代码文件夹,即使同一模块中的其他一些子文件夹作为源代码文件夹是市场的。

-- utility (marked as source code folder)
   -- event-sender (marked as source code folder)
   -- spark-jobs (not marked as source code folder)
      -- src
         --main
           -- resources
           -- scala
              -- com
                -- example
                   -- spark
                      -- jobs

当我检查我正在做的火花工作时,没有主要方法。

class DailyExport(
    env: String,
    )(implicit sc: SparkContext, sqlContext: SQLContext, logger: SparkJobLogger)
    extends JobAudit
    with PartitionedWriter {

  def run(): Unit = ...

object DailyExport extends App with SparkJobParameters {

  {
    for {
      env          <- getStringParameter("environment", 0, args)
    } yield {
      val jobConfig               = SparkJobConfig.fromConfig.exportConfig
      ...

      new DailyExport(
        jobConfig = jobConfig
      ).run()
    }
  }.fold(
    error => {
      println(s"Some provided parameters are wrong: $error")
      sys.exit(-1)
    },
    identity
  )
}

但是在“App”中定义了一个主要方法

trait App extends DelayedInit {
...
@deprecatedOverriding("main should not be overridden", "2.11.0")
  def main(args: Array[String]) = {
    this._args = args
    for (proc <- initCode) proc()
    if (util.Properties.propIsSet("scala.time")) {
      val total = currentTime - executionStart
      Console.println("[total " + total + "ms]")
    }
  }

然后我右键单击我正在工作的工作以选择“运行..”,它抱怨

'Error: Could not find or load main class com.exmaple.spark.jobs.DailyExport'

这与Java如此不同,谁能告诉我如何调试它?

标签: scalaintellij-idea

解决方案


在 Scala 中有不同的方法来定义一个主类。一种是在 中定义一个 main 方法object,类似于 Java。另一种是扩展App特征,只需将应用程序代码直接写入类中,就像DailyExport在您的示例中所做的那样。所以你应该可以像主类一样正常运行这个类,并且你还应该在 IntelliJ 中的类旁边看到一个“运行”图标(不是超类中的 main 方法,这是Apptrait 的实现细节)。

如果您以这种方式运行它,但仍然出现错误,则您可能遇到了 IntelliJ 中的错误。尝试再次运行它,可能在切换窗口并检查编译输出是否确实是它应该在的位置之后。


推荐阅读