我们在编写Spark Application或者是阅读源码的时候,我们很想知道代码的运行情况,比如参数设置的是否正确等等。用Logging方式来调试是一个可以选择的方式,但是,logging方式调试代码有很多的局限和不便。今天我就来介绍如何通过IDE来远程调试Spark的Application或者是Spark的源码。
  本文以调试Spark Application为例进行说明,本文用到的IDE是Eclipse。步骤如下:

一、JVM里面设置以下参数


  1. -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=6666
这里对上面的几个参数进行说明:


  1. -Xdebug                 启用调试特性
  2. -Xrunjdwp               启用JDWP实现,包含若干子选项:
  3. transport=dt_socket     JPDA front-end和back-end之间的传输方法。dt_socket表示使用套接字传输。
  4. address=6666            JVM在6666端口上监听请求,这个设定为一个不冲突的端口即可。
  5. server=y                y表示启动的JVM是被调试者。如果为n,则表示启动的JVM是调试器。
  6. suspend=y               y表示启动的JVM会暂停等待,直到调试器连接上才继续执行。suspend=n,则JVM不会暂停等待。

二、启动Spark Application

spark-submit提交程序的时候带上


  1. --driver-java-options "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=6666" \

  启动Spark Application的时候我们可以在终端看到如下输出:


  1. [root@master Spark-Submit]# spark-submit \
  2. > --driver-java-options "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=6666" \
  3. > --driver-class-path /usr/local/TrueTimeControlDeploy/myApp/ojdbc5.jar \
  4. > --class 'com.spark.main.CompareAndDistinctResult' /usr/local/TrueTimeControlDeploy/myApp/TrueTimeControlOnSparkByJava-0.0.1-jar-with-dependencies.jar
  5. Listening for transport dt_socket at address: 6666

如果你看到第5行的输出(Listening for transport dt_socket at address: 6666),那恭喜你了,启动了远程调试。而且Spark Application正在等待我们的IDE连接它。

三、在Eclipse设置远程调试的IP和port

双击【Remote Java Application】,如下图:

点击【Select one...】,如下图:

点击Debug,可以Linux客户端Spark-submit程序已经开始运行:


  1. [root@master Spark-Submit]# spark-submit --driver-java-options "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=6666" --driver-class-path /usr/local/TrueTimeControlDeploy/myApp/ojdbc5.jar --class 'com.spark.main.CompareAndDistinctResult' /usr/local/TrueTimeControlDeploy/myApp/TrueTimeControlOnSparkByJava-0.0.1-jar-with-dependencies.jar
  2. Listening for transport dt_socket at address: 6666
  3. 17/09/22 21:38:40 INFO spark.SparkContext: Running Spark version 2.0.2
  4. 17/09/22 21:38:41 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
  5. 17/09/22 21:38:42 INFO spark.SecurityManager: Changing view acls to: root
  6. 17/09/22 21:38:42 INFO spark.SecurityManager: Changing modify acls to: root
  7. 17/09/22 21:38:42 INFO spark.SecurityManager: Changing view acls groups to:
  8. 17/09/22 21:38:42 INFO spark.SecurityManager: Changing modify acls groups to:
  9. 17/09/22 21:38:42 INFO spark.SecurityManager: SecurityManager: authentication disabled; ui acls disabled; users  with view permissions: Set(root); groups with view permissions: Set(); users  with modify permissions: Set(root); groups with modify permissions: Set()
  10. 17/09/22 21:38:43 INFO util.Utils: Successfully started service 'sparkDriver' on port 51652.
  11. 17/09/22 21:38:43 INFO spark.SparkEnv: Registering MapOutputTracker
  12. 17/09/22 21:38:43 INFO spark.SparkEnv: Registering BlockManagerMaster
  13. 17/09/22 21:38:43 INFO storage.DiskBlockManager: Created local directory at /tmp/blockmgr-e04a2402-1821-49f2-92a6-21e97e1ebb15
  14. 17/09/22 21:38:43 INFO memory.MemoryStore: MemoryStore started with capacity 366.3 MB
  15. 17/09/22 21:38:43 INFO spark.SparkEnv: Registering OutputCommitCoordinator
  16. 17/09/22 21:38:44 INFO util.log: Logging initialized @20047ms
  17. 17/09/22 21:38:44 INFO server.Server: jetty-9.2.z-SNAPSHOT
  18. 17/09/22 21:38:44 INFO handler.ContextHandler: Started o.s.j.s.ServletContextHandler@1be6d5ac{/jobs,null,AVAILABLE}
  19. 17/09/22 21:38:44 INFO handler.ContextHandler: Started o.s.j.s.ServletContextHandler@4fd61d83{/jobs/json,null,AVAILABLE}
  20. 17/09/22 21:38:44 INFO handler.ContextHandler: Started o.s.j.s.ServletContextHandler@722bac67{/jobs/job,null,AVAILABLE}
  21. 17/09/22 21:38:44 INFO handler.ContextHandler: Started o.s.j.s.ServletContextHandler@1143d8c0{/jobs/job/json,null,AVAILABLE}
  22. 17/09/22 21:38:44 INFO handler.ContextHandler: Started o.s.j.s.ServletContextHandler@7d4b2e1a{/stages,null,AVAILABLE}

然后你可以开始远程调试你的代码了!

