spark源码单步跟踪阅读-从毛片说起
想当年读大学时,那时毛片还叫毛片,现在有文明的叫法了,叫小电影或者爱情动作片。那时宿舍有位大神,喜欢看各种毛片,当我们纠结于毛片上的马赛克时,大神大手一挥说道:这算啥,阅尽天下毛片,心中自然无码!突然想到我们在学习spark时,也可以有这种精神,当我们能读懂spark源码时,spark的技术世界也就真正为我们敞开了大门。台湾C++大师侯捷说过:源码面前,了无秘密!那我们就从如何单步调试spark源码开始讲起吧。
首先开发工具推荐大家选择IntelliJ,Intellij在和scala语言的结合上,比eclipse要好出太多了,其高效的文件索引机制,也可以让我们非常快速的定位源码。不要太担心快捷键的问题,IntelliJ为了拉eclipse的用户过来,可以将快捷键映射为eclipse常用快捷键,学习成本低了很多。
1.本地调试
package com.tencent.cubeli.sparksql
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.SparkSession
object DataFrameCreate {
? def main(args: Array[String]): Unit={
? ? val conf=new SparkConf().setMaster("local").setAppName("df create")
? ? val sc=new SparkContext(conf)
? ? val spark=SparkSession.builder().appName("Spark SQL basic example").config("spark.some.config.option", "some-value").getOrCreate()
? ? import spark.implicits._
? ? val df=spark.read.json("file:///Users/waixingren/bigdata-java/spark/sparkproj/data/nation.json")
? ? df.filter($"nationkey"<9).
? ? ?groupBy("regionkey").
? ? ?count.
? ? ? show()
? ?}
}
在提交了运行之后,程序会在断点处停止,等待单步调试,如下图所示:
点击step in,我们就可以进入到这个filter方法内部进行源码的跟踪了。
2.远程调试
当我们的代码提交到yarn上之后,就是一个分布式运行的模式了,这时就没法通过IDE去启动本地的单步调试,这时就需要使用远程调试方式。这种方式eclipse也有,并不是ideallij独有的,而是java语言为我们提供的,IDE工具只不过利用了这个特性而已。远程调试步骤如下:
我们后期在知识星球上陆陆续续的源码讲解,都是基于Spark 2.3.0这个版本,下载地址:
http://spark.apache.org/downloads.html
在下拉框选择2.3.0和Source Code
一路点击next,可以根据实际情况进行修改,不修改也可以,最后点完成,执行spark源码导入,idealilij会进行该工程的依赖解析,等解析完成后就可以在package试图看到该工程的包试图,说明导入成功。
(导入后intellij要进行工程的依赖解析,但是因为我们之前进行过编译,需要的依赖包已经从远程maven仓库下载到了本地,所以这里的依赖接下没有下载过程,只是一个简单的的本地解析)
点击Edit Configurations...
点击“+”,选择remote
配置jvm远程调试选项,主要是host和port需要修改成spark进程所在的host和jmx端口号,如下图,可以修改“Name:”,“Host”,“Port”,这里的host一定要是spark运行的主机,port需要是远程没有被使用的端口,并且要记住此端口,待会要用。
配置完之后保存。
在spark-defaults.conf文件中添加以下配置:
spark.driver.extraJavaOptions? -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
spark.executor.extraJavaOptions? -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
关于这个配置的两点说明:
1) 其中的spark.driver.extraJavaOptions是用来调试driver的,spark.executor.extraJavaOptions是用来调试executor的,如果driver和executor不在同一个节点,那么端口可以相同,如果在同一个节点,那么端口不能一样。
2) 如果suspend=y,说明spark进程在启动时会挂起来,等待ideallij远程连接成功之后在继续启动;gallop如果是n,那么不用等待ideallij远程连接,就启动,但是会一直监听这个端口,等待ideallij远程连接。
? ? ?等spark进程挂起或者启动成功之后(根据suspend是y或者n来决定),在ideallij中设置断点,并启动刚才配置的远程连接,就可以连接到spark的jvm进程上,并进行远程的单步调试了 。
总结:spark的学习一定要涉及源码的阅读,光学会使用api是写不好spark程序,要无法进行spark性能调优的。当你的断点停止在spark的api方法时,step in了,就有一个全新的技术世界为了敞开大门;step over了,你就一直是个码农。更多spark经验分享,请加入spark技术学院,bat大牛为你指点迷津!
文章来源:https://blog.csdn.net/rlnLo2pNEfx9c/article/details/80429052
spark源码单步跟踪阅读-从毛片说起的更多相关文章
- Spark源码学习1.2——TaskSchedulerImpl.scala
许久没有写博客了,没有太多时间,最近陆续将Spark源码的一些阅读笔记传上,接下来要修改Spark源码了. 这个类继承于TaskScheduler类,重载了TaskScheduler中的大部分方法,是 ...
- 编译spark源码及塔建源码阅读环境
编译spark源码及塔建源码阅读环境 (一),编译spark源码 1,更换maven的下载镜像: <mirrors> <!-- 阿里云仓库 --> <mirror> ...
- win7+idea+maven搭建spark源码阅读环境
1.参考. 利用IDEA工具编译Spark源码(1.60~2.20) https://blog.csdn.net/He11o_Liu/article/details/78739699 Maven编译打 ...
- spark源码阅读---Utils.getCallSite
1 作用 当该方法在spark内部代码中调用时,会返回当前调用spark代码的用户类的名称,以及其所调用的spark方法.所谓用户类,就是我们这些用户使用spark api的类. 2 内部实现 2.1 ...
- spark源码阅读--SparkContext启动过程
##SparkContext启动过程 基于spark 2.1.0 scala 2.11.8 spark源码的体系结构实在是很庞大,从使用spark-submit脚本提交任务,到向yarn申请容器,启 ...
- emacs+ensime+sbt打造spark源码阅读环境
欢迎转载,转载请注明出处,徽沪一郎. 概述 Scala越来越流行, Spark也愈来愈红火, 对spark的代码进行走读也成了一个很普遍的行为.不巧的是,当前java社区中很流行的ide如eclips ...
- Spark源码分析(一)-Standalone启动过程
原创文章,转载请注明: 转载自http://www.cnblogs.com/tovin/p/3858065.html 为了更深入的了解spark,现开始对spark源码进行分析,本系列文章以spark ...
- 了解Spark源码的概况
本文旨在帮助那些想要对Spark有更深入了解的工程师们,了解Spark源码的概况,搭建Spark源码阅读环境,编译.调试Spark源码,为将来更深入地学习打下基础. 一.项目结构 在大型项目中,往往涉 ...
- spark源码分析以及优化
第一章.spark源码分析之RDD四种依赖关系 一.RDD四种依赖关系 RDD四种依赖关系,分别是 ShuffleDependency.PrunDependency.RangeDependency和O ...
随机推荐
- Linux centosVMware mysql用户管理、常用sql语句、mysql数据库备份恢复
一.mysql用户管理 grant all on *.* to 'user1'@‘127.0.0.1’ identified by 'mimA123'; 创建user1用户 使用user1登录 /us ...
- MySQL数据库索引:索引介绍和使用原则
本篇目录: 一.数据页与索引页 二.聚簇索引与非聚簇索引 三.唯一索引 四.索引的创建 五.索引的使用规则 六.数据库索引失效情况 本篇正文: 一.数据页与索引页 数据库的表存储分为数据页存储和索引页 ...
- cookie、session、localStorage、sessionStorage的区别
cookie的机制 cookie是存储在用户本地终端上的数据.有时也用cookies,指某些网站为了辨别用户身份,进行session跟踪而存储在本地终端上的数据,通常经过加密. Cookie是服务器发 ...
- 【IMU_Ops】------III------ IMU自动化运维平台之CMDB(admin)
说明本文中所有内容仅作为学习使用,请勿用于任何商业用途.本文为原创,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. #A 首先启用admin 通过python manage.p ...
- java-jpa-criteriaBuilder使用
一个复杂的查询例子(包含常用的所有查询方法) CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); //查询结果所 ...
- 题解 P3950 【部落冲突】
树链剖分吼啊 一看就看出是LCT模板题啦 前记 见这么多人写LCT,却很少人写树链剖分,于是我就来一发树链剖分(其实是因为自己不会LCT) 本蒟蒻的写法和诸位写树链剖分的大神有点不同 思路 树链剖分, ...
- USACO 2019 December Contest 随记
Forewords 今年 USACO 的比赛变化挺大的,有部分分了,而且不再是固定十个点了(部分分只说这几个点满足这几个性质,以为十个点的我还高兴了一会,一提交,...),除此之外居然赛后还排名了.这 ...
- Kali环境使用Metasploit生成木马入侵安卓手机
Metasploit是一款开源的安全漏洞检测工具,可以帮助安全和IT专业人士识别安全性问题,验证漏洞的缓解措施,并管理专家驱动的安全性进行评估,提供真正的安全风险情报.这些功能包括智能开发,代码审计, ...
- H.264 SODB RBSP EBSP的区别
SODB(String of Data Bits,数据比特串): 最原始,未经过处理的编码数据 RBSP(Raw Byte Sequence Payload,原始字节序列载荷): 在SODB的后面填加 ...
- java中栈内存与堆内存(JVM内存模型)
java中栈内存与堆内存(JVM内存模型) Java中堆内存和栈内存详解1 和 Java中堆内存和栈内存详解2 都粗略讲解了栈内存和堆内存的区别,以及代码中哪些变量存储在堆中.哪些存储在栈中.内存中的 ...