从⽑⽚打码到看Spark 源码,我经历了什么
想当年读⼤学时,那时⽑⽚还叫⽑⽚,现在有⽂明的叫法了,叫⼩电影或者爱情动作⽚。那时宿舍有位⼤神,喜欢看各种⽑⽚,当我们纠结于⽑⽚上的马赛克时,⼤神⼤⼿⼀挥说道:这算啥,阅尽天下⽑⽚,⼼中⾃然⽆码!突然想到我们在学习时,也可以有这种精神,当我们能读懂spark源码时,spark的技术世界也就真正为我们敞开了⼤门。台湾C++⼤师侯捷说过:源码⾯前,了⽆秘密!那我们就从如何单步调试spark源码开始讲起吧。
⾸先开发⼯具推荐⼤家选择IntelliJ,Intellij在和scala语⾔的结合上,⽐eclipse要好出太多了,其⾼效的⽂件索引机制,也可以让我们⾮常快速的定位源码。不要太担⼼快捷键的问题,IntelliJ为了拉eclipse的⽤户过来,可以将快捷键映射为eclipse常⽤快捷键,学习成本低了很多。1.本地调试app代码
在app中设置断点,如下图所⽰:调试,点下图的⾍⼦标志
1
t.cubeli.sparksql 2
import org.apache.spark.{SparkConf, SparkContext}3
import org.apache.spark.sql.SparkSession 4
5
6
7
8
object DataFrameCreate {9
def main(args: Array[String]): Unit = {10php网站系统源码
val conf = new SparkConf().setMaster("local").setAppName("df create")11
val sc = new SparkContext(conf)12
val spark = SparkSession.builder().appName("Spark SQL basic example").config("fig.option", "some-value").getOrCreate()13
import spark.implicits._14
val df = ad.json("file:///Users/waixingren/bigdata-java/spark/sparkproj/data/nation.json")15
df.filter($"nationkey"<9).16
groupBy("regionkey").17
count.18
show()19 }20}表单大师有软件吗
在提交了运⾏之后,程序会在断点处停⽌,等待单步调试,如下图所⽰:
湘西魅力
点击step in,我们就可以进⼊到这个filter⽅法内部进⾏源码的跟踪了。
2.远程调试
当我们的代码提交到yarn上之后,就是⼀个分布式运⾏的模式了,这时就没法通过IDE去启动本地的单步调试,这时就需要使⽤远程调试⽅式。这种⽅式eclipse也有,并不是ideallij独有的,⽽是java语⾔为我们提供的,IDE⼯具只不过利⽤了这个特性⽽已。远程调试步骤如下:外国人英文
java下载过程源码下载
基于Spark 2.3.0这个版本,下载地址:
在下拉框选择2.3.0和Source Code
源码编译
源码编译的主要⽬的是为了⽅便我们后期对spark的⼆次开发,如果没有⼆次开发的需求,知识想单步调试spark源码,那么这⼀步也是可以省略的。
对源码包进⾏解压,进⼊源码包根⽬录,编译命令:
把这个编译 后的⼯程导⼊到intellij,步骤如下
⼀路点击next,可以根据实际情况进⾏修改,不修改也可以,最后点完成,执⾏spark源码导⼊,idealilij会进⾏该⼯程的依赖解析,等解析完成后就可以在package试图看到该⼯程的包试图,说明导⼊成功。
(导⼊后intellij要进⾏⼯程的依赖解析,但是因为我们之前进⾏过编译,需要的依赖包已经从远程maven仓库下载到了本地,所以这⾥的依赖接下没有下载过程,只是⼀个简单的的本地解析)
配置远程调试
点击
点击“+”,选择remote
配置jvm远程调试选项,主要是host和port需要修改成spark进程所在的host和jmx端⼝号,如下图,可以修
改“Name:”,“Host”,“Port”,这⾥的host⼀定要是spark运⾏的主机,port需要是远程没有被使⽤的端⼝,并且要记住此端⼝,待会要⽤。
linux文件移动到另一个文件夹配置完之后保存。
在f⽂件中添加以下配置:
关于这个配置的两点说明:
1) 其中的aJavaOptions是⽤来调试driver的,aJavaOptions是⽤来调试executor的,如果driver 和executor不在同⼀个节点,那么端⼝可以相同,如果在同⼀个节点,那么端⼝不能⼀样。
2) 如果suspend=y,说明spark进程在启动时会挂起来,等待ideallij远程连接成功之后在继续启动;如果是n,那么不⽤等待ideallij远程连接,就启动,但是会⼀直监听这个端⼝,等待ideallij远程连接。
远程连接并调试
等spark进程挂起或者启动成功之后(根据suspend是y或者n来决定),在ideallij中设置断点,并启动刚才配置的远程连接,就可以连接到spark的jvm进程上,并进⾏远程的单步调试了 。
总结:spark的学习⼀定要涉及源码的阅读,光学会使⽤api是写不好spark程序,要⽆法进⾏spark性能调优的。当你的断点停⽌在spark 的api⽅法时,step in了,就有⼀个全新的技术世界为了敞开⼤门;step over了,你就⼀直是个码农。
aJavaOptions -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,aJavaOptions -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
1
--end--2
3
扫描下⽅⼆维码4
5
添加好友,备注【交流】6可私聊交流,也可进资源丰富学习7
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论