Spark 巨量資料處理基礎教學

45
專業代理上課員 : 煞氣 a 凱仁 蒕!!!!耷⸱!!⅀㏔㿂!!!!!!!!!!!!!!!!痻 偶腰回夾了拉

Transcript of Spark 巨量資料處理基礎教學

Page 1: Spark 巨量資料處理基礎教學

專業代理上課⼈人員 :煞氣a凱仁

乾 偶腰回夾了拉

Page 2: Spark 巨量資料處理基礎教學

什麼是Spark ?

2

Apache Spark是⼀一個開源叢集運算框架,最初是由加州⼤大學柏克萊分校AMPLab所開發。相對於Hadoop的MapReduce會在執⾏行完⼯工作後將中介資料存放到磁碟中,Spark使⽤用了記憶體內運算技術,能在資料尚未寫⼊入硬碟時即在記憶體內分析運算。

Page 3: Spark 巨量資料處理基礎教學

巨量資料處理架構• 重複⼯工作:許多專有系統在解決同樣問題,如分散式作業以及容錯。舉例,⼀一個分散式的 SQL 引擎或⼀一個機器學習系統都需要實現平⾏行聚合。這些問題在每個專有系統中會重複地被解決。

• 組合問題:在不同系統之間進⾏行組合計算是費⼒力⼜又不討好的事情。對於特定的⼤大數據應⽤用程式⽽而且,中間資料集是⾮非常⼤大的,⽽而且移動的本也⾮非常⾼高,⺫⽬目前環境中採⽤用副本機制,將資料複製到穩定儲存系統(HDFS),以便在不同引擎進⾏行分享。但這樣往往⽐比運算花費代價要⼤大許多。

3

Page 4: Spark 巨量資料處理基礎教學

巨量資料處理架構•適⽤用範圍的限制:如果⼀一個應⽤用不適合⼀一個專有的計算系統,那麼使⽤用者只能換⼀一個系統,或重新定義⼀一個新的計算系統。

•資源設定:在不同計算引擎之間進⾏行資源的動態共⽤用是⽐比較困難的。因為⼤大多數計算引擎都會假設它們在程式執⾏行結束之前擁有相同的機器節點的資源。

•管理問題:對於多個專有系統,需要花費更多時間與精⼒力來管理與部署。我們終端使⽤用者,要學習多種API與系統模型。

4

Page 5: Spark 巨量資料處理基礎教學

Hadoop 問題點

5

• 我們都知道 Google 的 MapReduce,他是⼀一個簡單通⽤用與⾃自動容錯的批次處理計算模型。http://static.googleusercontent.com/media/research.google.com/zh-TW//archive/mapreduce-osdi04.pdf

• 由於 Hadoop 很多⼦子專案都繼承 MR 模型,對於其他類型計算,諸如互動式與串流式計算,並不適合被拿來使⽤用。導致⼤大量不同於 MR 的專有資料處理模型出現,Ex:Storm、Impala與GraphLab。

• 然⽽而隨著新模型的不斷出現,似乎對於巨量資料處理⽽而⾔言,不同類型的作業應該需要⼀一系列不同的處理架構才可以極佳地完成。但是這些專有系統也有⼀一些不⾜足之處。

Page 6: Spark 巨量資料處理基礎教學

Spark 巨量資料處理架構

6

• Spark 採⽤用⼀一個 RDD 概念(⼀一種新的抽象的彈性資料集),在某種程度上 Spark 是對 MapReduce 模型的⼀一種擴充。

•主要是把 MR 不擅⻑⾧長的計算⼯工作(反覆運算、互動式與串流式)進⾏行改善,並提出⼀一個統⼀一的引擎。

•因為 MR 缺乏⼀一種特性,就是在平⾏行計算的各個階段劑型有效的資料共⽤用,這種共⽤用就是 RDD 的本質。利⽤用這種本質來達到這些運算模式。

