© 2016 IBM Corporation
Apache Spark入門
Tanaka Y.P
2016-08-26
© 2016 IBM Corporation2
自己紹介
田中裕一(yuichi tanaka)
主にアーキテクチャとサーバーサイドプログラムを担当
することが多い。Hadoop/Spark周りをよく触ります。
Node.js、Python、最近はSpark周りの仕事でScalaを書く
ことが多い気がします。
休日はOSS周りで遊んだり。
詳解 Apache Spark
© 2016 IBM Corporation3
アジェンダ
 Sparkの概要
 Sparkのテクノロジースタック
 SparkとHadoop
 Sparkコンポーネント
 Spark Core
 SparkSQL
 DataFrame
 SparkStreaming
 MLlib
 GraphX
 DataSets
 本日のサンプル(感情極性分析)
 Notebook
© 2016 IBM Corporation4
Sparkの概要
© 2016 IBM Corporation5
DataFrames
Sparkのテクノロジースタック
Spark Core
SparkSQL
Spark
Streaming
GraphX MLlib
HDFS Cassandra HBase ・・・
Packages
© 2016 IBM Corporation6
Apache SparkとHadoop
HadoopでのMapReduceの処理例
© 2016 IBM Corporation7
Apache Sparkの処理概要
SparkでのRDD&DAGの処理例
© 2016 IBM Corporation8
• Java, Scala, Pythonを利用してETLを実行可能
• RDD(Reslient Distributed Datasets)はScalaのコレクションの
Seqのようなもので、データを順番に保持
• RDDの内部はパーティションに分かれている。パーティション
毎にデータを保持(HDFSブロック数に依存)
• 分散処理する際にはパーティション毎に並列に処理
• mapやfilter等の基本的な操作の場合、データの順序は変わ
らない。
val csv = spark.textFile("tokyo.csv")
val pairs = csv.map(line => (line.split(",")))
.map(x => (x(0).take(8), (x(4).toFloat, 1)))
.reduceByKey( (x,y) => (x._1 + y._1, x._2 +
y._2) )
.map(x => (x._1, x._2._1/x._2._2) )
.sortByKey()
 Spark CoreはSparkのエンジン
