我是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
当我检查正在处理的Spark作业时,没有主要方法。
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
)
}
但是在“应用”中定义了一种主要方法
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截然不同,有人可以告诉我如何调试它吗?
答案 0 :(得分:0)
在Scala中,有多种定义主类的方法。一种是在object
中定义主要方法,类似于Java。另一个是扩展App
特质,就像在示例中使用DailyExport
一样,将应用程序代码直接写入类中。因此,您应该能够像主类一样正常运行该类,并且还应该在IntelliJ中的类旁边看到一个“运行”图标(不是超类中的main方法,它是{{1的实现细节}}特性。
如果以这种方式运行它,但仍然收到错误,则可能是您在IntelliJ中遇到了a bug。尝试再次运行它,可能是在切换窗口并检查编译输出确实在预期的位置之后。
答案 1 :(得分:0)
请检查IntelliJ生成的目标文件夹。确保包结构保持不变。
如果问题仍然存在,请尝试进行全新构建。
答案 2 :(得分:0)
IntelliJ IDEA拥有自己的调试器,用于调试scala。您可以使用INTELLIJ IDEA调试器或sbt shell调试问题。
更多信息为here.