•在叢集處理的容錯⽅方式,不像Hadoop與 Dryad將計算建置成⼀一個無環圖的⼯工作集。

Page 7: Spark 巨量資料處理基礎教學

RDD 表達能⼒力

7

•反覆運算演算法:這是⺫⽬目前專有系統實現⽐比較普遍的應⽤用場景,⽤用於圖型處理與機器學習。RDD 能夠極佳的實現這些模型,包含Pregel、HaLoop、GraphLab等模型。

•關連式查詢:對 MR 來說⾮非常重要的需求就是SQL查詢,包含⻑⾧長期執⾏行、數⼩小時的批次處理作業與互動式查詢。在 MR 上有其內在缺點,如其容錯的模型⽽而導致速度很慢。利⽤用RDD實現許多通⽤用的資料庫引擎特性,使效能提升。

Page 8: Spark 巨量資料處理基礎教學

RDD 表達能⼒力

8

• MapReduce 批次處理:RDD提供的介⾯面是 MR 的超集合,所以 RDD 可以有效地執⾏行與利⽤用 MR 實現應⽤用程式,另外 RDD 還適合更加抽象的以 DAG 為基礎的應⽤用程式,如 DryadLINQ。

•串流式處理:⺫⽬目前串流式系統只提供有限容錯處理,需要消耗系統⾮非常⼤大的複製代價與⾮非常⻑⾧長的容錯時間。然⽽而 RDD 實現⼀一個新的模型—離散資料流程(D-Stream),D-Stream 將串流計算當作⼀一系列的短⼩小的批次處理操作,⽽而⾮非常駐有狀態的操作,將兩個離散串流之間的狀態存在RDD中。並允許 RDD 的繼承關係圖(Lineage)進⾏行平⾏行性的恢復,⽽而不需要進⾏行資料複製。

Page 9: Spark 巨量資料處理基礎教學

Spark Ecosystem

9

Page 10: Spark 巨量資料處理基礎教學

處理的基本情況

10

我們可以將巨量資料處理分為以下三種情況: • 複雜的批次資料處理(batch data processing):時間⻑⾧長,跨度為

10min - N hr。

• 以歷史資料為基礎的互動查詢(interactive query):時間通常為 10 sec - N min。

• 以即時資料流為基礎的資料處理(streaming data processing):時間通常為 N ms - N sec。

Page 11: Spark 巨量資料處理基礎教學

Spark ⼦子專案對應

11

• Spark Core:以 RDD 提供了豐富的基礎操作介⾯面,利⽤用 DAG 進⾏行統⼀一⼯工作規劃,使 Spark 能夠靈活地處理類似 MR 的批次作業。

• Spark SQL:相容 Hive 介⾯面 HQL,提供⽐比 Hive 更好查詢速度(10 - 100 x)的分散式 SQL 引擎。

• Spark Streaming:將串流式計算分解成⼀一系列短⼩小的批次處理作業,利⽤用 Spark 輕量級與低延遲時間的排程架構,來⽀支援串流處理。⺫⽬目前已⽀支援資料源套件,Kafka、Flume、ELK、Twitter 與 TCP sockets等。

Page 12: Spark 巨量資料處理基礎教學

Spark ⼦子專案對應

12

• GraphX:已 Spark 為基礎的圖形計算架構,相容 Pregel 與 GraphLab 介⾯面,增強圖型建置與圖的轉換功能。

• MLlib:因為 Spark Core ⾮非常適合於 反覆式運算,MLlib就是作為Spark的機器學習演算法函式庫。已⽀支援分類、分群、關聯與推薦演算法。如以下: • 匯總統計、相關性、分層抽樣、假設檢定、隨機資料⽣生成 • 分類與回歸:⽀支援向量機、回歸、線性回歸、決策樹、樸素⾙貝葉斯 • 協同過濾:ALS • 分群:k-平均演算法(k-mean) • 維度縮減:奇異值分解(SVD),主成分分析(PCA) • 特徵提取和轉換:TF-IDF、Word2Vec、StandardScaler • 最佳化:隨機梯度下降法(SGD)、L-BFGS

