Apache Spark 是專爲大規模數據處理而設計的快速通用的計算引擎。html
Spark是UC Berkeley AMP lab (加州大學伯克利分校的AMP實驗室)所開源的類Hadoop MapReduce的通用並行框架,Spark,擁有Hadoop MapReduce所具備的優勢;但不一樣於MapReduce的是Job中間輸出結果能夠保存在內存中,從而再也不須要讀寫HDFS,所以Spark能更好地適用於數據挖掘與機器學習等須要迭代的MapReduce的算法。算法
Spark 是一種與 Hadoop 類似的開源集羣計算環境,可是二者之間還存在一些不一樣之處,這些有用的不一樣之處使 Spark 在某些工做負載方面表現得更加優越,換句話說,Spark 啓用了內存分佈數據集,除了可以提供交互式查詢外,它還能夠優化迭代工做負載。apache
Spark 是在 Scala 語言中實現的,它將 Scala 用做其應用程序框架。與 Hadoop 不一樣,Spark 和 Scala 可以緊密集成,其中的 Scala 能夠像操做本地集合對象同樣輕鬆地操做分佈式數據集。編程
儘管建立 Spark 是爲了支持分佈式數據集上的迭代做業,可是實際上它是對 Hadoop 的補充,能夠在 Hadoop 文件系統中並行運行。經過名爲 Mesos 的第三方集羣框架能夠支持此行爲。Spark 由加州大學伯克利分校 AMP 實驗室 (Algorithms, Machines, and People Lab) 開發,可用來構建大型的、低延遲的數據分析應用程序。數組
1.更快的速度:內存計算下,Spark 比 Hadoop 快100倍。緩存
1.內存計算引擎,提供Cache機制來支持須要反覆迭代計算或者屢次數據共享,減小數據讀取的I/O開銷多線程
2.DAG引擎,減小屢次計算之間中間結果寫到HDFS的開銷;併發
3.使用多線程池模型來減小task啓動開銷,shuffle過程當中避免沒必要要的sort操做已經減小磁盤I/O操做;框架
2.易用性:機器學習
1.Spark 提供了80多個高級運算符。
2.提供了豐富的API,支持JAVA,Scala,Python和R四種語言;
3.代碼量比MapReduce少2~5倍;
3.通用性:Spark 提供了大量的庫,包括SQL、DataFrames、MLlib、GraphX、Spark Streaming。 開發者能夠在同一個應用程序中無縫組合使用這些庫。
4.支持多種資源管理器:Spark 支持 Hadoop YARN,Apache Mesos,及其自帶的獨立集羣管理器
Spark Streaming:構建在Spark上處理Stream數據的框架,基本的原理是將Stream數據分紅小的時間片段(幾秒),以相似batch批量處理的方式來處理這小部分數據。Spark Streaming構建在Spark上,一方面是由於Spark的低延遲執行引擎(100ms+),雖然比不上專門的流式數據處理軟件,也能夠用於實時計算,另外一方面相比基於Record的其它處理框架(如Storm),一部分窄依賴的RDD數據集能夠從源數據從新計算達到容錯處理目的。此外小批量處理的方式使得它能夠同時兼容批量和實時數據處理的邏輯和算法。方便了一些須要歷史數據和實時數據聯合分析的特定應用場合。
1.MapReduce侷限性:
1.僅支持Map和Reduce兩種操做;
2.處理效率低效;不適合迭代計算(如機器學習、圖計算等),交互式處理(數據挖掘)和流失處理(日誌分析)
3.Map中間結果須要寫磁盤,Reduce寫HDFS,多個MR之間經過HDFS交換數據;
4.任務調度和啓動開銷大;
5.沒法充分利用內存;(與MR產生時代有關,MR出現時內存價格比較高,採用磁盤存儲代價小)
6.Map端和Reduce端均須要排序;
2.MapReduce編程不夠靈活。(比較Scala函數式編程而言)
3.框架多樣化[採用一種框架技術(Spark)同時實現批處理、流式計算、交互式計算]:
1.批處理:MapReduce、Hive、Pig;
2.流式計算:Storm
3.交互式計算:Impala
1.RDD:Resilient Distributed Datasets,彈性分佈式數據集
1.分佈在集羣中的只讀對象集合(由多個Partition 構成);
2.能夠存儲在磁盤或內存中(多種存儲級別);
3.經過並行「轉換」操做構造;
4.失效後自動重構;
5.RDD基本操做(operator)
大體能夠分爲三大類算子:
3.示例:
4.Spark RDD cache/persist
1.Spark RDD cache
1.容許將RDD緩存到內存中或磁盤上,以便於重用
2.提供了多種緩存級別,以便於用戶根據實際需求進行調整
3.cache使用
2.以前用MapReduce實現過WordCount,如今咱們用Scala實現下wordCount.是否是很簡潔呢?!
Scala學習連接:https://yq.aliyun.com/topic/69
import org.apache.spark.{SparkConf, SparkContext} object SparkWordCount{ def main(args: Array[String]) { if (args.length == 0) { System.err.println("Usage: SparkWordCount <inputfile> <outputfile>") System.exit(1) } val conf = new SparkConf().setAppName("SparkWordCount") val sc = new SparkContext(conf) val file=sc.textFile("file:///hadoopLearning/spark-1.5.1-bin-hadoop2.4/README.md") val counts=file.flatMap(line=>line.split(" ")) .map(word=>(word,1)) .reduceByKey(_+_) counts.saveAsTextFile("file:///hadoopLearning/spark-1.5.1-bin-hadoop2.4/countReslut.txt") } }
3.關於RDD的Transformation與Action的特色咱們介紹下;
1.接口定義方式不一樣:
Transformation: RDD[X]-->RDD[y]
Action:RDD[x]-->Z (Z不是一個RDD,多是一個基本類型,數組等)
2.惰性執行:
Transformation:只會記錄RDD轉化關係,並不會觸發計算
Action:是觸發程序執行(分佈式)的算子。
程序的執行流程:
1.Local(本地模式):
1.單機運行,一般用於測試;
1.local:只啓動一個executor
2.local[k]:啓動k個executor
3.local[*]:啓動跟cpu數目相同的executor
2.standalone(獨立模式)
1.獨立運行在一個集羣中
3.Yarn/mesos
1.運行在資源管理系統上,好比Yarn或mesos
2.Spark On Yarn存在兩種模式
1.yarn-client
2.yanr-cluster
3.比較兩種方式區別:
1.基於日誌數據的快速查詢系統業務;
1.構建於Spark之上的SparkSQL ,利用其快速以及內存表等優點,承擔了日誌數據的即席查詢工做。
2.典型算法的Spark實現
1.預測用戶的廣告點擊機率;
2.計算兩個好友間的共同好友數;
3.用於ETL的SparkSQL和DAG任務;