Apache Spark是專爲大規模數據處理而設計的快速通用的計算引擎。目前已經造成一個高速發展應用普遍
的生態系統。html
Apache Spark特性:
1,快速
大多數操做均在內存中迭代,只有少部分函數須要落地到磁盤。
2,易用性
支持scala、Java、Python、R等語言;提供超過80個算子,API使用及其方便。
3,通用性
Spark提供了針對數據處理的一站式解決方案,計算時用Spark Core算子(替代Hadoop Map/Reduce)
,批處理時用Spark SQL(替代HiveSQL),實時計算用Spark Streaming(替代Stom),機器學習用
Spark MLlib(替代Mahout);另外,經過Spark GraphX進行圖計算。
4,跨平臺
Spark可使用Local模式,Standalone模式,Cluster模式運行。
Local模式:在本地運行調試,支持斷點,能夠指定並行線程數。
Standalone模式:Spark管理資源,有Master和Worker,至關於ResourceManager和NodeManager。
Cluster模式:分佈式模式,用於生產環境。資源管理器使用Yarn或者Mesos。
express
Spark的適用場景
目前大數據處理場景有如下幾個類型:
複雜的批量處理(Batch Data Processing),偏重點在於處理海量數據的能力,至於處理速度可忍受,一般的時間多是在數十分鐘到數小時;
基於歷史數據的交互式查詢(Interactive Query),一般的時間在數十秒到數十分鐘之間
基於實時數據流的數據處理(Streaming Data Processing),一般在數百毫秒到數秒之間編程
Spark成功案例
目前大數據在互聯網公司主要應用在金融、廣告、報表、推薦系統等業務上。在廣告業務方面須要大數據作應用分析、效果分析、定向優化等,在推薦系統方面則須要大數據優化相關排名、個性化推薦以及熱點點擊分析等。這些應用場景的廣泛特色是計算量大、效率要求高。 騰訊 / 小米 / 淘寶 / 優酷土豆數組
Scala介紹
Scala 是一門多範式(multi-paradigm)的編程語言,設計初衷是要集成面向對象編程和函數式編程的各類特性。Scala 運行在Java虛擬機上,併兼容現有的Java程序。安全
特性
1,面向對象
Scala是一種純面向對象的語言,每一個值都是對象。對象的數據類型以及行爲由類和特質(trait)描述。
2,函數式編程
Scala也是一種函數式語言,其函數也能當成值來使用。Scala提供了輕量級的語法用以定義匿名函數,支持高階函數,容許嵌套多層函 數,並支持柯里化。Scala的case class及其內置的模式匹配至關於函數式編程語言中經常使用的代數類型。
3,靜態類型
Scala具有類型系統,經過編譯時檢查,保證代碼的安全性和一致性。
4,併發性
Scala使用Actor做爲其併發模型,Actor是相似線程的實體,經過郵箱發收消息。Actor能夠複用線程,所以能夠在程序中可使用數百萬個Actor,而線程只能建立數千個。在2.10以後的版本中,使用Akka做爲其默認Actor實現。閉包
函數式編程
函數式編程是種編程方式,它將電腦運算視爲函數的計算。函數編程語言最重要的基礎是λ演算(lambda calculus),並且λ演算的函數能夠接受函數看成輸入(參數)和輸出(返回值)。
特性
1,函數是第一等公民
函數編程支持函數做爲第一類對象,有時稱爲閉包或者仿函數(functor)對象。
2,惰性計算
在惰性計算中,表達式不是在綁定到變量時當即計算,而是在求值程序須要產生表達式的值時進行計算。延遲的計算使您能夠編寫可能潛在地生成無窮輸出的函數。
3,支用表達式不用語句
"表達式"(expression)是一個單純的運算過程,老是有返回值;"語句"(statement)是執行某種操做,沒有返回值。函數式編程要求,只使用表達式,不使用語句。也就是說,每一步都是單純的運算,並且都有返回值。
sc.thriftParquetFile(fileStr, classOf[SomeClass], force = true).filter(infor => infor.classId == CLASSID_REPAY).persist(StorageLevel.DISK_ONLY)
4,沒有"反作用"
所謂"反作用"(side effect),指的是函數內部與外部互動(最典型的狀況,就是修改全局變量的值),產生運算之外的其餘結果。
函數式編程強調沒有"反作用",意味着函數要保持獨立,全部功能就是返回一個新的值,沒有其餘行爲,尤爲是不得修改外部變量的值。併發
RDD(Resilient Distributed Datasets),彈性分佈式數據集,它是對分佈式數據集的一種內存抽象,經過受限的共享內存方式來提供容錯性,同時這種內存模型使得計算比傳統的數據流模型要高效。RDD具備5個重要的特性,以下圖所示:機器學習
1.一組分區,數據集的基本組成單位。
2.計算每個數據分區的函數。
3.對parent RDD的依賴,這個依賴描述了RDD之間的lineage(血統)。
4.可選,對於鍵值對RDD,有一個Partitioner(一般是HashPartitioner,RangePartitioner)。
5.可選,一組Preferred location信息(例如,HDFS文件的Block所在location信息)。編程語言
Spark對數據的處理過程包括輸入、運行轉換、輸出等過程,而這些過程在Spark中以算子的形式定義。 算子是RDD中定義的函數,能夠對RDD中的數據進行轉換和操做。分佈式
從大方向來講,Spark算子大體能夠分爲如下兩類:
1)Transformation 變換/轉換算子:這種變換並不觸發提交做業,完成做業中間過程處理。
Transformation 操做是延遲計算的,也就是說從一個RDD 轉換生成另外一個 RDD 的轉換操做不是立刻執行,
須要等到有 Action 操做的時候纔會真正觸發運算。
按照處理數據的結構類型,Transformation算子又能夠分爲如下兩類:
a)Value數據類型的Transformation算子,這種變換並不觸發提交做業,針對處理的數據項是Value型數據
b)Key-Value數據類型的Transformation算子,這種變換並不觸發提交做業,針對處理的數據項是
Key-Value型的數據對。
2)Action行動算子:這類算子會觸發SparkContext提交Job做業。
Action 算子會觸發 Spark 提交做業(Job),並將數據輸出 Spark系統。
1)Value型數據類型的Transformation算子 A)輸入分區與輸出分區一對一型 a) map算子 b) flatMap算子 c) mapPartitions算子 d) glom算子 B)輸入分區與輸出分區多對一型 a) union算子 b) cartesian算子 C)輸入分區與輸出分區多對多型 a) groupBy算子 D)輸出分區爲輸入分區子集型 a) filter算子 b) distinct算子 c) subtract算子 d) sample算子 e) takeSample算子 E)Cache型 a) cache算子 d) persist算子 2)Key-Value型數據類型的Transformation算子 A)輸入分區與輸出分區一對一型 a) mapValues算子 B)對單個RDD彙集 a) combineByKey算子 b) reduceByKey算子 c) partitionBy算子 C)對兩個RDD彙集 a) Cogroup算子 D)鏈接 a) join算子 b) leftOutJoin算子 c) rightOutJoin算子 3)Action算子 A)無輸出 a) foreach算子 B)HDFS a) saveAsTextFile算子 b) saveAsObjectFile算子 C)集合和數據類型 a) collect算子 b) collectAsMap算子 c) reduceByKeyLocally算子 d) lookup算子 e) count算子 f) top算子 g) reduce算子 h) fold算子 i) aggregate算子 4)數據加載的Transformation算子 A)文件讀取 a) textFile算子 B)內存生成 a) makeRDD算子 b) parallelize算子
1)map: 對RDD中的每一個元素都執行一個指定的函數類(映射)產生一個新的RDD。任何原RDD中的元素在新RDD中都有且只有一個元素與之對應。固然map也能夠把Key元素變成Key-Value對。
2)flatMap:將原來 RDD 中的每一個元素經過函數 f 轉換爲新的元素,並將生成的 RDD 的每一個集合中的元素合併爲一個集合。
3) mapPartiions:map是對rdd中的每個元素進行操做,而mapPartitions (foreachPartition)則是對rdd中的每一個分區的迭代器進行操做mapPartitions效率比map高的多。mapPartitions函數獲取到每一個分區的迭代器,在函數中經過這個分區總體的迭代器對整個分區的元素進行操 做。
4) glom:將分區元素轉換成數組。
5) union:相同數據類型RDD進行合併,並不去重。
6)cartesian:對RDD內的全部元素進行笛卡爾積操做
7) groupBy:將元素經過函數生成相應的 Key,數據就轉化爲 Key-Value 格式,以後將 Key 相同的元素分爲一組。
8)filter:對RDD元素進行過濾操做
9)distinct:對RDD中的元素去重操做
10)subtract:RDD間進行減操做,去除相同數據元素(去掉含有重複的項)
11)sample:對RDD元素進行採樣操做,獲取全部元素的子集(按照比例隨機抽樣)
12)takesample:上面的sample函數是一個原理,不一樣的是不使用相對比例採樣,而是按設定的採樣個數進行採樣
1)mapValues:(對Value值進行變換)原RDD中的Key保持不變,與新的Value一塊兒組成新的RDD中的元素。所以,該函數只適用於元素爲KV對的RDD。即針對(Key, Value)型數據中的 Value 進行 Map 操做,而不對 Key 進行處理。
2)combineByKey:(按key聚合)至關於將元素爲 (Int, Int) 的 RDD轉變爲了 (Int,Seq[Int]) 類型元素的 RDD。
3)reduceByKey:reduceByKey 是比 combineByKey 更簡單的一種狀況,只是兩個值合併成一個值,即相同的key合併value。
4)partitionBy:按key值對RDD進行從新分區操做。
5)cogroup:按key值彙集操做。
6)join:按key值聯結。
1)foreach:循環遍歷每個元素。
2)saveAsTextFile:將最終的結果數據以文本格式保存到指定的HDFS目錄中
3)saveAsObjectFile:將最終的結果數據以二進制文件格式保存到指定的HDFS目錄中
4)collect:收集元素
5)collectAsMap: 收集key/value型的RDD中的元素
6)reduceByKeyLocally:實現的是先reduce再collectAsMap的功能,先對RDD的總體進行reduce操做,而後再收集全部結果返回爲一個HashMap
7)lookup:查找元素,對(Key,Value)型的RDD操做,搜索指定Key對應的元素
8)count:計算元素個數
9)top:top(n)尋找值最大的前n個元素
10)reduce:經過函數func先彙集各分區的數據集,再彙集分區之間的數據,func接收兩個參數,返回一個新值,新值再作爲參數繼續傳遞給函數func,直到最後一個元素
11)fold:合併
12)aggregateByKey:採用歸併的方式進行數據聚合操做,這種彙集是並行化的,經過key進行聚合。
Spark 核心概念RDD:DD:http://sharkdtu.com/posts/spark-rdd.html Spark RDD詳解:詳解:https://blog.csdn.net/wangxiaotongfan/article/details/51395769 Scala教程:教程:http://www.runoob.com/scala/scala-tutorial.html