注意:远程断点调试只能调试运行在Driver端的代码,运行在Worker端的代码是无法调试,除非使用local模式。


  1. lines.foreachRDD(new VoidFunction<JavaRDD<String>>() {
  2. private static final long serialVersionUID = 340756330712789698L;
  3. @Override
  4. public void call(JavaRDD<String> rdd) throws Exception {
  5. //此时代码在Driver端执行
  6. String addr = InetAddress.getLocalHost().getHostAddress();//获得本机IP
  7. System.out.println(addr);
  8. System.out.println("断点一测试成功!!!");
  9. rdd.foreach(new VoidFunction<String>() {
  10. private static final long serialVersionUID = -1096797241091398607L;
  11. @Override
  12. public void call(String s) throws Exception {
  13. // 这个时候执行的位置已经是在Worker执行了
  14. String addr = InetAddress.getLocalHost().getHostAddress();//获得本机IP
  15. System.out.println(addr);
  16. System.out.println("断点二测试成功!!!");
  17. }
  18. });
  19. }
  20. });

Spark代码Eclipse远程调试的更多相关文章

  1. Eclipse远程调试Java代码的三种方法

    Eclipse远程调试Java代码的三种方法, 第1种方法是用来调试已经启动的Java程序,Eclipse可以随时连接到远程Java程序进行调试, 第2种方法可以调试Java程序启动过程,但是Ecli ...

  2. Eclipse远程调试HDP源代码

    使用的是自己编译的HDP2.3.0的源代码编译的集群,此文介绍如何使用Eclipse远程调试Hadoop内核源代码,以调试namenode为例进行介绍. 在/usr/hdp/2.3.0.0-2557/ ...

  3. Eclipse远程调试+FTPClient在jdk6以上写法不兼容问题的排查

    业务场景: 应业务新需求的UAT测试,需要部署一份新tomcat到测试环境.新环境正常启动并运行了一天,没太大差错.但今天发现原本在另一个老的tomcat下运行的好好的FTP上传文件模块突然出了问题. ...

  4. Eclipse远程调试Tomcat

    1.Linux服务器中在Tomcat的catalina.sh文件添加如下内容: CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,ad ...

  5. Linux下使用Eclipse 远程调试

    1 开启端口 修改/apache-tomcat-7.0.40/bin/catalina.sh 在合适的位置(请自行判断,只要有JAVA_OPTS的设定前后即可)插入下面的设定:UI_DEBUG=&qu ...

  6. eclipse远程调试Hadoop

    环境需求: 系统:window 10 eclipse版本:Mars Hadoop版本:2.6.0 资源需求:解压后的Hadoop-2.6.0,原压缩包自行下载:下载地址 丑话前头说: 以下的操作中,e ...

  7. Eclipse远程调试(远程服务器端监听)

    前提:远程服务器上运行的WEB项目class对应的源码与本地项目中必须保持一致,也就是远程tomcat部署的项目就是本机项目打包过去的,而本机项目没有发生变动. 远程服务器端 服务器端配置eclips ...

  8. Eclipse远程调试出现“JDWP Transport dt_socket failed to initialize”的解决方案

    欢迎关注我的社交账号: 博客园地址: http://www.cnblogs.com/jiangxinnju/p/4781259.html GitHub地址: https://github.com/ji ...

  9. Pycharm实现服务器端代码的远程调试

     Pycharm是很多人在学习机器学习时的常用IDE.但是,当代码需要庞大计算资源的时候,我们往往需要借助远程服务器的GPU资源.很多人都是将代码拷贝到服务器,然后运行,但是当修改调试的时候,很不方便 ...

随机推荐

  1. VSFTP服务配置

    FTP连接及传输模式控制连接:TCP 21 ,用于发送FTP命令信息数据连接:TCP 20 ,用于上传.下载数据数据连接的建立类型:主动模式.被动模式 主动模式:服务器主动发起数据连接·首先由客户端向 ...

  2. vue-router 不重新加载问题

    -----------------------同一个路由不同的参数页面不重新加载的解决版本---------- // 监听 route , watch: { '$route': 'getContent ...

  3. iOS原生和React-Native之间的交互2

    今天看下iOS原生->RN: 这里有个问题: * 我这里只能通过rn->ios->rn来是实现* 如果想直接ios-rn 那个iOS中的CalendarManager的self.br ...

  4. JS之计时器

    JavaScript 计时事件 通过使用 JavaScript,我们有能力作到在一个设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行.我们称之为计时事件. 在 JavaScritp 中使用计 ...

  5. 2.13 table表格定位

    2.13 table表格定位 前言    在web页面中经常会遇到table表格,特别是后台操作页面比较常见.本篇详细讲解table表格如何定位.一.认识table    1.首先看下table长什么 ...

  6. poj 1236 强联通分量

    大致题意给你有一个点数为n<=100的有向图. 求解两个子任务: 1:最少给多少个点信息,这些点的信息可以顺着有向边传遍全图. 2:最少要加多少条边,使得整个图强联通. 求强联通分量再缩点后得到 ...

  7. Stiring公式证明

  8. Python根据路径名称获取文件的名称以及所在的路径

    大神一看题目就知道用python中的string.split('\'),记得之前处理大量的文件的时候,有时候有几十万的文本文件,经常会读取获取名称,并且保存为名字一样的另外一种格式的文件 其实pyth ...

  9. C++学习(十八)(C语言部分)之 指针2

    指针1.指针的概述 指针是什么? 指针是一个地址 是一个常量 int 整型 int a a是变量 指针用来做什么? 方便使用数组或者字符串 像汇编语言一样处理内存地址2.指针变量 什么是指针变量? 是 ...

  10. [Educational Codeforces Round 55 (Rated for Div. 2)][C. Multi-Subject Competition]

    https://codeforc.es/contest/1082/problem/C 题目大意:有m个类型,n个人,每个人有一个所属类型k和一个能力v,要求所选的类型的人个数相等并且使v总和最大(n, ...