Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Spark 簡單教學

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.

Spark 簡單教學

Avatar for Kyle Bai

Kyle Bai

June 18, 2015
Tweet

More Decks by Kyle Bai

Other Decks in Technology

Transcript

  1. 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。 • 然⽽而隨著新模型的不斷出現,似乎對於巨量量資料處理理⽽而⾔言,不同類型的作業 應該需要⼀一系列列不同的處理理架構才可以極佳地完成。但是這些專有系統也有 ⼀一些不⾜足之處。
  2. Spark 巨量量資料處理理架構 !6 • Spark 採⽤用⼀一個 RDD 概念念(⼀一種新的抽象的彈性資料集),在某種程度上 Spark 是對

    MapReduce 模型的⼀一種擴充。 • 主要是把 MR 不擅長的計算⼯工作(反覆運算、互動式與串串流式)進⾏行行改善,並提 出⼀一個統⼀一的引擎。 • 因為 MR 缺乏⼀一種特性,就是在平⾏行行計算的各個階段劑型有效的資料共⽤用,這種 共⽤用就是 RDD 的本質。利利⽤用這種本質來來達到這些運算模式。 • 在叢集處理理的容錯⽅方式,不像Hadoop與 Dryad將計算建置成⼀一個無環圖的⼯工作 集。
  3. RDD 表達能⼒力力 !7 • 反覆運算演算法:這是⽬目前專有系統實現比較普遍的應⽤用 場景,⽤用於圖型處理理與機器學習。RDD 能夠極佳的實現這 些模型,包含Pregel、HaLoop、GraphLab等模型。 • 關連式查詢:對

    MR 來來說非常重要的需求就是SQL查詢, 包含長期執⾏行行、數⼩小時的批次處理理作業與互動式查詢。在 MR 上有其內在缺點,如其容錯的模型⽽而導致速度很慢。利利 ⽤用RDD實現許多通⽤用的資料庫引擎特性,使效能提升。
  4. RDD 表達能⼒力力 !8 • MapReduce 批次處理理:RDD提供的介⾯面是 MR 的超集合,所以 RDD 可以

    有效地執⾏行行與利利⽤用 MR 實現應⽤用程式,另外 RDD 還適合更更加抽象的以 DAG 為基礎的應⽤用程式,如 DryadLINQ。 • 串串流式處理理:⽬目前串串流式系統只提供有限容錯處理理,需要消耗系統非常⼤大的 複製代價與非常長的容錯時間。然⽽而 RDD 實現⼀一個新的模型—離散資料流程 (D-Stream),D-Stream 將串串流計算當作⼀一系列列的短⼩小的批次處理理操作,⽽而 非常駐有狀狀態的操作,將兩兩個離散串串流之間的狀狀態存在RDD中。並允許 RDD 的繼承關係圖(Lineage)進⾏行行平⾏行行性的恢復,⽽而不需要進⾏行行資料複製。
  5. 處理理的基本情況 !10 我們可以將巨量量資料處理理分為以下三種情況: • 複雜的批次資料處理理(batch data processing):時間長,跨度為 10min - N

    hr。 • 以歷史資料為基礎的互動查詢(interactive query):時間通常為 10 sec - N min。 • 以即時資料流為基礎的資料處理理(streaming data processing):時間 通常為 N ms - N sec。
  6. 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等。
  7. Spark ⼦子專案對應 !12 • GraphX:已 Spark 為基礎的圖形計算架構,相容 Pregel 與 GraphLab

    介⾯面,增強圖型建置與圖的 轉換功能。 • MLlib:因為 Spark Core 非常適合於 反覆式運算,MLlib就是作為Spark的機器學習演算法函式 庫。已⽀支援分類、分群、關聯聯與推薦演算法。如以下: • 匯總統計、相關性、分層抽樣、假設檢定、隨機資料⽣生成 • 分類與回歸:⽀支援向量量機、回歸、線性回歸、決策樹、樸素⾙貝葉斯 • 協同過濾:ALS • 分群:k-平均演算法(k-mean) • 維度縮減:奇異異值分解(SVD),主成分分析(PCA) • 特徵提取和轉換:TF-IDF、Word2Vec、StandardScaler • 最佳化:隨機梯度下降法(SGD)、L-BFGS
  8. ⽤用Spark有哪些好處? !18 • Java、Scala、Python 和 R APIs。 • 可擴展⾄至超過 8000

    個結點。 • 能夠在記憶體內緩存資料集以進⾏行行互動式資料分析。 • Scala 或 Python 中的互動式命令列列介⾯面可降低橫向擴展資料探索 的反應時間。 • Spark Streaming 對即時資料串串流的處理理具有可擴充性、⾼高吞吐 量量、可容錯性等特點。 • Spark SQL ⽀支援結構化和和關聯聯式查詢處理理(SQL)。 • MLlib 機器學習演算法和 Graphx 圖形處理理演算法的⾼高階函式庫。
  9. 在 HDFS 新增資料 !23 $ vim test.txt a,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
  10. 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);
  11. 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}
  12. 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}
  13. 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}
  14. 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)}
  15. 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)}
  16. 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})}
  17. 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]) ….
  18. 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}
  19. 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)}
  20. 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)}
  21. 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)}
  22. 打鐵趁熱(⼆二) !45 •使⽤用者編號1~10中對商品編號1~10 的評價有 3 以上的有哪些?依 照 rating 進⾏行行排序 (⼤大到⼩小)

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