对于spark源码和spark执行过程有兴趣的同学,可以搭建一个spark的源码调试环境,来调试远程spark源码执行过程。
由于spark启动都是通过脚本设置一些环境变量执行指定类来启动的,所以在ide里面不能直接调试,需要预先启动一个spark执行代码,然后通过本地的代码进行远程调试。
1.环境
- idea 2017
- maven 3.3(可以将maven的镜像地址设置成国内的,不然编译很久或编译不成功)
- jdk 1.8
- spark 2.x
- scala 2.11
2.下载源码并编译
spark源码导入ide之前要先编译,编译的时候要用到build包里面的脚本,由于脚本是shell,故在windows编译不了,可以在linux上编译好之后放到windows上。
git clone https://github.com/apache/spark.git
cd spark
#切换到2.2版本
git checkout branch-2.2
./build/mvn -DskipTests clean package
编译好之后,在idea里面导入spark源码
3.在ide里面调试
这里以调试spark-sql为例。
首先启动spark-sql,在后面添加上远程调试的参数
sbin/start-thriftserver.sh --driver-java-options "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=10080"
dt_socket:使用的通信方式
server:是主动连接调试器还是作为服务器等待调试器连接
suspend:是否在启动JVM时就暂停,并等待调试器连接
address:地址和端口,地址可以省略,两者用冒号分隔
启动thriftservier后,日志里面显示这样一条记录,就表示客户端可以远程进行源码调试
在idea里面创建一个远程调试客户端,并设置源码进行调试。
点击OK,创建好远程调试客户端。
如下图点击debug,运行。
控制台显示已经连接到远程调试服务
打开PaseDriver并在如图所在行设置断点。
这个类相当于hive的driver类,负责编译sql语句和生成spark任务,在这里就可以查看sql语句是怎样转换成一步步的spark rdd转换。
到这里,用beeline连接thriftserver,并直接一个sql语句,如”show tables”
执行完之后,beeline的命令行就会挂起,这时在idea里面就可以调试执行过程了。
4.其它
例子里面的spark-sql相关可以参考
http://blog.csdn.net/dante_003/article/details/78657689
http://blog.csdn.net/dante_003/article/details/78652534