《深入理解Spark:核心思想与源码分析》一书前言的内容请看链接《深入理解SPARK:核心思想与源码分析》一书正式出版上市
《深入理解Spark:核心思想与源码分析》一书第一章的内容请看链接《第1章 环境准备》
《深入理解Spark:核心思想与源码分析》一书第二章的内容请看链接《第2章 SPARK设计理念与基本架构》
Utils是Spark中最常用的工具类之一,如果不关心其实现,也不会对理解Spark有太多影响。但是对于Scala或者Spark的初学者来说,通过了解Utils工具类的实现,也是个不错的入门途径。下面将逐个介绍Utils工具类提供的常用方法。
1.localHostName
功能描述:获取本地机器名。
def localHostName(): String ={
customHostname.getOrElse(localIpAddressHostname)
}
2.getDefaultPropertiesFile
功能描述:获取默认的Spark属性文件。
def getDefaultPropertiesFile(env: Map[String, String] = sys.env): String ={
env.get("SPARK_CONF_DIR")
.orElse(env.get("SPARK_HOME").map{ t => s"$t${File.separator}conf"})
.map { t=> new File(s"$t${File.separator}spark-defaults.conf")}
.filter(_.isFile)
.map(_.getAbsolutePath)
.orNull
}
3.loadDefaultSparkProperties
功能描述:加载指定文件中的Spark属性,如果没有指定文件,则加载默认Spark属性文件的属性。
def loadDefaultSparkProperties(conf:SparkConf, filePath: String = null):String ={
val path=Option(filePath).getOrElse(getDefaultPropertiesFile())
Option(path).foreach { confFile=>getPropertiesFromFile(confFile).filter{case (k,v) =>k.startsWith("spark.")
}.foreach {case (k, v) =>conf.setIfMissing(k, v)
sys.props.getOrElseUpdate(k, v)
}
}
path
}
4.getCallSite
功能描述:获取当前SparkContext的当前调用堆栈,将栈里最靠近栈底的属于spark或者Scala核心的类压入callStack的栈顶,并将此类的方法存入lastSparkMethod;将栈里最靠近栈顶的用户类放入callStack,将此类的行号存入firstUserLine,类名存入firstUserFile,最终返回的样例类CallSite存储了最短栈和长度默认为20的最长栈的样例类。在JavaWordCount例子中,获得的数据如下:
最短栈:JavaSparkContext at JavaWordCount.java:44;
最长栈:org.apache.spark.api.java.JavaSparkContext.(JavaSparkContext.scala:61)org.apache.spark.examples.JavaWordCount.main(JavaWordCount.java:44)。
def getCallSite(skipClass: String => Boolean = coreExclusionFunction): CallSite ={
val trace= Thread.currentThread.getStackTrace().filterNot { ste: StackTraceElement =>ste== null || ste.getMethodName == null || ste.getMethodName.contains("getStackTrace")
}
var lastSparkMethod= ""var firstUserFile= ""var firstUserLine= 0var insideSpark= truevar callStack= new ArrayBuffer[String]() :+ ""
for (el
lastSparkMethod= if (el.getMethodName == "") {
el.getClassName.substring(el.getClassName.lastIndexOf('.') + 1)
}else{
el.getMethodName
}
callStack(0) = el.toString //Put last Spark method on top of the stack trace.
} else{
firstUserLine=el.getLineNumber
firstUserFile=el.getFileName
callStack+=el.toString
insideSpark= false}
}else{
callStack+=el.toString
}
}
v