什么是spark
Spark是一個基于內存計算的開源的集群計算系統,目的是讓數據分析更加快速。Spark非常小巧玲瓏,由加州伯克利大學AMP實驗室的Matei為主的小團隊所開發。使用的語言是Scala,項目的core部分的代碼只有63個Scala文件,非常短小精悍。
Spark 啟用了內存分布數據集,除了能夠提供交互式查詢外,它還可以優化迭代工作負載。
Spark 是在 Scala 語言中實現的,它將 Scala 用作其應用程序框架。與 Hadoop 不同,Spark 和 Scala 能夠緊密集成,其中的 Scala 可以像操作本地集合對象一樣輕松地操作分布式數據集。
spark特點概括為“輕、快、靈和巧”。
輕:Spark 0.6核心代碼有2萬行,Hadoop 1.0為9萬行,2.0為22萬行。一方面,感謝Scala語言的簡潔和豐富表達力;另一方面,Spark很好地利用了Hadoop和Mesos(伯克利 另一個進入孵化器的項目,主攻集群的動態資源管理)的基礎設施。雖然很輕,但在容錯設計上不打折扣。
快:Spark 對小數據集能達到亞秒級的延遲,這對于Hadoop MapReduce是無法想象的(由于“心跳”間隔機制,僅任務啟動就有數秒的延遲)。就大數據集而言,對典型的迭代機器 學習、即席查詢(ad-hoc query)、圖計算等應用,Spark版本比基于MapReduce、Hive和Pregel的實現快上十倍到百倍。其中內存計算、數據本地性 (locality)和傳輸優化、調度優化等該居首功,也與設計伊始即秉持的輕量理念不無關系。
靈:Spark 提供了不同層面的靈活性。在實現層,它完美演繹了Scala trait動態混入(mixin)策略(如可更換的集群調度器、序列化庫);在原語(Primitive)層,它允許擴展新的數據算子 (operator)、新的數據源(如HDFS之外支持DynamoDB)、新的language bindings(Java和Python);在范式(Paradigm)層,Spark支持內存計算、多迭代批量處理、即席查詢、流處理和圖計算等多種 范式。
巧: 巧在借勢和借力。Spark借Hadoop之勢,與Hadoop無縫結合;接著Shark(Spark上的數據倉庫實現)借了Hive的勢;圖計算借 用Pregel和PowerGraph的API以及PowerGraph的點分割思想。一切的一切,都借助了Scala(被廣泛譽為Java的未來取代 者)之勢:Spark編程的Look'n'Feel就是原汁原味的Scala,無論是語法還是API。在實現上,又能靈巧借力。為支持交互式編 程,Spark只需對Scala的Shell小做修改(相比之下,微軟為支持JavaScript Console對MapReduce交互式編程,不僅要跨越Java和JavaScript的思維屏障,在實現上還要大動干戈)。
Spark首先是一種粗粒度數據并行(data parallel)的計算范式。
數據并行跟任務并行(task parallel)的區別體現在以下兩方面。(1)計算的主體是數據集合,而非個別數據。(2)集合內的所有數據都經過同樣的算子序列。
Spark 的突破在于,在保證容錯的前提下,用內存來承載工作集。內存的存取速度快于磁盤多個數量級,從而可以極大提升性能。關鍵是實現容錯,傳統上有兩種方法:日 志和檢查點。考慮到檢查點有數據冗余和網絡通信的開銷,Spark采用日志數據更新。細粒度的日志更新并不便宜,而且前面講過,Spark也不擅長。 Spark記錄的是粗粒度的RDD更新,這樣開銷可以忽略不計。鑒于Spark的函數式語義和冪等特性,通過重放日志更新來容錯,也不會有副作用。