Page 13: Spark 巨量資料處理基礎教學

Spark Standalone Mode

13

Page 14: Spark 巨量資料處理基礎教學

Spark On Mesos

14

是很多公司採⽤用的模式,官⽅方推薦這種模式(當然,原因之⼀一是⾎血緣關係)。正是由於Spark開發之初就考慮到⽀支持Mesos,因此,⺫⽬目前⽽而⾔言,Spark運⾏行在Mesos上會⽐比運⾏行在YARN上更加靈活,更加⾃自然。⺫⽬目前在Spark On Mesos環境中,⽤用⼾戶可選擇兩種調度模式之⼀一運⾏行⾃自⼰己的應⽤用程序。 • 粗粒度模式(Coarse-grained Mode) • 細粒度模式(Fine-grained Mode)

Page 15: Spark 巨量資料處理基礎教學

Spark On Mesos

15

Page 16: Spark 巨量資料處理基礎教學

Spark On YARN

16

這是⼀一種最有前景的部署模式。但限於YARN⾃自⾝身的發展,⺫⽬目前僅⽀支持粗粒度模式(Coarse-grained Mode)。這是由於YARN上的Container資源是不可以動態伸縮的,⼀一旦Container啟動之後,可使⽤用的資源不能再發⽣生變化。

Page 17: Spark 巨量資料處理基礎教學

⽤用Spark做什麼?

17

對⼯工程師⽽而⾔言,Spark提供了⼀一個簡單的⽅方式在集群之間並⾏行化這些應⽤用,隱藏了分佈式系統、網絡通信和容錯處理的複雜性。系統使得⼯工程師在實現任務的同時,有充⾜足的權限監控、檢查和調整應⽤用。 API的模塊特性使得重⽤用已有⼯工作和本地測試變得簡單。

Spark⽤用⼾戶使⽤用Spark作為其數據處理應⽤用,因為他提供了豐富的功能,易於學習和使⽤用,⽽而且成熟可靠。

Page 18: Spark 巨量資料處理基礎教學

⽤用Spark有哪些好處?

18

• Java、Scala、Python 和 R APIs。 •可擴展⾄至超過 8000 個結點。 •能夠在記憶體內緩存資料集以進⾏行互動式資料分析。 • Scala 或 Python 中的互動式命令列介⾯面可降低橫向擴展資料探索的反應時間。

• Spark Streaming 對即時資料串流的處理具有可擴充性、⾼高吞吐量、可容錯性等特點。

• Spark SQL ⽀支援結構化和和關聯式查詢處理(SQL)。 • MLlib 機器學習演算法和 Graphx 圖形處理演算法的⾼高階函式庫。

Page 19: Spark 巨量資料處理基礎教學

19

基本操作

Page 20: Spark 巨量資料處理基礎教學

安裝Spark

20

$ wget http://files.imaclouds.com/scripts/hadoop-spark-installer.sh OR

https://hub.docker.com/r/kairen/yarn-spark/

Page 21: Spark 巨量資料處理基礎教學

下載 Spark Library

21

http://files.imaclouds.com/packages/hadoop-spark/spark-assembly-1.5.2-hadoop2.6.0.jar

並 Import 到 Project 裡

Page 22: Spark 巨量資料處理基礎教學

執⾏行指令

22

$ spark-submit --class <package> --master local[2] <jar path> <input path> <output path>

Page 23: Spark 巨量資料處理基礎教學

在 HDFS 新增資料

23

$ vim test.txta,123,456,789,11344,2142,123 b,1234,124,1234,123,123 c,123,4123,5435,1231,5345 d,123,456,789,113,2142,143 e,123,446,789,14,2142,113 f,123,446,789,14,2142,1113,323 $ hadoop fs -mkdir /spark/homework$ hadoop fs -put test.txt /spark/homework

