1 调试
1.1 Spark-shell 程序调试
交互式本身可以认为是一种调试方式;
或根据Sparkshell脚本,调试对应的入口Object。
1.2 IDEA 程序调试
程序调试分本地调试和远程调试两种:
1. 本地调试时,直接在IDEA里调试对应的类即可(根据启动该类的脚本进行模拟,模拟内容包括启动脚本中的环境变量设置等);
2. 远程调试时,需要设置对应的Java启动选项OPTS(即JVM调试参数的设置),打开调试对象(要启动的类)对应的远程调试端口,然后在IDEA中,配置远程调试的设置,在设置中,指定远程对应的host和port,进行监听,设置完成后,启动该调试对象(根据调试对象
启动脚本中对应的类,并尽可能模拟启动脚本,包括脚本中的环境变量设置等)的调试即可。
如何打开远程调试,即OPTS如何设置,参考远程调试章节。
说明:本文档里只写了一种方式,就是脚本启动时使用到的OPTS环境变量,实际上,可以直接在脚本的java执行代码前面,加上调试参数,这样的话,你启动时,不需要设置OPTS,而只需要在某个节点上修改启动脚本,在start-all.sh的时候,就不会影响全部节点,而只会影响修改了脚本的节点。如修改了Worker的启动脚本时,只有该节点上的Worker是打开了远程调试的。
1.2.1 调试环境搭建
IDEA调试环境需构建在Spark 安装包部署 + Spark源码的基础上。
即,在调试机器上进行带Spark源码的Spark 安装包部署。可以同时作为Spark客户端和Spark 源码环境。
1.2.2 远程调试
1. JVM调试参数配置
远程调试时,结合JDWP(Java Debug Wire Protocol)进行,在JVM进程启动前,添加相应的JAVA_OPTS,设置远程调试参数,比如:
-Xdebug -server -Xrunjdwp:transport=dt_socket,address=7777,server=y,suspend=y |
启动JVM进程(通常就是执行对应的启动脚本)后会停留在 Listening for transport dt_socket at address: 7777 ,IDE连接后才会继续。
2. 对于Spark 的守护进程的调试参数配置
可以在SPARK_DAEMON_JAVA_OPTS环境变量中统一添加远程调试参数,此时要确保要调试的守护进程不在同一台机器上。
可以在具体的守护进程特定的XXX_OPTS环境变量中设置。此时,如果调试的守护进程在同一台机器上,可以通过设置不同的调试端口进行区分。
其中环境变量参考spark-env.s件,有以下几种:
SPARK_MASTER_OPTS
SPARK_WORKER_OPTS
SPARK_HISTORY_OPTS
3. IDE调试参数配置
在IDE中,针对进程对应的类,设置调试参数。
Eclipse:>Remote Java Application>New下创建一个远程调试的项目并设置相关参数;对应界面如下:
Host为远程服务器的ip, Port为在启动脚本中设置的address的值。
如果选中“Allow termination of remote VM”,那么在本地结束调试,就会结束远程运行的java程序。
idea debugIDEA:
1.2.3 Driver Program调试
注意:提交应用时,需要使用提交脚本SparkSubmit.sh,来封装不同集管理+部署模式的
应用程序提交,因此,在调试时,应该以该脚本对应的SparkSubmit Object作为入口点,进行应用程序的提交。
提交应用程序运行、调试入口点为SparkSubmit Object,模拟提交脚本SparkSubmit,提交应用程序的示例:
1. 设置SparkSubmit类的运行、调试配置,如Windows下:
--class org.amples.SparkPi --master local E: \\bd\\spark-1.1.0-hadoop-2.2.0.bin\\lib\\spark-examples-1.1.0-hadoop2.2.0.jar 10 |
2. 运行、调试 SparkSubmit Object
待补充:如何模拟SparkSubmit提交脚本中的执行代码,如环境变量设置等。
根据部署模式(deploy mode)进行调试
1.2.3.1 Client部署模式的调试
当使用Client部署模式进行提交时,Driver在提交点运行,因此不需要使用远程调试的方式。即从入口点出发,使用普通的本地调试方式即可。
1.2.3.2 Cluster部署模式的远程调试
Cluster与Client部署模式的主要差异在于:
1. Cluster 部署模式下,Driver 的运行点是在集的Worker 上,对应DriverWrapper。
2. Cluster部署模式下,Master会对应增加对 Driver的调度。
如果调试的目的与这些差异无关,那么,直接在Client部署模式上提交就可以了 —— 简单,直至不能再简单!
Driver驱动程序对应的JAVA_OPTS设置:
1. 命令选项:--driver-java-options
方法1步骤:
1. 使用提交脚本,部署应用程序时,设置DriverWrapper对应的JAVA_OPTS,打开远程调试端口;
2. 启动入口点SparkSubmit Object应用程序的调试。
难点:需要动态获取driver所在的host,可能需要从日志中获取。
方法2步骤 — 待确认:
1. 指定driver所在worker的host ip;
2. 然后启动入口点SparkSubmit Object应用程序的远程调试;
由于事先已经指定host,因此不需要动态获取。
1.2.4 Master组件远程调试
步骤:
1. 配置调试参数:
静态方法:直接在master启动脚本中添加JAVA_OPTS,打开远程调试端口;
动态方法:在SPARK_MASTER_OPTS中添加;
2. 在IDE中启动Master类的远程调试;
1.2.5 Worker组件远程调试
步骤:
1. 配置调试参数:为简化调试,可以只针对某个节点上的Worker 守护进程。
静态方法:直接在Worker启动脚本上添加JAVA_OPTS,打开远程调试端口;
动态方法:在SPARK_WORKER_OPTS中添加;
2. 在IDE中启动Worker类的远程调试;
1.2.6 History Server进程的远程调试
步骤:
1. 配置调试参数:
静态方法:直接在启动脚本中添加JAVA_OPTS,打开远程调试端口;
动态方法:在SPARK_HISTORY_OPTS中添加;
2. 在IDE中启动HistoryServer类的远程调试;
1.2.7 Executor进程的远程调试
待确认:
Executor进程是在Worker中,由ExecutorRunner对象启动,需要确认下是否支持设置JAVA_OPTS,设置调试参数,打开远程调试端口。
进一步:如果木有直接提供可配置参数,可以试试在代码中添加,然后重新编译执行。
相关配置变量 —— 未试:
--conf "aJavaOptions=-XX:+PrintGCDetails -XX:+PrintGCTimeStamps" |
在aJavaOptions中,设置调试参数。
简化:
Executor进程中的任务执行,采用线程池模型执行task,因此使用单task可以简化调试 —— 即,通过分区数控制对应的task数。
1.3 调试示例
1.3.1 win下idea中提交任务
用户环境Windows 7
准备工作:
1. Ssh设置:,将集的ssh公钥信息拷贝到当前IDEA执行的用户目录下.ssh中的相应文件中,本机为github_rsa.pub。
2. 将本机github_rsa.pub 原内容拷贝到集中各个节点的相应用户的.ssh目录下的authorized_keys文件中。
如果没有以上ssh设置的准备工作,在idea中运行时,连接akka的actor会报错。
调试测试环境:
1. IDEA 14.0.1
2. 用户应用程序Project – TestSpark
3. 依赖:将spark-1.1.0(含编译结果dist目录)的\\dist_first\\lib\\内所有jar包导入,设置为工程的依赖包,同时将spark-1.1.0设置为每个jar包的源代码。
4. Ctrl+N,搜寻jar包对应源码的SparkSubmit对象,编译调试设置,如下图所示:
5. 在SparkSubmit或应用程序类的源码中设置断点;
6. 基于SparkSubmit对象,提交任务
为SparkSubmit提供的参数为:--class org.amples.SparkPi --master spark://192.168.70.214:7077 E:\\bd\\spark-1.1.0\\dist_first\\lib\\spark-examples-1.1.0-hadoop2.2.0.jar 10
1.3.2 远程SparkSubmit方式提交调试
实际环境部署:spark-1.1.0-hadoop-2.2.0.bin
调试测试环境:
1. IDEA 14.0.1
2. SparkSubmit运行环境:spark-1.2.0
3. 基于SparkSubmit对象,提交任务
为SparkSubmit提供的参数为:--class org.amples.SparkPi --master spark://192.168.70.214:7077 E:\\bd\\spark-1.1.0\\dist_first\\lib\\spark-examples-1.1.0-hadoop2.2.0.jar 10
问题分析:由于版本不同导致BlockManagerId反序列化 serialVersionUID的错误,因此在运行时会报错。
解决方法,运行时
错误信息:ERROR Remoting: org.apache.spark.storage.BlockManagerId; local class incompatible: stream classdesc serialVersionUID = -7366074099953117729, local class serialVersionUID = 2439208141545036836
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论