Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

[Oracle big data jam session #1] Apache Spark ことはじめ

194 views

Published on

サンプルコードで学ぶSparkライブラリの使い方

Published in: Data & Analytics
  • Be the first to comment

  • Be the first to like this

[Oracle big data jam session #1] Apache Spark ことはじめ

  1. 1. Copyright © 2019,Oracle and/orits affiliates. All rights reserved. | Confidential – Oracle Internal/Restricted/Highly Restricted
  2. 2. Copyright © 2019,Oracle and/orits affiliates. All rights reserved. | Confidential – Oracle Internal/Restricted/Highly Restricted Apache Sparkことはじめ 園田憲一 日本オラクル株式会社 サンプル・コードから学ぶApache Spark Oracle Code Night Oracle Big Data Jam Session #1
  3. 3. Copyright © 2019,Oracle and/orits affiliates. All rights reserved. | • カリフォルニア大学バークレー校 AMPLabで開発スタート • 2014年Apache Software Foundation から初回リリース • 短期間で圧倒的な人気を獲得した オープンソースソフトウェア • 高性能かつ生産性の高いライブラリ 群 • 豊富なエコシステム • 開発言語 – Scala, Java, Python, R, SQL Confidential – Oracle Internal/Restricted/Highly Restricted 3 Apache Spark
  4. 4. Copyright © 2019,Oracle and/orits affiliates. All rights reserved. | • Spark Core – Resilient Distribute Dataset(Sparkの内部的な 基本データ構造)を構成 – 基本的なデータ操作 • Spark SQL – SQLによるデータ操作 – その他のライブラリと併用可 • Spark Streaming – リアルタイム処理用のライブラリ • Spark ML – 機械学習用、統計処理用ライブラリ • Spark Graph – グラフ処理用ライブラリ Confidential – Oracle Internal/Restricted/Highly Restricted 4 Apache Sparkのライブラリ http://spark.apache.org/
  5. 5. Copyright © 2019,Oracle and/orits affiliates. All rights reserved. | • SQLでデータ処理を行うためのライブ ラリ • 非構造化データにスキーマ(列、行、 データ型)を定義 • データ処理 – 集計処理、ソート処理、結合処理など • その他のライブラリ(ML、Streaming、 Graph)でも利用可能 • 対応ファイルフォーマット – CSV, XML, JSON – Avro, Parquet, ORC Confidential – Oracle Internal/Restricted/Highly Restricted 5 Spark SQL // 表の作成 0: jdbc:hive2://localhost:10015> create table movies(actor string, title string, year int) row format delimited fields terminated by ',' lines terminated by '¥n’; // csvファイルからのデータロード 0: jdbc:hive2://localhost:10015> load data local inpath '/home/opc/data/movies.csv' into table movies; // 全件検索の実行 0: jdbc:hive2://localhost:10015> select * from movies; +-----------------+---------------+-------+ | actor| title| year| +-----------------+---------------+-------+ |McClure, Marc (I)| Freaky Friday| 2003| |McClure, Marc (I)| Coach Carter| 2005| |McClure, Marc (I)| Superman II| 1980| |McClure, Marc (I)| Apollo 13| 1995|
  6. 6. Copyright © 2019,Oracle and/orits affiliates. All rights reserved. | Confidential – Oracle Internal/Restricted/Highly Restricted 6 Spark ML • 機械学習のライブラリ • 様々な統計アルゴリズムをサポート カテゴリ 統計アルゴリズム 分類回帰 SVM(Support Vector Machine), Logistic Regression, Linear Regression, Naive Bayes, Decision Trees, Ensembles of Trees(Random Forests, Gradient boosted Trees), Isotonic Regression 協調フィルタリング ALS(Alternating Least Squares) クラスタリング K-means, Gaussian mixture, PIC(Power Iteration Clustering), Latent Dirichlet Allocation(LAD), Streaming k-means 次元削減 SVD(Singular Value Decomposition), PCA(Principal Component Analysis) 特徴抽出、変換 TF-IDF, Workd2Vec, StnadardScalar, Normalizer, Feature selection, ElementwiseProduct, PCA 頻出パターン マイニング FP-Growth, Association Rues, RefixSpan 学習 データ 学習プ ログラ ム 予測 モデル 予測 データ 予測 結果 入力 出力 機械学習のワークフロー 学習フェーズ 予測フェーズ
  7. 7. Copyright © 2019,Oracle and/orits affiliates. All rights reserved. | Confidential – Oracle Internal/Restricted/Highly Restricted 7 Spark ML サンプルコード①概要 学習 データ 正解 ラベル 学習データの準備 学習器 特徴 抽出 パイプライン 学習 予測モデル 正解 ラベル 予測結果 未知の データ 予測データの準備学習フェーズ 予 測 フ ェ ー ズ +----------------+-----+ | text|label| +----------------+-----+ | spark i j k| ? | | l m n| ? | | mapreduce spark| ? | | apache hadoop| ? | +----------------+-----+ +----------------+-----+ | text|label| +----------------+-----+ | a b c d e spark| 1.0| | b d| 0.0| | spark f g h| 1.0| |hadoop mapreduce| 0.0| | b spark who| 1.0| | g d a y| 0.0| | spark fly| 1.0| | was mapreduce| 0.0| | e spark program| 1.0| | a e c l| 0.0| | spark compile | 1.0| |hadoop software | 0.0| +----------------+-----+ 入力 出力 サンプルコードの概要 正解ラベル付きの学習データから特徴を学習し、未知のデー タの正解ラベルを予測する。 • 学習データ:テキストデータ(正解ラベル付き) • 学習プログラム:テキストデータを単語に区切り、特徴抽出 • 予測モデル:「spark」という文字列が入っているかいないか
  8. 8. Copyright © 2019,Oracle and/orits affiliates. All rights reserved. | Confidential – Oracle Internal/Restricted/Highly Restricted 8 Spark ML サンプルコード②データの準備 学習 データ 正解 ラベル 学習データの準備 学習器 特徴 抽出 パイプライン 学習 予測モデル 正解 ラベル 予測結果 未知の データ 予測データの準備学習フェーズ 予 測 フ ェ ー ズ training = spark.createDataFrame([ (0, "a b c d e spark", 1.0), (1, "b d", 0.0), (2, "spark f g h", 1.0), (3, "hadoop mapreduce", 0.0), (4, "b spark who", 1.0), (5, "g d a y", 0.0), (6, "spark fly", 1.0), (7, "was mapreduce", 0.0), (8, "e spark program", 1.0), (9, "a e c l", 0.0), (10, "spark compile", 1.0), (11, "hadoop software", 0.0) ], ["id", "text", "label"]) 入力 出力
  9. 9. Copyright © 2019,Oracle and/orits affiliates. All rights reserved. | Confidential – Oracle Internal/Restricted/Highly Restricted 9 Spark ML サンプルコード③学習、予測モデルの作成 学習 データ 正解 ラベル 学習データの準備 学習器 特徴 抽出 パイプライン 学習 予測モデル 正解 ラベル 予測結果 未知の データ 予測データの準備学習フェーズ 予 測 フ ェ ー ズ // 特徴抽出の定義 tokenizer = Tokenizer(inputCol='text', outputCol='words') hashingTF = HashingTF(inputCol=tokenizer.getOutputCol(), outputCol='features') // 学習器としてロジスティック回帰を指定 lr = LogisticRegression(maxIter=10) // 特徴抽出と学習器をPipelineとして登録 pipeline = Pipeline(stages=[tokenizer, hashingTF, lr]) //学習を実行し、予測モデルを生成 model = pipeline.fit(training) 入力 出力
  10. 10. Copyright © 2019,Oracle and/orits affiliates. All rights reserved. | Confidential – Oracle Internal/Restricted/Highly Restricted 10 Spark ML サンプルコード④予測データの準備と予測実行 学習 データ 正解 ラベル 学習データの準備 学習器 特徴 抽出 パイプライン 学習 予測モデル 正解 ラベル 予測結果 未知の データ 予測データの準備学習フェーズ 予 測 フ ェ ー ズ // 予測データの準備 test = spark.createDataFrame([ (4, "spark i j k"), (5, "l m n"), (6, "mapreduce spark"), (7, "apache hadoop") ], ["id", "text"]) 入力 出力 // 予測の実行、結果の確認 predict = model.transform(test) predict.select('id', 'text','prediction').show(truncate=False) +---+---------------+----------+ |id |text |prediction| +---+---------------+----------+ |4 |spark i j k |1.0 | |5 |l m n |0.0 | |6 |mapreduce spark|1.0 | |7 |apache hadoop |0.0 | +---+---------------+----------+
  11. 11. Copyright © 2019,Oracle and/orits affiliates. All rights reserved. | Confidential – Oracle Internal/Restricted/Highly Restricted 11 Spark Streaming • ストリーミングデータに対するリアルタイム処理のためのライブラリ • 絶え間なく発生するデータを次々と処理して次々と結果を返し、その 結果をもとにアクションを実行 連 携 シ ス テ ム 結果データ 処理 結果データ 処理 結果データ 処理 デ ー タ ソ ー ス 時刻 T のデータ 時刻 T + 1 のデータ 時刻 T + 2 のデータ ストリーム ストリーム ストリーム 連携 連携 連携 アクション アクション アクション 時間軸 Spark クラスタ
  12. 12. Copyright © 2019,Oracle and/orits affiliates. All rights reserved. | Confidential – Oracle Internal/Restricted/Highly Restricted 12 Spark Streaming サンプル・コード概要 $ nc –lk 9999 hello world(⏎キー) test test(⏎キー) hoge hoge(⏎キー) ------------------------------------------- Time: 1357008430000 ms ------------------------------------------- (hello,1) (world,1) ------------------------------------------- Time: 1482008230000 ms ------------------------------------------- (test,2) ------------------------------------------- Time: 1322001210000 ms ------------------------------------------- (hoge,2) ターミナル1 : ストリームデータの生成 ターミナル2 : 結果の出力 Hello, 1 World, 1 Hello world ワード カウント 処理 デ ー タ ソ ー ス ストリーム ストリーム ストリーム test, 2 test test ワード カウント 処理 hoge, 2 hoge hoge ワード カウント 処理 サンプルコードの概要 ターミナルから随時入力されるテキストデータに対してワードカ ウント処理を行い、単語の出現数を返す • ストリームデータ:随時入力されるテキストデータ • ストリーム処理:ワードカウント(一秒間隔で繰り返す)
  13. 13. Copyright © 2019,Oracle and/orits affiliates. All rights reserved. | Confidential – Oracle Internal/Restricted/Highly Restricted 13 Spark Streaming サンプル・コード // 入力ストリームデータの定義(1秒間隔でバッチ処理を繰り返す) val ssc = new StreamingContext(sc, Seconds(1)) //入力データソースの定義(9999番ポートでオープンしたTCPソケッ トにローカルホストから接続) val lines = ssc.socketTextStream("localhost", 9999) //ストリームデータのテキストをスペース区切りで分割 val words = lines.flatMap(_.split(" ")) //単語をカウントし、単語と出現数を標準出力に出力 val pairs = words.map(word => (word, 1)) val wordCounts = pairs.reduceByKey(_ + _) wordCounts.print() // 定義したストリーム処理の開始 ssc.start() Hello, 1 World, 1 Hello world ワード カウント 処理 デ ー タ ソ ー ス ストリーム ストリーム ストリーム test, 2 test test ワード カウント 処理 hoge, 2 hoge hoge ワード カウント 処理 サンプルコードの概要 ターミナルから随時入力されるテキストデータに対してワードカ ウント処理を行い、単語の出現数を返す • ストリームデータ:随時入力されるテキストデータ • ストリーム処理:ワードカウント(一秒間隔で繰り返す)
  14. 14. Copyright © 2019,Oracle and/orits affiliates. All rights reserved. | Confidential – Oracle Internal/Restricted/Highly Restricted 14 Spark Streaming サンプル・コード $ nc –lk 9999 hello world(⏎キー) test test(⏎キー) hoge hoge(⏎キー) ------------------------------------------- Time: 1357008430000 ms ------------------------------------------- (hello,1) (world,1) ------------------------------------------- Time: 1482008230000 ms ------------------------------------------- (test,2) ------------------------------------------- Time: 1322001210000 ms ------------------------------------------- (hoge,2) ターミナル1 : ストリームデータの生成 ターミナル2 : 結果の出力 Hello, 1 World, 1 Hello world ワード カウント 処理 デ ー タ ソ ー ス ストリーム ストリーム ストリーム test, 2 test test ワード カウント 処理 hoge, 2 hoge hoge ワード カウント 処理 サンプルコードの概要 ターミナルから随時入力されるテキストデータに対してワードカ ウント処理を行い、単語の出現数を返す • ストリームデータ:随時入力されるテキストデータ • ストリーム処理:ワードカウント(一秒間隔で繰り返す)
  15. 15. Copyright © 2019,Oracle and/orits affiliates. All rights reserved. | • 世の中のあらゆる“関係性”を定義し、分 析するライブラリ • グラフのデータモデル – 「頂点(Vertex) 」」と「辺(Edge) 」からなるデータ 構造 – 頂点に「モノ」、辺に「頂点同志の関係」を定義 する – 「頂点」と「辺 」に属性や情報を定義する • データ処理の例 – 任意の頂点までの経路を表示 – 任意の関係の頂点を全てリスト – 任意の頂点に繋がっている頂点の数のカウン ト – ページランク Confidential – Oracle Internal/Restricted/Highly Restricted 15 Spark Graph 頂点(Vertex) 辺(Edge) グラフデータモデル ユーザーA (田中, 46歳) ユーザーB (鈴木, 20歳) ユーザーC (山田, 18歳) ユーザーD (林, 35歳) ユーザーE (井上, 60歳) follow follow follow follow follow 商品A (本, 1980円) 商品B (鉛筆, 100円) ユーザーA (山田, 18歳) ユーザーB (小山, 25歳) 購入済 商品C (ノート, 200円) 購入済購入済 SNSの例 ショッピングサイトの例
  16. 16. Copyright © 2019,Oracle and/orits affiliates. All rights reserved. | Confidential – Oracle Internal/Restricted/Highly Restricted 16 Spark Graph サンプル・コード①概要とデータモデルの定義 ユーザーa (Alice, 34) ユーザーd (Deck, 52) ユーザーb (Bob, 36) ユーザーc (Charlie, 30) ユーザーe (Evan, 20) ユーザーf (Farr, 52) friend friend family family Colleague friend Colleague // 頂点(各ユーザー)の定義 >>> v = sqlContext.createDataFrame([ ... ("a", "Alice", 34), ... ("b", "Bob", 36), ... ("c", "Charlie", 30), ... ("d", "Deck", 52), ... ("e", "Evan", 20), ... ("f", "Farr", 18), ... ], ["id", "name", "age"]) // 辺(各ユーザーの関係)を定義 >>> e = sqlContext.createDataFrame([ ... ("a", "b", "family"), ... ("a", "c", "friend"), -----------中略-------------------- ... ("e", "a", "Colleague"), ... ("e", "c", "friend"), ... ("f", "c", "friend"), ... ], ["src", "dst", "relationship"]) // 頂点と辺をグラフデータモデルとして定義 >>> g = GraphFrame(v, e) 登録されているユーザーの中から友人関係のユー ザーのみを検索する • 頂点(Vertex) : 登録ユーザー • 辺(Edge) : 登録ユーザーの関係
  17. 17. Copyright © 2019,Oracle and/orits affiliates. All rights reserved. | Confidential – Oracle Internal/Restricted/Highly Restricted 17 Spark Graph サンプル・コード②クエリを実行 // 友達の関係にあるユーザーを検索する >>> g.edges.filter("relationship = 'friend'").show() +---+---+------------+ |src|dst|relationship| +---+---+------------+ | a| c| friend| | c| a| friend| | c| f| friend| | c| e| friend| | e| c| friend| | f| c| friend| +---+---+------------+ ユーザーa (Alice, 34) ユーザーd (Deck, 52) ユーザーb (Bob, 36) ユーザーc (Charlie, 30) ユーザーe (Evan, 20) ユーザーf (Farr, 52) friend friend family family Colleague friend Colleague ユーザーa (Alice, 34) ユーザーd (Deck, 52) ユーザーb (Bob, 36) ユーザーc (Charlie, 30) ユーザーe (Evan, 20) ユーザーf (Farr, 52) friend friend family family Colleague friend Colleague 登録されているユーザーの中から友人関係のユー ザーのみを検索する • 頂点(Vertex) : 登録ユーザー • 辺(Edge) : 登録ユーザーの関係
  18. 18. Copyright © 2019,Oracle and/orits affiliates. All rights reserved. | • OCI Big Data Service – Clouderaのサーバレス・サービス – クラスタの作成、管理を容易に – Cloudera Managerなどこれまでの使い勝手は そのままで • OCI Data Flow Service – Apache Sparkのサーバレス・サービス – Sparkクラスタの構築、管理が不要 – 3ステップでSpark処理が完了 • データとプログラムのアップロード • プログラムをアプリケーションとして登録 • アプリケーションの実行 Confidential – Oracle Internal/Restricted/Highly Restricted 18 Spark関連のOCIサーバーレスサービス
  19. 19. Copyright © 2019,Oracle and/orits affiliates. All rights reserved. | Confidential – Oracle Internal/Restricted/Highly Restricted 19

×