注解在Spark的源碼中周圍都能看見,
例如:@volatile:這是一個多線程并發控制輕量級框架所使用的一個注解,在多線程并發操作一個全局變量的時候,線程首先得copy一個副本到本地變量中,處理完成之后,然后再對全局變量進行update
不同線程去update的時候,會有很多問題:例如版本問題,業務邏輯的不一致性
當加了這個注解之后,就是說每次讀取這個變量的時候,都會自動地到各機器刷新一下最新的數據,也就是正常情況下,可以獲取當前情況下最新的值
@deprecated:是說在當前版本中可用,但是在以后的巨大的版本變化中,可能會被丟棄
@DeveloperApi:就是框架開發者使用的API
@Experimental:說明是實驗性的功能
@transient:當序列化的時候,我們需要序列化所有的成員進磁盤,反序列化的時候也需要反序列化,當有這個關鍵字的時候,不參與序列化和反序列化
@varargs:參數可變
關于提取器:在進行模式匹配的時候,是需要提取器的,case class 和 case object就天生實現了提取器,一般看見有case的地方,就有提取器
這可以極大地簡化了機器/線程之間的通信
例子:
@Coder("Scala") case class Person1(name:String,age:Int)
class DTCoder(val name:String,val sal:Int)
object DTCoder {
def apply(name:String,sal:Int) = new DTCoder(name,sal)
def unapply(information:String) = {
Some(information.substring(0,information.indexOf(" ")),information.substring(information.indexOf(" ")+1))
}
}
class Coder(val name:String) extends annotation.Annotation
object HelloExtractor {
def main(args:Array[String]){
val person1=Person1("Spark",6)
//這里就是調用了apply工廠構造方法構造出類的實例對象
val Person1(name,age)=person1
//調用upapply方法把person1實例中的name和age提取出來,并賦值給Person1的類的成員
println(name+":"+age)
person1 match {
case Person1(name,age) => println(name+":"+age)
}
//只需要在伴生對象中定義好unapply方法,就能實現提取器
//這個例子可以理解為,可以把一個對象封裝成一個String,然后傳給另外一臺機器,然后通過String,提取出對象,這樣可以很好地節省網絡帶寬,磁盤,內存等等
val DTCoder(dtName,sal)="Spark 1000"
}
}
歸納總結:1.Spark源碼中關鍵注解的說明:@volatile,@deprecated,@DeveloperApi,@Experimental,@transient,@varargs
2.關于提取器
3.例子
cccc.png