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

Spark 簡單教學

Spark 簡單教學

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)