Spark Core
20150614 22:00:00,0,1,8,20.9,8,3.0,8,南南西,8,85,8
20150614 23:00:00,0,1,8,20.9,8,2.6,8,南南西,8,86,8
20150615 00:00:00,0,1,8,20.5,8,1.0,8,南,8,86,8
20150615 1:00:00,0,1,8,20.4,8,0.7,8,南,8,88,8
(2015/6/14,22.565218)
(2015/6/15,24.550001)
(2015/6/16,23.358332)
(2015/6/17,21.583334)
例:平均気温の計算
© 2016 IBM Corporation9
• SQLを利用したデータ操作が可
能
• トランザクションなし
• Parquet 、Json、Hive だけで
なくJDBCやODBCもサポート
• Thrift JDBC/ODBCによる外部
からの接続
• 後述のDataFrameをラップする
形で実装
{"name":"貝嶋", "address":{"city":"川崎", "state":"神奈川"}}
{"name":"土屋", "address":{"city":"豊洲", "state":"東京"}}
{“name”:“山田", "address":{"city":"横浜", "state":"神奈川"}}
{"name":"岸代", "address":{"city":"後楽園", "state":"東京"}}
val people = sqlContext.jsonFile("test.json")
people.registerTempTable("people")
val nameAndAddress =
sqlContext.sql("SELECT name, address.city, address.state FROM
people WHERE address.state="神奈川"")
nameAndAddress.collect.foreach(println)
{"name":"貝嶋", "address":{"city":"川崎", "state":"神奈川"}}
{“name”:“山田", "address":{"city":"横浜", "state":"神奈川"}}
例:住所データ(json)からの特定データの抽出
• SparkSQLによるデータ操作
Spark SQL
© 2016 IBM Corporation10
DataFrame API
 Performance
 Less Code
© 2016 IBM Corporation11
DataFrame API
 Preformance
 Less Code
SQL Spark DataFrame API
Spark RDD
© 2016 IBM Corporation13
• Sparkによるミニ(マイクロ)バッチの実行
• DStreamと呼ばれるRDDを操作
• 指定間隔ごとにまとめられたRDDを処理(Windows処
理も可能)
• 通常のSparkプログラミングとほぼ同様
たとえば、定期的に流入するデータの「移動平均値」の連続計
算
val tstream = ssc.socketTextStream(hostname, port)
var mdtxt = tstream.map(x => x.split(","))
.map(x => ( x(0), (x(0), x(1), x(2).toInt) ) )
.updateStateByKey(updateFunc _)
mdtxt.print()
センサーデータ:
(Dev1, 201501010000, 0)
(Dev2, 201501010000, 0)
(Dev1, 201501010001, 1)
Alert: Dev1 Status changed : 1
 Sparkでストリーム処理
Spark Streaming
例:センサーデータの出力値変更時にアラート
DStream
RDD
data
data
RDD
data
data
RDD
data
data
© 2016 IBM Corporation14
• MLlibとRが利用可能
MLlibはScalaで、SparkRはRで
記述可能
• アルゴリズム(MLlib)
• SVM、ロジスティック回帰、決定木、K-
means、ALSなど
• IBMはSystemMLをSparkに提供
val data = spark.textFile("kdata.txt")
val parsedData = data.map(x =>
Vectors.dense(x.split(',').map(_.toDouble))).cache()
val numClusters = 3
val numIterations = 10
val clusters = KMeans.train(parsedData, numClusters, numIterations)
 Sparkで機械学習
SparkR, Mllib
データ: ( 直近購買月[n日前], 期間内購買回数 )
(5,1),(4,2),(5,3),(1,2),(2,4),(2,5),(2,6),(1,4),(1,5),(1,2),(1,5),(5,5)
クラスタ結果: ([中心], 人数)
([1.0, 2.0], 2), ([1.5, 4.833333333333333], 6),
([4.666666666666666, 2.0], 3), ([5.0, 5.0], 1)
例:顧客のクラスタ分け
0
2
4
6
0 2 4 6
© 2016 IBM Corporation15
• グラフデータを並列分散環境で処理するための
フレームワーク
• グラフ構造データを用いた解析を行う
• 「点」と「辺」からなるデータ
• SNSでのつながり、データ間の関連性
など
• 表構造では扱うことが難しい関係を見つけ出す
• データ間のつながりの抽出
• 輪の抽出
• 距離の計測
• 影響の計測
• グラフDBとの兼ね合い(これから)
val graphWithDistance = Pregel(
graph.mapVertices((id:VertexId, attr:Int) => List((id, 0))),
List[(VertexId, Int)](),
Int.MaxValue,EdgeDirection.Out)((id, attr, msg) =>
mergeVertexRoute(attr, msg.map(a=> (a._1, a._2 + 1))),edge
=> {
val isCyclic = edge.srcAttr.filter(_._1 ==
edge.dstId).nonEmpty
if(isCyclic) Iterator.empty
else Iterator((edge.dstId, edge.srcAttr))
},(m1, m2) => m1 ++ m2
)
 Sparkでグラフ処理を
Spark GraphX
つながりの検索
例: つながりと距離を見つけ出す
1,((1,0), (6,1), (9,1), (7,1), (4,2))
1
2 3
4
5
6
7
89
© 2016 IBM Corporation16
DataSet API
• Spark v1.6で追加された新しいAPI
• まだ実験的な実装であることに注意
• 登場背景
• RDDとDataFrameという二つの抽象概念ができてしまった。
• RDDとDataFrameにそれぞれ長所があること
• 2つの抽象概念を行き来する為のコストがかかる
• 二つの抽象概念をいいとこ取りしたDataSetAPIの登場
• DataFrameの速さはそのまま
• オブジェクト・メソッドはコンパイル時のタイプセーフ提供
• DataFrameとのシームレス変換
© 2016 IBM Corporation17
Structured Streaming
• Spark v2.0で追加される予定の新しいAPI
• Datasetの上に実装されたHigh-levelのStreamingAPI
• Streamingデータを構造化データとして
継続的に処理可能
val in =
spark.readStream .schema(schemaImp) .format("csv") .option("header",
true) .option("maxFilesPerTrigger", 1) .load("csv-logs")
Jacek Warszawa, Polska, 42,true
Jacek Warszawa, Polska, 42,true
-------------------------------------------
Batch: 0
-------------------------------------------
+-----+--------+-------+---+-----+
| name| city|country|age|alive|
+-----+--------+-------+---+-----+
|Jacek|Warszawa| Polska| 42| true|
+-----+--------+-------+---+-----+
complete output delta output
© 2016 IBM Corporation18
本日のサンプル(感情極性分析)
• Sparkを使った記事の感情極性分析を行います。(いわゆるネガポ
ジ)
• AdTechやSNS分析などで利用される分析
• その記事が肯定的な内容なのか否定的な内容なのかの判定に利用
否定的な内容の記事
広告が出る
© 2016 IBM Corporation19
本日のサンプル(感情極性分析)
• Sparkを使った記事の感情極性分析を行います。(いわゆるネガポ
ジ)
• 記事を読み込みword毎に区切る
• 単語極性対応表を使って記事の単語を評価
• 評価値を元にNegative / Pojitiveを数値で評価
記事
単語極性
対応表
単語分割
kuromoji
(ipadic)
辞書作成
マッチング 記事評価単語リスト
© 2016 IBM Corporation20
本日のサンプル(感情極性分析)
• 記事
• 記事タイトル,本文,メディアのCSV
• サンプル記事
• 飲酒運転、検挙数5分の1に減 「悪質」の割合は高まる
• 領海侵入の沈静化要求=岸田氏「首脳会談の前提」―日中外相会談
• 国交省、休日のダム見学、ツアーを実施することを発表 内部の一般開放も推進
• 過去最多メダル獲得 リオ五輪日本選手団の解団式
• 辞書
• 単語¥t極性値t用法
• サンプルデータ
• 貪欲 n 〜である・になる(評価・感情)主観
• 絆 p 〜がある・高まる(存在・性質)
• 腕前 e 〜がある・高まる(存在・性質)
• 腕利き p 〜である・になる(評価・感情)主観
© 2016 IBM Corporation21
参考
• 辞書
• 日本語評価極性辞書
• 東山昌彦, 乾健太郎, 松本裕治, 述語の選択選好性に着目した名詞評価極性の獲得, 言語処理学会第14
回年次大会論文集, pp.584-587, 2008. / Masahiko Higashiyama, Kentaro Inui, Yuji Matsumoto.
Learning Sentiment of Nouns from Selectional Preferences of Verbs and Adjectives, Proceedings of
the 14th Annual Meeting of the Association for Natural Language Processing, pp.584-587, 2008.

Apache Sparkを使った感情極性分析

  • 1.
    © 2016 IBMCorporation Apache Spark入門 Tanaka Y.P 2016-08-26
  • 2.
    © 2016 IBMCorporation2 自己紹介 田中裕一(yuichi tanaka) 主にアーキテクチャとサーバーサイドプログラムを担当 することが多い。Hadoop/Spark周りをよく触ります。 Node.js、Python、最近はSpark周りの仕事でScalaを書く ことが多い気がします。 休日はOSS周りで遊んだり。 詳解 Apache Spark
  • 3.
    © 2016 IBMCorporation3 アジェンダ  Sparkの概要  Sparkのテクノロジースタック  SparkとHadoop  Sparkコンポーネント  Spark Core  SparkSQL  DataFrame  SparkStreaming  MLlib  GraphX  DataSets  本日のサンプル(感情極性分析)  Notebook
  • 4.
    © 2016 IBMCorporation4 Sparkの概要
  • 5.
    © 2016 IBMCorporation5 DataFrames Sparkのテクノロジースタック Spark Core SparkSQL Spark Streaming GraphX MLlib HDFS Cassandra HBase ・・・ Packages
  • 6.
    © 2016 IBMCorporation6 Apache SparkとHadoop HadoopでのMapReduceの処理例
  • 7.
    © 2016 IBMCorporation7 Apache Sparkの処理概要 SparkでのRDD&DAGの処理例
  • 8.
    © 2016 IBMCorporation8 • Java, Scala, Pythonを利用してETLを実行可能 • RDD(Reslient Distributed Datasets)はScalaのコレクションの Seqのようなもので、データを順番に保持 • RDDの内部はパーティションに分かれている。パーティション 毎にデータを保持(HDFSブロック数に依存) • 分散処理する際にはパーティション毎に並列に処理 • mapやfilter等の基本的な操作の場合、データの順序は変わ らない。 val csv = spark.textFile("tokyo.csv") val pairs = csv.map(line => (line.split(","))) .map(x => (x(0).take(8), (x(4).toFloat, 1))) .reduceByKey( (x,y) => (x._1 + y._1, x._2 + y._2) ) .map(x => (x._1, x._2._1/x._2._2) ) .sortByKey()  Spark CoreはSparkのエンジン Spark Core 20150614 22:00:00,0,1,8,20.9,8,3.0,8,南南西,8,85,8 20150614 23:00:00,0,1,8,20.9,8,2.6,8,南南西,8,86,8 20150615 00:00:00,0,1,8,20.5,8,1.0,8,南,8,86,8 20150615 1:00:00,0,1,8,20.4,8,0.7,8,南,8,88,8 (2015/6/14,22.565218) (2015/6/15,24.550001) (2015/6/16,23.358332) (2015/6/17,21.583334) 例:平均気温の計算
  • 9.
    © 2016 IBMCorporation9 • SQLを利用したデータ操作が可 能 • トランザクションなし • Parquet 、Json、Hive だけで なくJDBCやODBCもサポート • Thrift JDBC/ODBCによる外部 からの接続 • 後述のDataFrameをラップする 形で実装 {"name":"貝嶋", "address":{"city":"川崎", "state":"神奈川"}} {"name":"土屋", "address":{"city":"豊洲", "state":"東京"}} {“name”:“山田", "address":{"city":"横浜", "state":"神奈川"}} {"name":"岸代", "address":{"city":"後楽園", "state":"東京"}} val people = sqlContext.jsonFile("test.json") people.registerTempTable("people") val nameAndAddress = sqlContext.sql("SELECT name, address.city, address.state FROM people WHERE address.state="神奈川"") nameAndAddress.collect.foreach(println) {"name":"貝嶋", "address":{"city":"川崎", "state":"神奈川"}} {“name”:“山田", "address":{"city":"横浜", "state":"神奈川"}} 例:住所データ(json)からの特定データの抽出 • SparkSQLによるデータ操作 Spark SQL
  • 10.
    © 2016 IBMCorporation10 DataFrame API  Performance  Less Code
  • 11.
    © 2016 IBMCorporation11 DataFrame API  Preformance  Less Code SQL Spark DataFrame API Spark RDD
  • 12.
    © 2016 IBMCorporation13 • Sparkによるミニ(マイクロ)バッチの実行 • DStreamと呼ばれるRDDを操作 • 指定間隔ごとにまとめられたRDDを処理(Windows処 理も可能) • 通常のSparkプログラミングとほぼ同様 たとえば、定期的に流入するデータの「移動平均値」の連続計 算 val tstream = ssc.socketTextStream(hostname, port) var mdtxt = tstream.map(x => x.split(",")) .map(x => ( x(0), (x(0), x(1), x(2).toInt) ) ) .updateStateByKey(updateFunc _) mdtxt.print() センサーデータ: (Dev1, 201501010000, 0) (Dev2, 201501010000, 0) (Dev1, 201501010001, 1) Alert: Dev1 Status changed : 1  Sparkでストリーム処理 Spark Streaming 例:センサーデータの出力値変更時にアラート DStream RDD data data RDD data data RDD data data
  • 13.
    © 2016 IBMCorporation14 • MLlibとRが利用可能 MLlibはScalaで、SparkRはRで 記述可能 • アルゴリズム(MLlib) • SVM、ロジスティック回帰、決定木、K- means、ALSなど • IBMはSystemMLをSparkに提供 val data = spark.textFile("kdata.txt") val parsedData = data.map(x => Vectors.dense(x.split(',').map(_.toDouble))).cache() val numClusters = 3 val numIterations = 10 val clusters = KMeans.train(parsedData, numClusters, numIterations)  Sparkで機械学習 SparkR, Mllib データ: ( 直近購買月[n日前], 期間内購買回数 ) (5,1),(4,2),(5,3),(1,2),(2,4),(2,5),(2,6),(1,4),(1,5),(1,2),(1,5),(5,5) クラスタ結果: ([中心], 人数) ([1.0, 2.0], 2), ([1.5, 4.833333333333333], 6), ([4.666666666666666, 2.0], 3), ([5.0, 5.0], 1) 例:顧客のクラスタ分け 0 2 4 6 0 2 4 6
  • 14.
    © 2016 IBMCorporation15 • グラフデータを並列分散環境で処理するための フレームワーク • グラフ構造データを用いた解析を行う • 「点」と「辺」からなるデータ • SNSでのつながり、データ間の関連性 など • 表構造では扱うことが難しい関係を見つけ出す • データ間のつながりの抽出 • 輪の抽出 • 距離の計測 • 影響の計測 • グラフDBとの兼ね合い(これから) val graphWithDistance = Pregel( graph.mapVertices((id:VertexId, attr:Int) => List((id, 0))), List[(VertexId, Int)](), Int.MaxValue,EdgeDirection.Out)((id, attr, msg) => mergeVertexRoute(attr, msg.map(a=> (a._1, a._2 + 1))),edge => { val isCyclic = edge.srcAttr.filter(_._1 == edge.dstId).nonEmpty if(isCyclic) Iterator.empty else Iterator((edge.dstId, edge.srcAttr)) },(m1, m2) => m1 ++ m2 )  Sparkでグラフ処理を Spark GraphX つながりの検索 例: つながりと距離を見つけ出す 1,((1,0), (6,1), (9,1), (7,1), (4,2)) 1 2 3 4 5 6 7 89
  • 15.
    © 2016 IBMCorporation16 DataSet API • Spark v1.6で追加された新しいAPI • まだ実験的な実装であることに注意 • 登場背景 • RDDとDataFrameという二つの抽象概念ができてしまった。 • RDDとDataFrameにそれぞれ長所があること • 2つの抽象概念を行き来する為のコストがかかる • 二つの抽象概念をいいとこ取りしたDataSetAPIの登場 • DataFrameの速さはそのまま • オブジェクト・メソッドはコンパイル時のタイプセーフ提供 • DataFrameとのシームレス変換
  • 16.
    © 2016 IBMCorporation17 Structured Streaming • Spark v2.0で追加される予定の新しいAPI • Datasetの上に実装されたHigh-levelのStreamingAPI • Streamingデータを構造化データとして 継続的に処理可能 val in = spark.readStream .schema(schemaImp) .format("csv") .option("header", true) .option("maxFilesPerTrigger", 1) .load("csv-logs") Jacek Warszawa, Polska, 42,true Jacek Warszawa, Polska, 42,true ------------------------------------------- Batch: 0 ------------------------------------------- +-----+--------+-------+---+-----+ | name| city|country|age|alive| +-----+--------+-------+---+-----+ |Jacek|Warszawa| Polska| 42| true| +-----+--------+-------+---+-----+ complete output delta output
  • 17.
    © 2016 IBMCorporation18 本日のサンプル(感情極性分析) • Sparkを使った記事の感情極性分析を行います。(いわゆるネガポ ジ) • AdTechやSNS分析などで利用される分析 • その記事が肯定的な内容なのか否定的な内容なのかの判定に利用 否定的な内容の記事 広告が出る
  • 18.
    © 2016 IBMCorporation19 本日のサンプル(感情極性分析) • Sparkを使った記事の感情極性分析を行います。(いわゆるネガポ ジ) • 記事を読み込みword毎に区切る • 単語極性対応表を使って記事の単語を評価 • 評価値を元にNegative / Pojitiveを数値で評価 記事 単語極性 対応表 単語分割 kuromoji (ipadic) 辞書作成 マッチング 記事評価単語リスト
  • 19.
    © 2016 IBMCorporation20 本日のサンプル(感情極性分析) • 記事 • 記事タイトル,本文,メディアのCSV • サンプル記事 • 飲酒運転、検挙数5分の1に減 「悪質」の割合は高まる • 領海侵入の沈静化要求=岸田氏「首脳会談の前提」―日中外相会談 • 国交省、休日のダム見学、ツアーを実施することを発表 内部の一般開放も推進 • 過去最多メダル獲得 リオ五輪日本選手団の解団式 • 辞書 • 単語¥t極性値t用法 • サンプルデータ • 貪欲 n 〜である・になる(評価・感情)主観 • 絆 p 〜がある・高まる(存在・性質) • 腕前 e 〜がある・高まる(存在・性質) • 腕利き p 〜である・になる(評価・感情)主観
  • 20.
    © 2016 IBMCorporation21 参考 • 辞書 • 日本語評価極性辞書 • 東山昌彦, 乾健太郎, 松本裕治, 述語の選択選好性に着目した名詞評価極性の獲得, 言語処理学会第14 回年次大会論文集, pp.584-587, 2008. / Masahiko Higashiyama, Kentaro Inui, Yuji Matsumoto. Learning Sentiment of Nouns from Selectional Preferences of Verbs and Adjectives, Proceedings of the 14th Annual Meeting of the Association for Natural Language Processing, pp.584-587, 2008.

Editor's Notes

  • #2 1
  • #3 会社ではSparkとHadoopのスペシャリストやってます。
  • #6 Apache Sparkの概要を簡単におさらいします。 SparkはSparkCoreモジュールとそれを利用したSparkSQL,GraphX,Streaming,Mllibからなります。 SparkCore:RDDを始めとる、メモリ管理やタスクスケジューリングなどの機能を提供するコンポーネント SparkSQL:構造化データを操作するため、SQLのインタフェースを提供するコンポーネント GraphX:グラフ演算処理を行い、グラフ操作するための機能を提供するコンポーネント Spark Streaming:ストリーミングデータの処理を提供するコンポーネント、RDDの拡張であるDStreamを用いてRDDと似た操作が可能 MLlib: 分類、推薦、クラスタリングなどの機械学習アルゴリズムを提供するコンポーネント
  • #7 MapReduceと比較してオンメモリでの分散処理に特化しています。 まずはMapReduceを用いてデータ処理を行った場合の処理例です。 MapReduceがスループットを重視し、バッチ処理に特化しているのに対して、 Sparkはレイテンシを重視し、インタラクティブにデータ分析が可能となっています。
  • #8 次にSparkのRDD&DAGの場合の処理例です。 後ほど出てきますが、SparkはSparkSQLを使うことでRDBの直接参照が可能です。 MapReduceがスループットを重視し、バッチ処理に特化しているのに対して、 Sparkはレイテンシを重視し、メモリ上で操作を行うことで、インタラクティブにデータ分析が可能となっています。
  • #10 そこでRDBMSと同様なSQLを用いてRDDの操作を行うのがSparkSQLです。
  • #11 DataFrameAPIを使うメリットとしては2つ Performance(catalystオプティマイザによる処理の最適化) Less Code(より簡素なコード)
  • #13 Catalystの主な役割は論理最適化と物理実行計画の最適化を行う Analysis:DataFrameの分析 Logical Optimization: 主に処理順序の最適化 Physical Planning: 幾つかの計画を実行コストで比較し、コストの低いものを選択 Code Generation: RDDの処理を生成
  • #17 RDDとDataFrameの相互変換は可能 RDDはJVMオブジェクトである為コンパイル時のタイプセーフ(DataFrameはタイプセーフにならない) RDDで書くほうが処理ロジックは容易 基本的に速い対してDataFrameは メモリアカウンティングをやってくれる などそれぞれメリットがある