• 1
  • 2
  • 3
  • 4
  • 5
阿里云应用开发 首 页  »  帮助中心  »  云服务器  »  阿里云应用开发
Apache Spark源码如何进行代码跟读
发布日期:2016-8-2 13:8:13

  1、概要

  今天请到阿里云的工作人员,简单谈谈spark,Apache Spark源码如何进行代码跟读。今天不谈Spark中复杂的技术实现,只聊聊怎样进行代码跟读。众所周知,Spark使用scala进行开发,因为scala有众多的语法糖,很多时候代码跟着跟着就觉着线索跟丢掉了,此外Spark基于Akka来进行消息交互,那怎样知道谁是接收方呢?

  2、new Throwable().printStackTrace

  代码跟读时,常会借助于日志,针对日志中输出的每一句,我们都很想知道它们的调用者是谁。但是有时候苦于对spark系统的了解程度不深,或对scala认识不够,一时半会内无法找到答案,那有没有什么简便的办法呢?

  我的办法就是在日志出现的地方加入下面一句话,如下所示

  new Throwable().printStackTrace()

  现在举一个实际的例子来说明问题。

  比如我们在启动spark-shell后,输入一句非常简单的sc.textFile("README.md"),会输出如下所示的log

 

  那我很想知道是第二句日志所在的tryToPut函数是被谁调用的该怎么办?

  方法就是打开MemoryStore.scala,找到下述语句

  logInfo("Block %s stored as %s in memory (estimated size %s, free %s)".format

(

blockId, valuesOrBytes, Utils.bytesToString(size),

 Utils.bytesToString(freeMemory)))

  在这句话上,添加如下语句

  new Throwable().printStackTrace()

  然后,重新进行源码编译

  sbt/sbt assembly

  再次打开spark-shell,执行sc.textFile("README.md"),就可得到如下所示的输出,从中可清楚知道tryToPut的调用者是谁

 

  3、git同步

  对代码作了修改后,若并不想提交代码,那该怎样将最新的内容同步到本地呢?

  git reset --hard git pull origin master

  4、Akka消息跟踪

  追踪消息的接收者是谁,相对来说比较容易,只要使用好grep就行了,当然前提是要对actor model有一点了解。

  还是举个实例吧,我们知道CoarseGrainedSchedulerBackend会发送LaunchTask消息出来,那谁是接收方呢?只需要执行下面的脚本即可。

  grep LaunchTask -r core/src/main

  从下面所示的输出中,可清楚看出CoarseGrainedExecutorBackend是LaunchTask的接收方,接收到该函数后的业务处理,只需去看看接收方的receive函数即可。

  

  5、小结

  今天的内容相对简单,没有技术含量,自己做个记述,免得时间久了,不记得。