初識spark-基本概念和例子

前年的文章,備份

spark是一個開源的分佈式計算系統,提供快速的數據分析功能。 官網地址 http://www.spark-project.org/ 據說性能高出hadoop很多(個人理解主要是因爲兩點:內存和cache),而且相對更加簡單,靈活。非常適合需要反覆迭代的計算,比如機器學習。

spark基於scala編寫,對我而言也是門陌生的語言,至今還是有很多不理解的地方。

基本概念

RDD

spark最大的亮點是提出RDD(Resilient Distributed Dataset)的概念,也就是可伸縮的分佈式數據集合,本身只讀,可恢復。spark本身不做物理儲存,通過保存足夠的信息去實際的儲存中計算出RDD

RDD只要通過四種途徑獲取:

1、從共享的文件系統,比如HDFS
2、在驅動程序裏的並行scala集合(例如數組),會發到多個節點上
3、從已存在的RDD轉換
4、通過改變現有的RDD持久性。rdd是一個懶散,短暫的。
改變一個RDD的持久化通過兩個動作:
cache:在第一次計算的時候保存在內存中,可以重用
save:保存到一個分佈式文件系統,比如hdfs,這個保存版本會用於未來的操作

 

緩存形式只是一個提示。
如果集羣中沒有足夠的內存去緩存所有的並行數據集合,spark將在使用它們的時候重新計算,選擇這個方式工作(性能有所下降),如果節點發生故障或者數據集合太大,這個想法是一種鬆散的虛擬內存。

並行操作

RDD可以執行做個並行操作
reduce:通過相關函數合併數據集合,產生結果
collect: 發送所有元素的數據集合到驅動程序。例如,一個簡單的方法去並行更新一個並行中的數組
foreach: 通過用戶提供的函數去遍歷所有元素,可能僅僅是一個不重要的功能
spark目前不支持在mapreduce中的grouped reduce,

共享變量

 

程序員通過函數去調用map,filter,reduce
當一個函數被傳遞到一個spark操作,執行在一個遠程集羣節點上,節點的工作使用的是獨立副本。這些變量被複制到所有機器上。
一般情況下,共享變量的讀寫支持跨任務將是低效的。然而,spark提供兩個共享變量的有限類型:廣播變量和蓄電池。

 

廣播變量
廣播變量允許程序員保持一個只讀變量到每臺機器上,而不是運送它的一個副本和任務。spark使用高效的廣播算法去分配廣播變量,以降低通信成本。
廣播變量被創建後,它應該在集羣中的任何函數中替代值V, v不能再節點中傳輸超過一次。廣播後值V不能被修改,以確保所有節點具有相同過的廣播值。
當一個創建廣播變量b的值v,v是一個共享文件系統保存到一個文件。 b是這個文件路徑的序列化形式。當B在工人節點上查詢,spark首先檢查V是否在本地緩存,並從文件系統讀取。 最初使用hdfs做廣播變量,但是正在開發更有效的流媒體廣播系統。
蓄電池
蓄電池是唯一的價值是:”通過關聯操作,因此可以有效地支持並行的變量。它們可以被用來實現計數器(在MapReduce的)或者sum。spark支持原生的int,double
調用SparkContext.accumulator(v),初始化值v。在集羣中做 += 操作,但是我們不能讀值,只能通過驅動程序去讀值用於
在工人節點上,創建一個單獨的副本加器作爲每個運行任務的線程的線程本地變量,從0開始。
每個任務運行後,工人發送信息到驅動程序,包含每個蓄電池的更新。驅動程序適用於每個操作的每個分區僅更新一次,以防止doublecounting任務時重新執行因失敗
lineage
數據集的出處信息

 

Interpreter Integration
1、編譯輸出class文件到共享文件系統,集羣中的工人通過java class loader加載它們。
2、爲了每一行能夠直接引用單例對象,我們改變了生成代碼
而不是通過靜態方法getInstance

例子

 

給出一些實時統計日誌數據例子,例子都是本地模式計算(集羣模式需要Mesos),僅供參考,實現上而言非常簡單

統計日誌中出現多少次hbase讀取:

日誌的格式每行第5位是標識字段,第6位是響應時間,第7位是類型字段

 

val spark = new SparkContext(“local”,”test”)
val file = spark.textFile(“D:\\data\\keykeys-log\\log.log”)
val lines = file.filter(line => line.contains(“hbase_time”))
println(lines.count());
統計讀取hbase的平均響應時間:
val spark = new SparkContext(“local[2]“, “test”)
val file = spark.textFile(“D:\\data\\keykeys-log\\log.log”)
val lines = file.filter(_.contains(“hbase_time”))
val times = lines.map(dd => dd.split(” “)(6).toInt).reduce(_ + _)
println(“times:” + times/lines.count())
統計hbase的請求類型:
val spark = new SparkContext(“local[2]“, “test”)
val file = spark.textFile(“D:\\data\\keykeys-log\\log.log”)
val lines = file.filter(_.contains(“hbase_time”))
val ones = lines.map(word => (word.split(” “)(7), 1)).reduceByKey(_ + _)
ones.foreach(println)
參考:
Spark: Cluster Computing with Working Sets. Matei Zaharia, Mosharaf Chowdhury, Michael J. Franklin, Scott Shenker, Ion Stoica. USENIX HotCloud 2010. June 2010.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章