Page 24: Spark 巨量資料處理基礎教學

Spark 操作概念

24

Spark 共有以下幾個概念: •Resilient Distributed Datasets •Creation operation •Transformation operation •control operation •action operation

Page 25: Spark 巨量資料處理基礎教學

SparkConf & JavaSparkContext

25

// 建⽴立 Configuration 且定義 Job 名稱 SparkConf conf = new SparkConf(); conf.setAppName(“JavaWordCount”); conf.setMaster("yarn-cluster")

// 建⽴立 JavaSparkContext 來接收資料來源 JavaSparkContext sc = new JavaSparkContext(conf); JavaRDD<String> file = sc.textFile(inputPath);

Page 26: Spark 巨量資料處理基礎教學

map

26

Input : String Output : 任⼀一定義

JavaRDD<String> map =file.map(new Function<String, String>() { public String call(String arg0) throws Exception { return arg0; } });

{1,2,3} => {1,2,3}

Page 27: Spark 巨量資料處理基礎教學

map 練習

27

找出測試資料所有英⽂文字⺟母,並存⾄至/spark/homework/map。結果如下: a b c d e f

Page 28: Spark 巨量資料處理基礎教學

flatmap

28

Input : String Output : Iterable<v> // v 型態任⼀一定義

JavaRDD<String> map =file .flatMap(new FlatMapFunction<String, String>() { public Iterable<String> call(String arg0) throws Exception { return Arrays.asList(arg0.split(",")); } });

{1,2,3} => {1 2 3}

Page 29: Spark 巨量資料處理基礎教學

flatmap 練習

29

找出測試資料所有以”,”切割的資料,並存⾄至/spark/homework/flatMap。結果如下: a 123 456 789 11344 2142 123 b 1234 ….

Page 30: Spark 巨量資料處理基礎教學

filter

30

Input : String Output : Boolean

JavaRDD<String> filter =map.filter(new Function<String, Boolean>() { public Boolean call(String arg0) throws Exception { if(arg0.contains("2")){ return true; } return false; } });

{1,2,3} => {2}

Page 31: Spark 巨量資料處理基礎教學

filter 練習

31

找出測試資料所有以123與456的資料,並存⾄至/spark/homework/filter。結果如下: 123 456 123 1234 1234 ….

Page 32: Spark 巨量資料處理基礎教學

mapToPair

32

Input : String Output : Tuple2<K, V> // K、V型態任⼀一定義

JavaPairRDD<String, Integer> pairRDD =file .mapToPair(new PairFunction<String, String, Integer>() { public Tuple2<String, Integer> call(String arg0) throws Exception { return new Tuple2<String, Integer>(arg0, 1); } });

{1,2,3} => {(1,1),(2,1),(3,1)}

Page 33: Spark 巨量資料處理基礎教學

mapToPair 練習

33

將測試資料轉換成(str, 1),並存⾄至/spark/homework/mapPair。結果如下: (a,1) (123,1) (456,1) (789,1) (11344,1) (2142,1) (123,1) ….

Page 34: Spark 巨量資料處理基礎教學

flatMapToPair

34

Input : String Output : Iterable<Tuple2<K, V>> // K、V型態任⼀一定義

JavaPairRDD<String, Integer> pairRDD =file .flatMapToPair(new PairFlatMapFunction<String, String, Integer>() { public Iterable<Tuple2<String, Integer>> call(String arg0) throws Exception { ArrayList<Tuple2<String,Integer>> arrayList =new ArrayList<Tuple2<String,Integer>>(); arrayList.add(new Tuple2<String, Integer>(arg0, 123)); return arrayList ; } });

{1,2,3} => {(1,123),(2,123),(3,123)}

Page 35: Spark 巨量資料處理基礎教學

flatMapToPair 練習

35

