Spark代码Eclipse远程调试
我们在编写Spark Application或者是阅读源码的时候,我们很想知道代码的运行情况,比如参数设置的是否正确等等。用Logging方式来调试是一个可以选择的方式,但是,logging方式调试代码有很多的局限和不便。今天我就来介绍如何通过IDE来远程调试Spark的Application或者是Spark的源码。
本文以调试Spark Application为例进行说明,本文用到的IDE是Eclipse。步骤如下:
一、JVM里面设置以下参数
- -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=6666
- -Xdebug 启用调试特性
- -Xrunjdwp 启用JDWP实现,包含若干子选项:
- transport=dt_socket JPDA front-end和back-end之间的传输方法。dt_socket表示使用套接字传输。
- address=6666 JVM在6666端口上监听请求,这个设定为一个不冲突的端口即可。
- server=y y表示启动的JVM是被调试者。如果为n,则表示启动的JVM是调试器。
- suspend=y y表示启动的JVM会暂停等待,直到调试器连接上才继续执行。suspend=n,则JVM不会暂停等待。
二、启动Spark Application
spark-submit提交程序的时候带上
- --driver-java-options "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=6666" \
启动Spark Application的时候我们可以在终端看到如下输出:
- [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
- 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程序已经开始运行:
- [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
- Listening for transport dt_socket at address: 6666
- 17/09/22 21:38:40 INFO spark.SparkContext: Running Spark version 2.0.2
- 17/09/22 21:38:41 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
- 17/09/22 21:38:42 INFO spark.SecurityManager: Changing view acls to: root
- 17/09/22 21:38:42 INFO spark.SecurityManager: Changing modify acls to: root
- 17/09/22 21:38:42 INFO spark.SecurityManager: Changing view acls groups to:
- 17/09/22 21:38:42 INFO spark.SecurityManager: Changing modify acls groups to:
- 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()
- 17/09/22 21:38:43 INFO util.Utils: Successfully started service 'sparkDriver' on port 51652.
- 17/09/22 21:38:43 INFO spark.SparkEnv: Registering MapOutputTracker
- 17/09/22 21:38:43 INFO spark.SparkEnv: Registering BlockManagerMaster
- 17/09/22 21:38:43 INFO storage.DiskBlockManager: Created local directory at /tmp/blockmgr-e04a2402-1821-49f2-92a6-21e97e1ebb15
- 17/09/22 21:38:43 INFO memory.MemoryStore: MemoryStore started with capacity 366.3 MB
- 17/09/22 21:38:43 INFO spark.SparkEnv: Registering OutputCommitCoordinator
- 17/09/22 21:38:44 INFO util.log: Logging initialized @20047ms
- 17/09/22 21:38:44 INFO server.Server: jetty-9.2.z-SNAPSHOT
- 17/09/22 21:38:44 INFO handler.ContextHandler: Started o.s.j.s.ServletContextHandler@1be6d5ac{/jobs,null,AVAILABLE}
- 17/09/22 21:38:44 INFO handler.ContextHandler: Started o.s.j.s.ServletContextHandler@4fd61d83{/jobs/json,null,AVAILABLE}
- 17/09/22 21:38:44 INFO handler.ContextHandler: Started o.s.j.s.ServletContextHandler@722bac67{/jobs/job,null,AVAILABLE}
- 17/09/22 21:38:44 INFO handler.ContextHandler: Started o.s.j.s.ServletContextHandler@1143d8c0{/jobs/job/json,null,AVAILABLE}
- 17/09/22 21:38:44 INFO handler.ContextHandler: Started o.s.j.s.ServletContextHandler@7d4b2e1a{/stages,null,AVAILABLE}
然后你可以开始远程调试你的代码了!
注意:远程断点调试只能调试运行在Driver端的代码,运行在Worker端的代码是无法调试,除非使用local模式。
- lines.foreachRDD(new VoidFunction<JavaRDD<String>>() {
- private static final long serialVersionUID = 340756330712789698L;
- @Override
- public void call(JavaRDD<String> rdd) throws Exception {
- //此时代码在Driver端执行
- String addr = InetAddress.getLocalHost().getHostAddress();//获得本机IP
- System.out.println(addr);
- System.out.println("断点一测试成功!!!");
- rdd.foreach(new VoidFunction<String>() {
- private static final long serialVersionUID = -1096797241091398607L;
- @Override
- public void call(String s) throws Exception {
- // 这个时候执行的位置已经是在Worker执行了
- String addr = InetAddress.getLocalHost().getHostAddress();//获得本机IP
- System.out.println(addr);
- System.out.println("断点二测试成功!!!");
- }
- });
- }
- });
Spark代码Eclipse远程调试的更多相关文章
- Eclipse远程调试Java代码的三种方法
Eclipse远程调试Java代码的三种方法, 第1种方法是用来调试已经启动的Java程序,Eclipse可以随时连接到远程Java程序进行调试, 第2种方法可以调试Java程序启动过程,但是Ecli ...
- Eclipse远程调试HDP源代码
使用的是自己编译的HDP2.3.0的源代码编译的集群,此文介绍如何使用Eclipse远程调试Hadoop内核源代码,以调试namenode为例进行介绍. 在/usr/hdp/2.3.0.0-2557/ ...
- Eclipse远程调试+FTPClient在jdk6以上写法不兼容问题的排查
业务场景: 应业务新需求的UAT测试,需要部署一份新tomcat到测试环境.新环境正常启动并运行了一天,没太大差错.但今天发现原本在另一个老的tomcat下运行的好好的FTP上传文件模块突然出了问题. ...
- Eclipse远程调试Tomcat
1.Linux服务器中在Tomcat的catalina.sh文件添加如下内容: CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,ad ...
- Linux下使用Eclipse 远程调试
1 开启端口 修改/apache-tomcat-7.0.40/bin/catalina.sh 在合适的位置(请自行判断,只要有JAVA_OPTS的设定前后即可)插入下面的设定:UI_DEBUG=&qu ...
- eclipse远程调试Hadoop
环境需求: 系统:window 10 eclipse版本:Mars Hadoop版本:2.6.0 资源需求:解压后的Hadoop-2.6.0,原压缩包自行下载:下载地址 丑话前头说: 以下的操作中,e ...
- Eclipse远程调试(远程服务器端监听)
前提:远程服务器上运行的WEB项目class对应的源码与本地项目中必须保持一致,也就是远程tomcat部署的项目就是本机项目打包过去的,而本机项目没有发生变动. 远程服务器端 服务器端配置eclips ...
- Eclipse远程调试出现“JDWP Transport dt_socket failed to initialize”的解决方案
欢迎关注我的社交账号: 博客园地址: http://www.cnblogs.com/jiangxinnju/p/4781259.html GitHub地址: https://github.com/ji ...
- Pycharm实现服务器端代码的远程调试
Pycharm是很多人在学习机器学习时的常用IDE.但是,当代码需要庞大计算资源的时候,我们往往需要借助远程服务器的GPU资源.很多人都是将代码拷贝到服务器,然后运行,但是当修改调试的时候,很不方便 ...
随机推荐
- Python库,让你相见恨晚的第三方库
环境管理 管理 Python 版本和环境的工具 p – 非常简单的交互式 python 版本管理工具.pyenv – 简单的 Python 版本管理工具.Vex – 可以在虚拟环境中执行命令.virt ...
- C# Notepad++ 环境配置
第一种方法,使用NppExec插件 1.下载安装插件 NppExec https://nchc.dl.sourceforge.net/project/npp-plugins/NppExec/NppEx ...
- 什么时候用深搜(dfs)什么时候用广搜(bfs)(转)
1.BFS是用来搜索最短径路的解是比较合适的,比如求最少步数的解,最少交换次数的解,因为BFS搜索过程中遇到的解一定是离根最近的,所以遇到一个解,一定就是最优解,此时搜索算法可以终止.这个时候不适宜使 ...
- Golang游戏服务器与skynet的个人直观比较
我对和GOLANG写MMO服务器的一些遐想: 1.沙盒(隔离性) SKYNET:原生LUA STATE作为沙盒, 进行服务器间隔离安全性高: 服务可以很容易的配置到不同节点之上. GO:估计用RECO ...
- [LeetCode&Python] Problem 383. Ransom Note
Given an arbitrary ransom note string and another string containing letters from all the magazines, ...
- djang 过滤器和装饰器
Django自定义过滤器 Django 自定义过滤器, 在项目目录中建立templatetags目录. 建立my_filter.py 文件, 导入模板模块 :from django import te ...
- NYOJ 85:有趣的数(打表,规律)
85-有趣的数 内存限制:64MB 时间限制:3000ms 特判: No 通过数:8 提交数:12 难度:2 题目描述: 把分数按下面的办法排成一个数表. 1/1 1/2 1/3 1/4- 2/1 2 ...
- python scrapy 爬虫实例
1 创建一个项目 scrapy startproject basicbudejie 2 编写爬虫 import scrapy class Basicbudejie(scrapy.Spider): na ...
- UV纹理+修改器:VertexWeightEdit+修改器:Mask遮罩
UV纹理+修改器: VertexWeightEdit+修改器: Mask遮罩 基本流程, 如下图,准备地图一份, 黑白色即可. 纹理使用颜色绘制权重. 白色为1, 黑色为0. 新增球体, 细分多次, ...
- L1-009 N个数求和 (20 分)
本题的要求很简单,就是求N个数字的和.麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式. 输入格式: 输入第一行给出一个正整数N(≤100).随后一行按格式a1/b1 ...