intellij远程调试spark源码示例

环境与版本

  • OS:centos 7

  • JDK版本:1.8

  • Spark版本:2.1.0

  • Scala版本:2.11

  • IDE:intellij idea 14.1.4

前置条件

  • 完成编译Spark源码并导入intellij

编写示例代码

在intellij中新建一个scala工程,取名为“RemoteDebugSparkAppDemo”,添加Spark2.1.0依赖,并编写如下的示例代码:

package com.demo
import org.apache.spark.{SparkConf, SparkContext}

object MainApp {
  def main(args:Array[String]):Unit = {
    //创建sc
    val sparkAppName = "RemoteDebugSparkAppDemo"
    val sc = getSparkContext(sparkAppName)
    //从数组创建第一个RDD
    val rdd1 = sc.parallelize(Array(1,2,3,4,5))
    //统计输入数组中奇偶数的个数
    val res = rdd1.map(x=>(x%2==0,x)).groupByKey().mapValues(v=>v.size).collect()
    //打印结果
    println(res.mkString(","))
    //停止sc
    sc.stop()
  }

  def getSparkContext(appName: String): SparkContext = {
    val sparkConf =
      new SparkConf().setAppName(appName).setMaster("local")
        .set("spark.driver.host", "127.0.0.1").set("spark.driver.port", "7077")
    new SparkContext(sparkConf)
  }
}

需要额外说明的是,getSparkContext方法中显式地设置spark.driver.host和spark.driver.port的值并非必须,单纯是为了临时解决如下错误(创建SparkContext步骤的异常):

java.net.BindException: Cannot assign requested address: Service 'sparkDriver' failed after 16 retries (starting from 0)! Consider explicitly setting the appropriate port for the service 'sparkDriver' (for example spark.ui.port for SparkUI) to an available port or increasing spark.port.maxRetries.

在IDE中配置远程调试参数

在这一步中需要同时打开示例工程和Spark源码工程并分别添加远程调试参数,要注意的是示例工程依赖的Spark版本必须和源码工程完全一致

设置示例工程远程调试参数

在打开的示例工程“RemoteDebugSparkAppDemo”中,设置远程调试JVM选项,步骤如下:

在intellij中打开”Run -> Edit Configuations…”,修改下图中的选项

《intellij远程调试spark源码示例》

将该选项的值设置为:

-agentlib:jdwp=transport=dt_socket,server=n,suspend=n,address=localhost:5005

设置Spark源码工程远程调试参数

用intellij打开Spark源码工程,打开”Run -> Edit Configuations…”,添加一个新的Remote类型的Configuation项目,取名为RemoteDebug,并按照下图进行配置:

《intellij远程调试spark源码示例》

测试远程调试

在打开的源码工程的IDE中,设置一个断点,比如设置在DAGScheduler类的runJob方法中(设置在其他预期会进入的方法也OK),
执行”Run -> Debug ‘RemoteDebug'”,观察IDE的Debugger窗口,如果出现下面的提示,则说明已经开始在本机的5005端口监听远程调试的客户端:

Listening to the connection, address: 'localhost:5005', transport: 'socket'

然后在示例工程中执行”Run -> Run ‘MainApp'”,如果一切顺利,将会在源码工程IDE的console窗口中打印以下提示:

Connected to the target VM, address: 'localhost:5005', transport: 'socket'

上面的”target VM”指的就是运行中的示例程序。
同时,源码工程会命中之前设置的断点。

调试结束后,源码工程IDE的console窗口会打印以下提示:

Disconnected from the target VM, address: 'localhost:5005', transport: 'socket'

Xaprice-Backup: https://xaprice.github.io/201…

    原文作者:xaprice
    原文地址: https://segmentfault.com/a/1190000008867470
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