將測試資料轉換成(字⺟母, 所有後⾯面數字的sum),並存⾄至/spark/homework/filter_output。結果如下: (a,14977) (b,2838) (c,16257) (d,3766) (e,3627) (f,4950) ….

Page 36: Spark 巨量資料處理基礎教學

groupBy

36

Input : String Output : V // V 型態任⼀一定義

JavaPairRDD<String, Iterable<String>> groupBy =file .groupBy(new Function<String, String>() { public String call(String arg0) throws Exception { return (arg0.contains("2")?"A":"B"); } });

{1,2,3} => {(A,{2}) , (B,{1,3})}

Page 37: Spark 巨量資料處理基礎教學

groupBy 練習

37

找出測試資料中⼤大於500的資料,若無法辨識分到”None”,並存⾄至/spark/homework/groupBy。結果如下: (None,[a, b, c, d, e, f]) (⼩小於 500,[123, 456, 123, 124, 123, 123, 123, 123, 456, 113, 143, 123, 446, 14, 113, 123, 446, 14, 323]) (⼤大於 500,[789, 11344, 2142, 1234, 1234, 4123, 5435, 1231, 5345, 789, 2142, 789, 2142, 789, 2142, 1113]) ….

Page 38: Spark 巨量資料處理基礎教學

reduce

38

Input : String Output : String

String string = flatmap.reduce(new Function2<String, String, String>() { public String call(String arg0, String arg1) throws Exception { return arg0+arg1+"~~"; } });

{1,2,3} => {1~~2~~3}

Page 39: Spark 巨量資料處理基礎教學

reduce 練習

39

找出測試資料所有英⽂文字⺟母,並⽤用reduce將之append成⼀一個字串,並存⾄至/spark/homework/reduce。結果如下: abcdef

Page 40: Spark 巨量資料處理基礎教學

reduceByKey

40

Input : String Output : Integer

JavaPairRDD<String, Integer> reduceByKey =flatmap .reduceByKey(new Function2<Integer, Integer, Integer>() { public Integer call(Integer arg0, Integer arg1) throws Exception { return arg0+arg1; } });

{(1,1),(1,2),(3,3)} => {(1,3),(3,3)}

Page 41: Spark 巨量資料處理基礎教學

reduceByKey 練習

41

找出以”,”切割的所有wordcount,並存⾄至/spark/homework/reduceByKey。結果如下: (d,1) (1113,1) (1231,1) (e,1) (14,2) (113,2) ….

Page 42: Spark 巨量資料處理基礎教學

mapValues

42

Input : String Output : Integer

reduceByKey.mapValues(new Function<Integer, Integer>() { public Integer call(Integer arg0) throws Exception { return arg0*100; } });

{(1,1),(2,2),(3,3)} => {(1,100),(2,200),(3,300)}

Page 43: Spark 巨量資料處理基礎教學

sortByKey & distinct

43

//以 Key 為主進⾏行⼤大到⼩小排序,反之true⼩小到⼤大 JavaPairRDD<String, Integer> sort = reduceByKey.sortByKey(false);

//去除重覆 JavaPairRDD<String, Integer> sort = reduceByKey.distinct();

{1,2,3} => {(1,123),(2,123),(3,123)}

Page 44: Spark 巨量資料處理基礎教學

打鐵趁熱(⼀一)

44

找出Datasets中,銷售前⼆二⼗十名的商品。結果為以下: 01,0006584093 02,0000143511 03,0007082051 04,0005772981 05,0014252066 ….

Page 45: Spark 巨量資料處理基礎教學

打鐵趁熱(⼆二)

45

•使⽤用者編號1~10中對商品編號1~10 的評價有 3 以上的有哪些?依照 rating 進⾏行排序 (⼤大到⼩小)

•結果格式如下• User 1 評價 Item 1 為 5 • u.data.csv (http://files.imaclouds.com/dataset/u.data.csv)