More Related Content Similar to SparkMLlibで始めるビッグデータを対象とした機械学習入門 (20) More from Takeshi Mikami (20) SparkMLlibで始めるビッグデータを対象とした機械学習入門1. takemikamiʼs note ‒ http://takemikami.com/
Spark MLlibで始める
ビッグデータを対象とした機械学習⼊⾨
Copyright (C) Takeshi Mikami. All rights reserved. 1
三上威(フリーランスITエンジニア) twitter: @takemikami
2017.10.28 TKPガーデンシティ渋⾕ ホールB
Spark MLlib 機械学習 ビッグデータ
TECH & BRIDGE MEETING 〜エンジニア講演会〜
第4回 ⼈⼯知能・機械学習・ディープラーニング 〜中級者向け〜
2. takemikamiʼs note ‒ http://takemikami.com/
はじめに
• 対象:
機械学習やビッグデータ未経験のエンジニア
• テーマ:
Spark MLlibを利⽤した
ビッグデータを対象とした機械学習
• 内容
• 機械学習及びビッグデータの概要
• Hadoop及びSpark MLlibのシステム構成例
• 機械学習システムの開発プロセス
• Spark MLlibを使った機械学習の紹介
Copyright (C) Takeshi Mikami. All rights reserved. 2
本資料で説明する内容を⽰します
3. takemikamiʼs note ‒ http://takemikami.com/
⾃⼰紹介
• 三上威 (@takemikami)
• フリーランスITエンジニア
• データ分析及び機械学習等の応⽤システム開発
• マーケティングデータ分析基盤のシステム開発
• 略歴
• 確率論・情報通信ネットワーク @ 甲南⼤学理学部応⽤数学科
• Web系システムの開発・構築 @ NEC系SIer
• 旅⾏系ECサイトのマーケティングデータ分析 @ DeNA
• データ分析及び機械学習等の応⽤システム開発 @ フリーランス
• 最近扱っている技術領域
• Hadoop&Spark, Scala, Python, hivemall, AWS
Copyright (C) Takeshi Mikami. All rights reserved. 3
発表者のプロフィールを紹介します
4. takemikamiʼs note ‒ http://takemikami.com/
機械学習を応⽤するためのスキル
Copyright (C) Takeshi Mikami. All rights reserved. 4
※丸⼭宏・⼭⽥敦・神⾕直樹共著「データサイエンティスト・ハンドブック」(近代科学社)を参考に作成
ビジネス⼒
(business problem solving)
データエンジニアリング⼒
(data engineering)
データサイエンス⼒
(data science)
ビジネス課題を
理解・解決するスキル
統計・機械学習等の情報科学を
理解・活⽤するスキル
データの加⼯・運⽤環境
を実装するスキル
機械学習を応⽤するために必要なスキルを紹介します
データサイエンティスト
に求められるスキルとして
よく⽰されるものです
5. takemikamiʼs note ‒ http://takemikami.com/
ビジネス⼒とは
• ビジネス課題を整理する
「このデータ分析によって解きたいビジネス課題は何か」を考える
→課題を明確にしておかないと成果に結びつかない
• ビジネス課題を説明する
レポーティングやプレゼンスキル
→意思決定者が理解出来ないと実⾏できない
Copyright (C) Takeshi Mikami. All rights reserved. 5
機械学習を応⽤するためのビジネス⼒について説明します
6. takemikamiʼs note ‒ http://takemikami.com/
データサイエンス⼒とは
• アルゴリズムを理解する
統計学や機械学習のアルゴリズムの理解
→理解していないとチューニングが⾏えない
• データ・アルゴリズムの特性を理解する
データの特性、それらを計算するための計算資源の⾒
→実⽤的にデータを活⽤するための設計に必要
Copyright (C) Takeshi Mikami. All rights reserved. 6
機械学習を応⽤するためのデータサイエンス⼒について説明します
7. takemikamiʼs note ‒ http://takemikami.com/
データエンジニアリング⼒とは
• アルゴリズムの実装スキル
ライブラリの活⽤スキル、アルゴリズムの実装スキル
→システム化するために必要
• システムインフラの運⽤スキル
ビッグデータ、並列分散処理などの理解と運⽤スキル
→⼤量のデータを扱う場合に必要
Copyright (C) Takeshi Mikami. All rights reserved. 7
機械学習を応⽤するためのデータエンジニアリング⼒について説明します
8. takemikamiʼs note ‒ http://takemikami.com/
本⽇扱う分野 (機械学習を応⽤するためのスキル)
Copyright (C) Takeshi Mikami. All rights reserved. 8
ビジネス⼒
(business problem solving)
データエンジニアリング⼒
(data engineering)
データサイエンス⼒
(data science)
データエンジニアリング
を中⼼にお話しします
機械学習を応⽤するためのスキルの中で、本⽇お話する分野を⽰します
9. takemikamiʼs note ‒ http://takemikami.com/
機械学習及びビッグデータの概要
機械学習とビッグデータ
ビッグデータの概要
Hadoop、Spark、SparkMLlib
機械学習の概要
データ分析のアプローチ、機械学習の⼿法
Copyright (C) Takeshi Mikami. All rights reserved. 9
10. takemikamiʼs note ‒ http://takemikami.com/
機械学習とビッグデータの位置づけ
Copyright (C) Takeshi Mikami. All rights reserved. 10
機械学習とビッグデータ
ビジネスシーンにおける、機械学習とビッグデータの位置づけを⽰します。
分析対象
データ分析
社会・
業界
Data Warehouse
収集施策
収
集
DataMart
分析ツール
機械学習
加⼯
分析・機械学習担当者
⼈ 物
・・・
施策の検討や意思決定を、
機械学習で⽀援
11. takemikamiʼs note ‒ http://takemikami.com/
機械学習とビッグデータの位置づけ
Copyright (C) Takeshi Mikami. All rights reserved. 11
機械学習とビッグデータ
ビジネスシーンにおける、機械学習とビッグデータの位置づけを⽰します。
分析対象
データ分析
社会・
業界
Data Warehouse
収集施策
収
集
DataMart
分析ツール
機械学習
加⼯
分析・機械学習担当者
⼈ 物
・・・
IoTの普及などにより
⼤量のデータを
収集出来るようになってきた
分散ファイルシステム・分散処理によって、
⼤量のデータを保存・処理しやすくなってきた
⼤量のデータを対象とした
機械学習への要求
12. takemikamiʼs note ‒ http://takemikami.com/
Apache Hadoopとは
• 「データ保存のための分散ファイルシステム」
「データ処理のための並列処理システム」
によってビッグデータの分散処理を実現する
• 4つのモジュールで構成される
• 共通ユーティリティ (Hadoop Common)
• 分散ファイルシステム (Hadoop HDFS)
• クラスタリソース・ジョブ管理 (Hadoop YARN)
• 並列データ処理システム (Hadoop MapReduce)
Copyright (C) Takeshi Mikami. All rights reserved. 12
ビッグデータの概要
Apache Hadoopの紹介をします
ビッグデータ分散処理のフレームワーク
13. takemikamiʼs note ‒ http://takemikami.com/
HDFS(Hadoop Distributed File System)とは
• HDFSとはHadoop独⾃の分散ファイルシステム。NameNodeと
DataNodeで構成される
Copyright (C) Takeshi Mikami. All rights reserved. 13
ビッグデータの概要
HDFS(Hadoop Distributed File SYstem)の紹介をします。
NameNode DataNode
Hadoop Cluster
DataNode
DataNode
・・
・
DataNode管理
メタ情報管理
分散して
ファイルを保存
Client
※同じファイルを3つ以上のDataNodeに保持し、
DataNodeの障害に対応できるように設定するのが⼀般的
①NameNodeにメタ情報を問い合わせ
②DataNode上のファイルにアクセス
①
②
14. takemikamiʼs note ‒ http://takemikami.com/
YARN(Yet Another Resource Negotiator)とは
• YARNはHadoopクラスタのリソース管理と、ジョブスケジューリングを
⾏う。ResourceManagerとNodeManagerで構成される
Copyright (C) Takeshi Mikami. All rights reserved. 14
ビッグデータの概要
YARN(Yet Another Resource Negotiator)の紹介をします。
ResourceManager NodeManager
Hadoop Cluster
NodeManager
NodeManager
・・
・
リソース管理
ジョブスケジューリング Jobを
並列実⾏
Client
MapReduceのJobを投⼊
Job
JobJob
Job
JobJob
Job
JobJob
Map, Reduce, Shuffleを実施
15. takemikamiʼs note ‒ http://takemikami.com/
Hadoop Clusterの全体像
• Hadoop Clusterは『分散ファイルシステム』『並列処理システム』の組
み合わせ構造になる
Copyright (C) Takeshi Mikami. All rights reserved. 15
ビッグデータの概要
Hadoop Clusterの全体像を⽰します
Hadoop Cluster
Client NameNode
ResourceManager
DataNode
NodeManager
DataNode
NodeManager
DataNode
NodeManager
Job
Job
Job
Job
Job
Job
Job
Job
Job
Master node Slave node
各Nodeにある
データを処理
Hadoop Clusterは、
各Nodeに分散保存されているデータに対して、
そのNode上で処理を実施できるので効率が良い。
(処理対象データを取得するための通信が不要)
16. takemikamiʼs note ‒ http://takemikami.com/
Apache Sparkとは
• ⾼速に動作する(Apache HadoopのMapreduceよりも)
• メモリ上にデータを持つので反復処理に強い
• SparkSQL, Streaming, MachineLearning(MLlib), Graph(GraphX) など
の応⽤利⽤が出来る
• Hadoop, Standalone, Mesosなどの様々な環境で動作する
Copyright (C) Takeshi Mikami. All rights reserved. 16
ビッグデータの概要
Apache Sparkの紹介をします
⾼速な並列データ処理システム
17. takemikamiʼs note ‒ http://takemikami.com/
Apache Hadoop上でのSpark
Copyright (C) Takeshi Mikami. All rights reserved. 17
ビッグデータの概要
Apache Hadoop上でのSparkの利⽤イメージを⽰します
Hadoop Cluster
Client NameNode
ResourceManager
DataNode
NodeManager
DataNode
NodeManager
DataNode
NodeManager
Job
Job
Job
Job
Job
Job
Job
Job
Job
Master node Slave node
各Nodeにある
データを処理
Hadoop Clusterは、
各Nodeに分散保存されているデータに対して、
そのNode上で処理を実施できるので効率が良い。
(処理対象データを取得するための通信が不要)
• Hadoop Cluster上のJobをSparkによって実⾏することが出来る
18. takemikamiʼs note ‒ http://takemikami.com/
Spark MLlibとは
• Sparkを利⽤することで、⼤規模なデータに対する機械学習を容易に利
⽤出来る
• 以下のようなツールを備える
• 分類・回帰・クラスタリング・協調フィルタリングのような基本的な機械学習の
アルゴリズム
• 特徴量の変換・次元削減・選択のような特徴量処理
• モデル開発・評価・チューニングを効率的に⾏うためのパイプライン
• アルゴリズム・モデル・パイプラインの永続化
• その他、線形代数や統計、データハンドリングのユーティリティ
Copyright (C) Takeshi Mikami. All rights reserved. 18
ビッグデータの概要
Spark MLlibの紹介をします
Sparkの機械学習ライブラリ
機械学習にありがちな
反復計算を⾏うアルゴリズムで
Sparkは有利
19. takemikamiʼs note ‒ http://takemikami.com/
データ分析のアプローチ
• データ分析のアプーチは以下の3つに分類できる
Copyright (C) Takeshi Mikami. All rights reserved. 19
機械学習の概要
アプローチ 説明 例 ⼿法
説明的データ分析
(descriptive)
事実を説明する・⾒
つける
・どんな⼈が何を買っているか?
・ある広告がどれだけ売上に貢献して
いるか?
BI、データマイニ
ング
予測的データ分析
(predictive)
(未来や⽋測値を)予
測する
・ある商品群を閲覧した⼈の性別は?
・広告を出稿したら、どれだけ売上が
上がるか?
分類・回帰、統計
的機械学習
指⽰的データ分析
(prescriptive)
最適解を探す ・利益を最⼤化するための、最適な仕
⼊れ量は?
・売上を最⼤化するには、どこに広告
を出稿すべきか?
最適化、実験計画
→ 実施したい「分析のアプローチ」が何かを認識し、適切な「⼿法」を適⽤する
3つのデータ分析のアプローチを紹介します
20. takemikamiʼs note ‒ http://takemikami.com/
代表的な機械学習の⼿法
Copyright (C) Takeshi Mikami. All rights reserved. 20
機械学習の概要
教師 種類 ⼿法 活⽤⽅法
教師あり
(supervised
learning)
分類
(classification)
ロジスティック回帰
決定⽊
SVM
ニューラルネットワーク
離脱顧客判定
スパムメールの判定
回帰
(regression)
線形回帰分析
ベイズ線形回帰分析
販売予測
教師なし
(unsupervised
learning)
クラスタリング
(clustering)
k-means法
混合正規分布モデル
顧客のセグメント分け
次元削減
(dimentionality reduction)
主成分分析
特異値分解
商品の類似性を可視化
※教師あり/なし以外にも強化学習(reinforcement learning)という⼿法もあります
代表的な機械学習の⼿法を紹介します
21. takemikamiʼs note ‒ http://takemikami.com/
教師あり学習の基本
Copyright (C) Takeshi Mikami. All rights reserved. 21
機械学習の概要
教師あり学習の基本的な考え⽅を説明します
やりたいこと:
「xの値」が与えられた時に「yの値」を予測したい
→ 𝑦 = 𝑓 𝑥 という関数を求めたい
𝑦 = 𝑓(𝑥)
⽬的変数 説明変数
予測モデル⽬的変数が離散値→分類
⽬的変数が連続値→回帰
22. takemikamiʼs note ‒ http://takemikami.com/
教師あり学習の基本
Copyright (C) Takeshi Mikami. All rights reserved. 22
機械学習の概要
教師あり学習の基本的な考え⽅を説明します
x y
データ1 1 2
データ2 2 4
データ3 3 6
データ4 4 8
データ5 5 ?
y = 2x
①教師データを取得
教師あり学習の⼿続き:
②教師データから y=f(x) を導く
10
③未知の値を予測する
予測(prediction)
学習
(fitting)
23. takemikamiʼs note ‒ http://takemikami.com/
クラスタリング(clustering)と分類(classification)
Copyright (C) Takeshi Mikami. All rights reserved. 23
機械学習の概要
分類(classification) クラスタリング(clustering)
教師 教師あり 教師なし
説明 与えられたデータを
適切なクラスに振り分ける
与えられたデータを
複数のグループ分ける
イメージ
既存データを元に作った予測モデルで
新規データを振り分ける
データの特徴を元に
意味あるグループが無いか⾒つける
A
モデル
B C
クラスタリングと分類(教師あり学習と教師なし学習)の違いを⽰します
24. takemikamiʼs note ‒ http://takemikami.com/
Hadoop及びSpark MLlibのシステム構成例
Hadoop/Sparkのシステム構成要素
Hadoop、Hive、Spark、PySpark、jupyter notebook
Hadoop/Sparkのシステム構成例・環境構築
システム構成例、環境構築の流れ
Copyright (C) Takeshi Mikami. All rights reserved. 24
25. takemikamiʼs note ‒ http://takemikami.com/
Apache Hadoopとは
• 「データ保存のための分散ファイルシステム」
「データ処理のための並列処理システム」
によってビッグデータの分散処理を実現する
• 4つのモジュールで構成される
• 共通ユーティリティ (Hadoop Common)
• 分散ファイルシステム (Hadoop HDFS)
• クラスタリソース・ジョブ管理 (Hadoop YARN)
• 並列データ処理システム (Hadoop MapReduce)
Copyright (C) Takeshi Mikami. All rights reserved. 25
Hadoop/Sparkのシステム構成要素
Apache Hadoopの紹介をします
ビッグデータ分散処理のフレームワーク
HDFSとYARNは説明済みなので、
次はMapReduceについて説明します
26. takemikamiʼs note ‒ http://takemikami.com/
MapReduceとは
• MapReduceとはデータの並列処理を⾏うためのアルゴリズム
• 『○○単位に』『××する』という処理を並列に⾏うことができる
Copyright (C) Takeshi Mikami. All rights reserved. 26
Hadoop/Sparkのシステム構成要素
MapReduceについて説明します。
HadoopMapReduceは
アルゴリズムの実装
⼊⼒ファイル
例) 「訪問者毎に」「PV数を数える」
Shuffle
※ここではVisitor1,2を集めている
時間 訪問者ID 種別
00:00 Visitor1 PV
00:03 Visitor1 CLICK
00:04 Visitor7 PV
00:05 Visitor1 PV
訪問者ID PV数
Visitor1 1
Visitor1 0
Visitor7 1
Visitor1 1
訪問者ID PV数
Visitor1 2
Visitor7 1
訪問者ID PV数
Visitor1 2
Visitor1 2
Visitor2 1
Visitor2 1
Visitor1 1
訪問者ID PV数
Visitor1 5
Visitor2 2
Reduce
Reduce
他の⼊⼒ファイルに対しても
並⾏してMapReduce
他も
同様にReduce
Map
27. takemikamiʼs note ‒ http://takemikami.com/
MapReduceの例:①Map処理
Copyright (C) Takeshi Mikami. All rights reserved. 27
Hadoop/Sparkのシステム構成要素
MapReduceについて説明します。
⼊⼒ファイル
例) 「訪問者毎に」「PV数を数える」
Shuffle
※ここではVisitor1,2を集めている
時間 訪問者ID 種別
00:00 Visitor1 PV
00:03 Visitor1 CLICK
00:04 Visitor7 PV
00:05 Visitor1 PV
訪問者ID PV数
Visitor1 1
Visitor1 0
Visitor7 1
Visitor1 1
訪問者ID PV数
Visitor1 2
Visitor7 1
訪問者ID PV数
Visitor1 2
Visitor1 2
Visitor2 1
Visitor2 1
Visitor1 1
訪問者ID PV数
Visitor1 5
Visitor2 2
Reduce
Reduce
他の⼊⼒ファイルに対しても
並⾏してMapReduce
他も
同様にReduce
Map
⼊⼒ファイルの各レコードの内容からPV数を算出する。
種別がPVなら1、それ以外なら0とする
28. takemikamiʼs note ‒ http://takemikami.com/
MapReduceの例:②Reduce処理(Shuffle前)
Copyright (C) Takeshi Mikami. All rights reserved. 28
Hadoop/Sparkのシステム構成要素
MapReduceについて説明します。
⼊⼒ファイル
例) 「訪問者毎に」「PV数を数える」
Shuffle
※ここではVisitor1,2を集めている
時間 訪問者ID 種別
00:00 Visitor1 PV
00:03 Visitor1 CLICK
00:04 Visitor7 PV
00:05 Visitor1 PV
訪問者ID PV数
Visitor1 1
Visitor1 0
Visitor7 1
Visitor1 1
訪問者ID PV数
Visitor1 2
Visitor7 1
訪問者ID PV数
Visitor1 2
Visitor1 2
Visitor2 1
Visitor2 1
Visitor1 1
訪問者ID PV数
Visitor1 5
Visitor2 2
Reduce
Reduce
他の⼊⼒ファイルに対しても
並⾏してMapReduce
他も
同様にReduce
Map
Visitor毎にPV数を合計する。
Visitor1は1+0+1=2, Visitor7は1となる
Combinerの処理
29. takemikamiʼs note ‒ http://takemikami.com/
MapReduceの例:③Shuffle処理
Copyright (C) Takeshi Mikami. All rights reserved. 29
Hadoop/Sparkのシステム構成要素
MapReduceについて説明します。
⼊⼒ファイル
例) 「訪問者毎に」「PV数を数える」
Shuffle
※ここではVisitor1,2を集めている
時間 訪問者ID 種別
00:00 Visitor1 PV
00:03 Visitor1 CLICK
00:04 Visitor7 PV
00:05 Visitor1 PV
訪問者ID PV数
Visitor1 1
Visitor1 0
Visitor7 1
Visitor1 1
訪問者ID PV数
Visitor1 2
Visitor7 1
訪問者ID PV数
Visitor1 2
Visitor1 2
Visitor2 1
Visitor2 1
Visitor1 1
訪問者ID PV数
Visitor1 5
Visitor2 2
Reduce
Reduce
他の⼊⼒ファイルに対しても
並⾏してMapReduce
他も
同様にReduce
Map
並列に実⾏した②の処理結果を、VisitorID毎に集めてくる。
ここではVisitor1,2の結果を集めている(逆にVisitor7は他の処理に任せている)
30. takemikamiʼs note ‒ http://takemikami.com/
MapReduceの例:④Reduce処理(Shuffle後)
Copyright (C) Takeshi Mikami. All rights reserved. 30
Hadoop/Sparkのシステム構成要素
MapReduceについて説明します。
⼊⼒ファイル
例) 「訪問者毎に」「PV数を数える」
Shuffle
※ここではVisitor1,2を集めている
時間 訪問者ID 種別
00:00 Visitor1 PV
00:03 Visitor1 CLICK
00:04 Visitor7 PV
00:05 Visitor1 PV
訪問者ID PV数
Visitor1 1
Visitor1 0
Visitor7 1
Visitor1 1
訪問者ID PV数
Visitor1 2
Visitor7 1
訪問者ID PV数
Visitor1 2
Visitor1 2
Visitor2 1
Visitor2 1
Visitor1 1
訪問者ID PV数
Visitor1 5
Visitor2 2
Reduce
Reduce
他の⼊⼒ファイルに対しても
並⾏してMapReduce
他も
同様にReduce
Map
Visitor毎にPV数を合計する。
Visitor1は2+2+1=5, Visitor2は1+1=2となる
31. takemikamiʼs note ‒ http://takemikami.com/
Apache Hiveとは
• Hadoopのファイルシステム上に格納されたファイルに対して、
データの問い合わせを⾏うことができる
• HiveQLというSQLライクな⾔語を、MapReduceジョブに変換し、
Hadoopに渡し実⾏する
• コマンドでの実⾏(hive)、
またはサーバプロセスで実⾏する(hiveserver2)
Copyright (C) Takeshi Mikami. All rights reserved. 31
Hadoop/Sparkのシステム構成要素
Apache Hiveの紹介をします。
Hadoop上のファイルに対するクエリ実⾏環境
32. takemikamiʼs note ‒ http://takemikami.com/
Hiveのシステム構成 〜hiveコマンドの場合
• hiveコマンドは、以下の処理を⾏う
• HiveQLの受け付け
• HiveQL→MapReduceジョブの変換
• 変換してMapReduceジョブをHadoopに渡す(処理はHadoopで実⾏)
Copyright (C) Takeshi Mikami. All rights reserved. 32
Hadoop/Sparkのシステム構成要素
Hiveのシステム構成を説明します。
Hadoop Cluster
NameNode
ResourceManager
DataNode
NodeManager
DataNode
NodeManager
DataNode
NodeManager
JobJobJob
JobJobJob
JobJobJob
Master node Slave nodehiveコマンド
metastore
MapReduce
ジョブHiveQL
メタ情報 (テーブル定義)
→RDBへのSQL問い合わせと同じ感覚で、Hadoop上のファイルに問い合わせができる
33. takemikamiʼs note ‒ http://takemikami.com/
hiveserver2
Hiveのシステム構成 〜hiveserver2の場合
• hiveserver2の場合も、hiveコマンドと⾏う処理は同じ
• サーバプロセスになるので、thriftやJDBCドライバ経由でクライアント
プログラムからHiveQLを投げることができる
Copyright (C) Takeshi Mikami. All rights reserved. 33
Hadoop/Sparkのシステム構成要素
Hiveのシステム構成を説明します。
Hadoop Cluster
NameNode
ResourceManager
DataNode
NodeManager
DataNode
NodeManager
DataNode
NodeManager
JobJobJob
JobJobJob
JobJobJob
Master node Slave nodebeelineなど
metastore
MapReduce
ジョブHiveQL
メタ情報 (テーブル定義)
34. takemikamiʼs note ‒ http://takemikami.com/
metastoreとは
• metastoreは、HiveQLでクエリでみるテーブル定義情報を格納
• 実体はHadoopクラスタ上、メタ情報はRDBに格納
Copyright (C) Takeshi Mikami. All rights reserved. 34
Hadoop/Sparkのシステム構成要素
Hiveのmetastoreについて説明します。
Hadoop Cluster
NameNode
ResourceManager
DataNode
NodeManager
DataNode
NodeManager
DataNode
NodeManager
JobJobJob
JobJobJob
JobJobJob
Master node Slave nodehiveコマンド
metastore
MapReduce
ジョブHiveQL
メタ情報 (テーブル定義)
テーブル名 カラム名 型
access_log access_dt datetime
access_log visitor_id string
access_log access_type string
データの実体
(HDFS上のファイル)
データの実体
(HDFS上のファイル)
データの実体
(HDFS上のファイル)
時間 訪問者ID 種別
00:00 Visitor1 PV
00:03 Visitor1 CLICK
00:04 Visitor7 PV
00:05 Visitor1 PV
35. takemikamiʼs note ‒ http://takemikami.com/
Partitionとは
• hiveのテーブルは、ファイルシステムの指定ディレクトリ配下に格納
• パーティションを⽤いると、サブディレクトリで管理することができる
• 例えば、期間を区切った集計が多い場合は、年⽉⽇などでパーティションを切る
と、対象期間のファイルのみを対象に処理をする(=性能改善)
Copyright (C) Takeshi Mikami. All rights reserved. 35
Hadoop/Sparkのシステム構成要素
Hiveのpartitionについて説明します。
テーブル(パーティション無し)
/0001
/0002
/0003
/0004
テーブル(年⽉⽇パーティション有り)
/ymd=20160101
/0001
/0002
/ymd=20160102
/0001
/0002
全ファイルを処理
指定した期間の
ファイルのみを処理
→DWHでは期間指定のクエリを多⽤するので、期間のパーティションはよく使われる
36. takemikamiʼs note ‒ http://takemikami.com/
external tableとは
• external tableを使うと、HDFSなどに配置したファイル(tsvなど)をhive
のテーブルとして扱うことができる
Copyright (C) Takeshi Mikami. All rights reserved. 36
Hadoop/Sparkのシステム構成要素
Hiveのexternal tableについて説明します。
EMR (Elastic MapReduce)
NameNode
ResourceManager
DataNode
NodeManager
DataNode
NodeManager
DataNode
NodeManager
JobJobJob
JobJobJob
JobJobJob
Master node Slave node
hiveコマンド
metastor
e
hive以外のバッチ
なんらかのジョブ
①バッチジョブでデータを投⼊
Create external table
②External tableとして定義
HiveQL ③External tableにクエリ発⾏
External tableの利⽤例
※ hiveのテーブルの実体は、ファイルシステム上のファイル。
通常の(externalでない)テーブルの場合、create tableでテーブルを作成してinsertするとファイルが作成される
37. takemikamiʼs note ‒ http://takemikami.com/
MapReduceによるJoin
Copyright (C) Takeshi Mikami. All rights reserved. 37
Hadoop/Sparkのシステム構成要素
MapReduceによるJoin⽅法を紹介します
• MapReduceによるテーブルのJoinは2つの⽅法がある
• Merge Join
• 結合する属性で結合・被結合の両テーブルをMap-Reduce
• Map Join
• 各ノード被結合テーブルをコピー
• 結合テーブルのMap時に、被結合テーブルを参照して紐付け
→巨⼤なテーブル同⼠の結合が可能
→被結合テーブルが⼗分に⼩さい場合は効率がよい
38. takemikamiʼs note ‒ http://takemikami.com/
Merge Joinの⼿続き 1/4
• 受注・受注明細から店舗ごとの売上⾼を集計する例で説明します
Copyright (C) Takeshi Mikami. All rights reserved. 38
Hadoop/Sparkのシステム構成要素
Merge Joinの⼿続きを説明します
受注番号 受注店舗 受注⽇時
001 渋⾕店 2017/10/10
002 新宿店 2017/10/10
受注番号 商品名 数量 単価
001 商品A 5 1,000
001 商品B 1 5,000
002 商品A 2 1,000
select 受注.受注店舗, sum(受注明細.数量 *受注明細.単価) as 売上⾼
from 受注明細
left join 受注 on 受注明細.受注番号=受注.受注番号
group by 受注.受注店舗
受注店舗 売上⾼
渋⾕店 10,000
新宿店 2,000
受注 受注明細
39. takemikamiʼs note ‒ http://takemikami.com/
Merge Joinの⼿続き 2/4
• Joinする属性で各テーブルをMap
Copyright (C) Takeshi Mikami. All rights reserved. 39
Hadoop/Sparkのシステム構成要素
Merge Joinの⼿続きを説明します
受注番号 受注店舗 受注⽇時
001 渋⾕店 2017/10/10
002 新宿店 2017/10/10
受注番号 商品名 数量 単価
001 商品A 5 1,000
001 商品B 1 5,000
002 商品A 2 1,000
受注 受注明細
Key Value
Key Value
40. takemikamiʼs note ‒ http://takemikami.com/
Merge Joinの⼿続き 3/4
• Keyで全レコードをReduce
Copyright (C) Takeshi Mikami. All rights reserved. 40
Hadoop/Sparkのシステム構成要素
Merge Joinの⼿続きを説明します
受注店舗 受注⽇時 受注番号
渋⾕店 2017/10/10 001
新宿店 2017/10/10 002
受注番号 商品名 数量 単価
001 商品A 5 1,000
001 商品B 1 5,000
002 商品A 2 1,000
受注
Value Key
Key Value
受注明細
Reduce
受注店舗 受注⽇時 受注番号 商品名 数量 単価
渋⾕店 2017/10/10 001 商品A 5 1,000
商品B 1 5,000
新宿店 2017/10/10 002 商品A 2 1,000
41. takemikamiʼs note ‒ http://takemikami.com/
Merge Joinの⼿続き 4/4
• Join後のテーブルに対して、group byする属性でMap-Reduce
Copyright (C) Takeshi Mikami. All rights reserved. 41
Hadoop/Sparkのシステム構成要素
Merge Joinの⼿続きを説明します (この⼿続きはjoin後の処理)
受注店舗 受注⽇時 受注番号 商品名 数量 単価
渋⾕店 2017/10/10 001 商品A 5 1,000
商品B 1 5,000
新宿店 2017/10/10 002 商品A 2 1,000
Key Value
受注店舗 売上⾼
渋⾕店 10,000
新宿店 2,000
42. takemikamiʼs note ‒ http://takemikami.com/
Map Joinの⼿続き 1/3
• 商品マスタ・受注明細から商品分類ごとの売上⾼を集計する例で説明し
ます
Copyright (C) Takeshi Mikami. All rights reserved. 42
Hadoop/Sparkのシステム構成要素
Map Joinの⼿続きを説明します
商品分類 商品名
J01 商品A
J02 商品B
受注番号 商品名 数量 単価
001 商品A 5 1,000
001 商品B 1 5,000
002 商品A 2 1,000
select 商品マスタ.商品分類, sum(受注明細.数量 *受注明細.単価) as 売上⾼
from 受注明細
left join 商品マスタ on 受注明細.商品名=商品マスタ.商品名
group by 商品マスタ.商品分類
商品分類 売上⾼
J01 7,000
J02 5,000
商品マスタ 受注明細
43. takemikamiʼs note ‒ http://takemikami.com/
Map Joinの⼿続き 2/3
• group byする属性でMap時に、商品マスタを参照しながら結合
Copyright (C) Takeshi Mikami. All rights reserved. 43
Hadoop/Sparkのシステム構成要素
Map Joinの⼿続きを説明します
受注番号 商品名 数量 単価
001 商品A 5 1,000
001 商品B 1 5,000
002 商品A 2 1,000
受注明細
商品分類 商品名
J01 商品A
J02 商品B
商品マスタ
商品分類 売上⾼
J01 5000
J02 5000
J01 2000
事前に各Nodeにコピー
key value
44. takemikamiʼs note ‒ http://takemikami.com/
Map Joinの⼿続き 3/3
• group byする属性でReduce
Copyright (C) Takeshi Mikami. All rights reserved. 44
Hadoop/Sparkのシステム構成要素
Map Joinの⼿続きを説明します (この⼿続きはjoin後の処理)
商品分類 売上⾼
J01 5000
J02 5000
J01 2000
value
商品分類 売上⾼
J01 7,000
J02 5,000
key
45. takemikamiʼs note ‒ http://takemikami.com/
HadoopとSparkの役割
• HadoopMapReduceでデータ抽出・加⼯/Sparkで機械学習が考えられる
Copyright (C) Takeshi Mikami. All rights reserved. 45
Hadoop/Sparkのシステム構成要素
ビッグデータの機械学習におけるHadoopとSparkの役割を整理します
HDFS
Hadoop MapReduce
Apache Hive
fluentd など
データ抽出・加⼯
データ収集
Apache Spark
Spark MLlib
学習と予測
46. takemikamiʼs note ‒ http://takemikami.com/
RDD - データの分散コレクション
• RDDとは複数ノードに分散配置される分散コレクション
Copyright (C) Takeshi Mikami. All rights reserved. 46
Hadoop/Sparkのシステム構成要素
データの分散コレクション(RDD)について説明します
Hadoop Cluster
RDDへの操作RDDへの
操作
Master node Slave node
RDDへの操作は、実際はノード毎に分散処理される
※RDD: Resilient Distributed Dataset
Data
RDDへの操作 Data
RDDへの操作 Data
RDD
47. takemikamiʼs note ‒ http://takemikami.com/
RDDに対する処理
• RDDに対してはMapReduceで処理を⾏う
Copyright (C) Takeshi Mikami. All rights reserved. 47
Hadoop/Sparkのシステム構成要素
RDDに対する処理のイメージを⽰します
# ファイルを読み込み
text_file = sc.textFile("hdfs://...")
# 単語数をカウントするMapReduceを定義
counts = text_file.flatMap(lambda line: line.split(" "))
.map(lambda word: (word, 1))
.reduceByKey(lambda a, b: a + b)
# MapReduceの処理結果を保存
counts.saveAsTextFile("hdfs://...")
WordCountの例
MapReduceの定義
※ https://spark.apache.org/examples.html から
48. takemikamiʼs note ‒ http://takemikami.com/
DataFrameに対する処理
• DataFrameは、RやPandasのように操作ができる
Copyright (C) Takeshi Mikami. All rights reserved. 48
Hadoop/Sparkのシステム構成要素
DataFrameに対する処理のイメージを⽰します
# ファイルを読み込んでDataFrameに変換
textFile = sc.textFile("hdfs://...")
df = textFile.map(lambda r: Row(r)).toDF(["line"])
# 「ERROR」を含む⾏を抽出
errors = df.filter(col("line").like("%ERROR%"))
# 該当⾏数をカウント
errors.count()
テキスト検索の例
→MapRecuceを意識しなくてよいので、プログラミングが苦⼿な⼈でも扱いやすい
filterのようなメソッドが使える
(MapReduceを意識しなくてよい)
※ https://spark.apache.org/examples.html から
49. takemikamiʼs note ‒ http://takemikami.com/
SparkSQLによる処理
• SparkSQLではHiveのテーブルに対してクエリを実⾏出来る
Copyright (C) Takeshi Mikami. All rights reserved. 49
Hadoop/Sparkのシステム構成要素
SparkSQLによる処理のイメージを⽰します
# コンテキストの取得
from pyspark.sql import HiveContext
sqlContext = HiveContext(sc)
# クエリの実⾏
df = sqlContext.sql("select * from <テーブル名> limit 10")
# 結果の表⽰
df.show()
Hiveクエリの実⾏例
→Hiveのテーブルを機械学習の⼊出⼒に利⽤できる
Hiveクエリの結果を
DataFrameとして取得
50. takemikamiʼs note ‒ http://takemikami.com/
PySparkの位置づけ
Copyright (C) Takeshi Mikami. All rights reserved. 50
Hadoop/Sparkのシステム構成要素
PySparkの位置づけを⽰します
Hadoop Cluster
PySpark NameNode
ResourceManager
DataNode
NodeManager
DataNode
NodeManager
DataNode
NodeManager
Job
Job
Job
Job
Job
Job
Job
Job
Job
Master node Slave node
PySparkを利⽤することで、
Sparkの処理結果に対し、Pythonのエコシステムを利⽤可能
• PySparkとはPython⽤のSparkAPI
Java/ScalaPython
Pandas
jupyter
matplotlib
numpy
Python EcoSystem
51. takemikamiʼs note ‒ http://takemikami.com/
SparkとPandasのDataFrame
• SparkとPandasのDataFrameは相互に変換できます
Copyright (C) Takeshi Mikami. All rights reserved. 51
Hadoop/Sparkのシステム構成要素
SparkとPandasのDataFrameの変換イメージを⽰します
# PandasのDataFrameを作成
import pandas as pd
import numpy as np
pandasDf = pd.DataFrame({ 'id' : np.array([1, 2]), 'name': np.array(["apple", "orange"])})
# PandasのDataFrame → SparkのDataFrame
sparkDf = spark.createDataFrame(pandasDf)
# SparkのDataFrame表⽰
sparkDf.show()
# SparkのDataFrame → PandasのDataFrame
sparkDf.toPandas()
Spark/PandasのDataFrame変換の例
Spark→Pandas
Pandas→Spark
52. takemikamiʼs note ‒ http://takemikami.com/
可視化・レポーティング環境 〜jupyter notebook, matplotlib
Copyright (C) Takeshi Mikami. All rights reserved. 52
Hadoop/Sparkのシステム構成要素
可視化・レポーティング⽤ツールとしてjupyter notebook, matplotlibを紹介します
Pythonのコード
(分析のプロセス)
Pythonの処理結果
(分析の結果)
jupyter notebook
→ 分析のプロセスと結果の記録
matplotlibによる可視化
matplotlib
→ 分析の結果の可視化
Pythonのコード
(分析のプロセス)
Pythonの処理結果
(分析の結果)
53. takemikamiʼs note ‒ http://takemikami.com/
JOB
FILE
(HDFS)
システム構成例
• Hadoop/Spark及びPythonを利⽤するシステム構成例です
Copyright (C) Takeshi Mikami. All rights reserved. 53
Hadoop/Sparkのシステム構成例・環境構築
Hadoop/Sparkのシステム構成例を⽰します
NameNode
ResourceManager
DataNode
NodeManager
mariadb name data
hive
metastore
Hadoop Cluster
Python(Anaconda)
hive
pysparkjupyter
分析⽤マシン
メタ情報管理DB
Master node Slave node
job
meta
54. takemikamiʼs note ‒ http://takemikami.com/
環境構築の流れ
• 以下の流れで、1台のマシンにHadoop/Spark環境を構築します
Copyright (C) Takeshi Mikami. All rights reserved. 54
Hadoop/Sparkのシステム構成例・環境構築
Hadoop/Sparkの環境構成の流れを説明します
①Hadoop/Hive/Sparkのインストール
②SSHの接続設定
③HDFSの設定
④YARNの設定
⑤Hiveの設定
⑥Anacondaのインストール
⑦pysparkとjupyter notebookの設定
※構築⼿順は、HadoopのバージョンやOSの設定などに依存するので、参考程度にご覧下さい。
55. takemikamiʼs note ‒ http://takemikami.com/
環境構築① Hadoop/Hive/Sparkのインストール
• 以下のようにmariadb/hadoop/hive/sparkをインストール
(macosでhomebrewを利⽤している場合)
• 以下のように各プロダクトのHOMEを環境変数に設定
(.bash_profileなどに設定)
Copyright (C) Takeshi Mikami. All rights reserved. 55
Hadoop/Sparkのシステム構成例・環境構築
Hadoop/Sparkの環境構成の流れを説明します
$ brew install mariadb
$ brew install hadoop
$ brew install hive
$ brew install apache-spark
export HADOOP_HOME=/usr/local/opt/hadoop/libexec
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HIVE_HOME=/usr/local/opt/hive/libexec
export SPARK_HOME=/usr/local/opt/apache-spark/libexec
56. takemikamiʼs note ‒ http://takemikami.com/
環境構築② SSHの接続設定
• ⾃ホストにSSH接続できるようにキーを配置
• ⼀度SSH接続してfingerprintを作っておく
Copyright (C) Takeshi Mikami. All rights reserved. 56
Hadoop/Sparkのシステム構成例・環境構築
Hadoop/Sparkの環境構成の流れを説明します
$ ssh-keygen
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
$ ssh localhost
$ exit
57. takemikamiʼs note ‒ http://takemikami.com/
環境構築③ HDFSの設定
• 設定ファイルに、HDFS関連の設定を記載します
Copyright (C) Takeshi Mikami. All rights reserved. 57
Hadoop/Sparkのシステム構成例・環境構築
Hadoop/Sparkの環境構成の流れを説明します
JOB
FILE
(HDFS)
NameNode
ResourceManager
DataNode
NodeManager
mariadb name data
hive
metastore
Hadoop Cluster
Python(Anaconda)
hive
pysparkjupyter
分析⽤マシン
メタ情報管理DB
Master node Slave node
job
meta
ファイルの位置を「hdfs-site.xml」にファイルの位置を「hdfs-site.xml」に
NameNodeのhost/portを「core-site.xml」に
58. takemikamiʼs note ‒ http://takemikami.com/
環境構築③ HDFSの設定
• NameNodeのhost/portを記載 →$HADOOP_CONF_DIR/core-site.xml
• name/dataのファイル位置を記載 →$HADOOP_CONF_DIR/hdfs-site.xml
Copyright (C) Takeshi Mikami. All rights reserved. 58
Hadoop/Sparkのシステム構成例・環境構築
Hadoop/Sparkの環境構成の流れを説明します
<property>
<name>fs.defaultFS</name><value>hdfs://localhost:9001</value>
</property>
<property>
<name>dfs.name.dir</name><value>/var/lib/hdfs/name</value>
</property>
<property>
<name>dfs.data.dir</name><value>/var/lib/hdfs/data</value>
</property>
<property>
<name>dfs.replication</name><value>1</value>
</property>
1台のマシンで構築するので、
ここではReplication数は1
※通常は3以上にする
59. takemikamiʼs note ‒ http://takemikami.com/
環境構築③ HDFSの設定
• 以下のようにHDFSを起動
• ブラウザで起動状況を確認 →http://localhost:50070/
Copyright (C) Takeshi Mikami. All rights reserved. 59
Hadoop/Sparkのシステム構成例・環境構築
Hadoop/Sparkの環境構成の流れを説明します
$ $HADOOP_HOME/sbin/start-dfs.sh
60. takemikamiʼs note ‒ http://takemikami.com/
環境構築③ HDFSの設定
• 以下のようにファイルをHDFSに配置
• 以下のように配置されたファイルを確認
Copyright (C) Takeshi Mikami. All rights reserved. 60
Hadoop/Sparkのシステム構成例・環境構築
Hadoop/Sparkの環境構成の流れを説明します
$ $HADOOP_HOME/bin/hadoop fs -put README.md /
$ $HADOOP_HOME/bin/hadoop fs -ls /
-rw-r--r-- 1 take supergroup 149 2017-10-27 16:54 /README.md
61. takemikamiʼs note ‒ http://takemikami.com/
環境構築④ YARNの設定
• 設定ファイルに、HDFS関連の設定を記載します
Copyright (C) Takeshi Mikami. All rights reserved. 61
Hadoop/Sparkのシステム構成例・環境構築
Hadoop/Sparkの環境構成の流れを説明します
JOB
FILE
(HDFS)
NameNode
ResourceManager
DataNode
NodeManager
mariadb name data
hive
metastore
Hadoop Cluster
Python(Anaconda)
hive
pysparkjupyter
分析⽤マシン
メタ情報管理DB
Master node Slave node
job
meta
Jobの実⾏環境の設定を「mapred-site.xml」に
ResourceManagerのhostを「yarn-site.xml」に
62. takemikamiʼs note ‒ http://takemikami.com/
環境構築④ YARNの設定
• ResourceManagerのhostを記載 →$HADOOP_CONF_DIR/yarn-site.xml
• Jobの実⾏環境の設定を記載 →$HADOOP_CONF_DIR/mapred-site.xml
Copyright (C) Takeshi Mikami. All rights reserved. 62
Hadoop/Sparkのシステム構成例・環境構築
Hadoop/Sparkの環境構成の流れを説明します
<property>
<name>yarn.resourcemanager.hostname</name><value>localhost</value>
</property>
<property>
<name>mapreduce.framework.name</name><value>yarn</value>
</property>
63. takemikamiʼs note ‒ http://takemikami.com/
環境構築④ YARNの設定
• 以下のようにYARNを起動
• ブラウザで起動状況を確認 →http://localhost:8088/
Copyright (C) Takeshi Mikami. All rights reserved. 63
Hadoop/Sparkのシステム構成例・環境構築
Hadoop/Sparkの環境構成の流れを説明します
$ $HADOOP_HOME/sbin/start-yarn.sh
64. takemikamiʼs note ‒ http://takemikami.com/
環境構築④ YARNの設定
• 以下のようにサンプルのジョブを実⾏
• 右のように
ジョブが確認出来る
Copyright (C) Takeshi Mikami. All rights reserved. 64
Hadoop/Sparkのシステム構成例・環境構築
Hadoop/Sparkの環境構成の流れを説明します
$ $HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/share/hadoop/mapreduce/hadoop-mapreduce-
examples-2.8.0.jar pi 2 100
65. takemikamiʼs note ‒ http://takemikami.com/
環境構築⑤ Hiveの設定
• 設定ファイルに、Hive関連の設定を記載します
Copyright (C) Takeshi Mikami. All rights reserved. 65
Hadoop/Sparkのシステム構成例・環境構築
Hadoop/Sparkの環境構成の流れを説明します
JOB
FILE
(HDFS)
NameNode
ResourceManager
DataNode
NodeManager
mariadb name data
hive
metastore
Hadoop Cluster
Python(Anaconda)
hive
pysparkjupyter
分析⽤マシン
メタ情報管理DB
Master node Slave node
job
meta
metastoreへの接続情報を「hive-site.xml」に
metastoreのDBを初期化
mariadbに接続する
JDBCドライバを配置
66. takemikamiʼs note ‒ http://takemikami.com/
環境構築⑤ Hiveの設定
• 「https://dev.mysql.com/」からJDBCドライバ(mysql-connector-java-
x.x.xx.jarなど)をダウンロード、$HIVE_HOME/libに配置
• metastoreへの接続情報を記載 → $HIVE_HOME/conf/hive-site.xml
Copyright (C) Takeshi Mikami. All rights reserved. 66
Hadoop/Sparkのシステム構成例・環境構築
Hadoop/Sparkの環境構成の流れを説明します
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value><![CDATA[jdbc:mysql://localhost/(DB名)?autoReconnect=true&useSSL=false]]></value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name><value>com.mysql.jdbc.Driver</value>
</property>
<property><name>javax.jdo.option.ConnectionUserName</name><value>(ユーザ)</value></property>
<property><name>javax.jdo.option.ConnectionPassword</name><value>(パスワード)</value></property>
<property><name>datanucleus.fixedDatastore</name><value>false</value></property>
<property><name>hive.exec.local.scratchdir</name><value>/tmp/hive</value></property>
<property><name>hive.downloaded.resources.dir</name><value>/tmp/hive</value></property>
<property><name>hive.querylog.location</name><value>/tmp/hive</value></property>
<property><name>hive.execution.engine</name><value>mr</value></property>
67. takemikamiʼs note ‒ http://takemikami.com/
環境構築⑤ Hiveの設定
• 以下のようにDBを作成
• 以下のようにmetastoreのDBを初期化
• hiveの起動を確認
Copyright (C) Takeshi Mikami. All rights reserved. 67
Hadoop/Sparkのシステム構成例・環境構築
Hadoop/Sparkの環境構成の流れを説明します
$ $HIVE_HOME/bin/schematool -dbType mysql -initSchema
$ mysql -u root
> create database (DB名) default character set 'latin1';
> create user '(ユーザ)'@'localhost' identified by '(パスワード)';
> grant select, insert, update, delete, drop, alter, create, index, references on (DB名).* to '(ユー
ザ)'@'localhost';
> grant create routine, alter routine on (DB名).* to '(ユーザ)'@'localhost';
$ $HIVE_HOME/bin/hive
68. takemikamiʼs note ‒ http://takemikami.com/
環境構築⑥ Anacondaのインスト−ル
• Anacondaをインストールします
Copyright (C) Takeshi Mikami. All rights reserved. 68
Hadoop/Sparkのシステム構成例・環境構築
Hadoop/Sparkの環境構成の流れを説明します
JOB
FILE
(HDFS)
NameNode
ResourceManager
DataNode
NodeManager
mariadb name data
hive
metastore
Hadoop Cluster
Python(Anaconda)
hive
pysparkjupyter
分析⽤マシン
メタ情報管理DB
Master node Slave node
job
meta
Anacondaをインストール
69. takemikamiʼs note ‒ http://takemikami.com/
環境構築⑥ Anacondaのインスト−ル
• 以下のようにAnacondaをインストール
(pyenvを利⽤している場合)
• 作業⽤のパスに移動して、pyenvで利⽤するPythonを指定
• Pythonのバージョンを確認
Copyright (C) Takeshi Mikami. All rights reserved. 69
Hadoop/Sparkのシステム構成例・環境構築
Hadoop/Sparkの環境構成の流れを説明します
$ pyenv install anaconda3-4.4.0
$ cd (作業⽤のパス)
$ pyenv local anaconda3-4.4.0
$ python --version
Python 3.6.1 :: Anaconda custom (64-bit)
70. takemikamiʼs note ‒ http://takemikami.com/
環境構築⑦ pysparkとjupyter notebookの設定
• 以下のようにAnacondaをインストール
Copyright (C) Takeshi Mikami. All rights reserved. 70
Hadoop/Sparkのシステム構成例・環境構築
Hadoop/Sparkの環境構成の流れを説明します
JOB
FILE
(HDFS)
NameNode
ResourceManager
DataNode
NodeManager
mariadb name data
hive
metastore
Hadoop Cluster
Python(Anaconda)
hive
pysparkjupyter
分析⽤マシン
メタ情報管理DB
Master node Slave node
job
meta
SparkSQLからhive metastoreに接続する設定
jupyter notebookからPySparkを利⽤する設定
71. takemikamiʼs note ‒ http://takemikami.com/
環境構築⑦ pysparkとjupyter notebookの設定
• JDBCドライバの読み込み設定を追記 →$SPARK_HOME/conf/spark-defaults.conf
• metastoreへの接続情報を記載 (hiveの設定を参照するようにリンク)
Copyright (C) Takeshi Mikami. All rights reserved. 71
Hadoop/Sparkのシステム構成例・環境構築
Hadoop/Sparkの環境構成の流れを説明します
spark.driver.extraClassPath $HIVE_HOME/lib/mysql-connector-java-X.X.XX.jar
$ ln -sf $HIVE_HOME/conf/hive-site.xml $SPARK_HOME/conf/hive-site.xml
72. takemikamiʼs note ‒ http://takemikami.com/
環境構築⑦ pysparkとjupyter notebookの設定
• jupyter notebookからPySparkを利⽤するために以下の環境変数を設定
• pysparkを起動
Copyright (C) Takeshi Mikami. All rights reserved. 72
Hadoop/Sparkのシステム構成例・環境構築
Hadoop/Sparkの環境構成の流れを説明します
$ export PYSPARK_DRIVER_PYTHON=jupyter
$ export PYSPARK_DRIVER_PYTHON_OPTS='notebook'
$ pyspark
73. takemikamiʼs note ‒ http://takemikami.com/
機械学習システムの開発プロセス
機械学習システムの開発プロセスフロー
CRISP-DM、モデル開発の流れ
モデル開発のためのツール
基礎集計と可視化、特徴量処理、予測精度
Copyright (C) Takeshi Mikami. All rights reserved. 73
74. takemikamiʼs note ‒ http://takemikami.com/
CRISP-DM
Copyright (C) Takeshi Mikami. All rights reserved. 74
機械学習システムの開発プロセスフロー
データ分析のプロセスモデル(CRISP-DM)を紹介します
※CRISP-DM: CRoss-Industry Standard Process for Data Mining
ビジネス
理解
データ
理解
評価
共有・展開
データ準備
モデリング
データ
データ分析プロジェクトを
実施する時の
タスクのサイクル
75. takemikamiʼs note ‒ http://takemikami.com/
ビジネス
理解
データ
理解
評価
共有・展開
データ準備
モデリング
データ
CRISP-DM
• ビジネス理解
ビジネス上の⽬的・課題を明確化する
• データ分析で何をやりたいのか?
• データ分析でどのような課題を解決したいのか?
• データ理解
ビジネス上の⽬的・課題を解決する為のデータを洗い出す
• 必要なデータ項⽬があるか、量は⼗分か?
• 記録が残っているか? (最新状態だけでなく、ログが残っているか)
• データの質に問題がないか? (⼊⼒ミスがありそうか)
Copyright (C) Takeshi Mikami. All rights reserved. 75
機械学習システムの開発プロセスフロー
データ分析のプロセスモデル(CRISP-DM)を紹介します
76. takemikamiʼs note ‒ http://takemikami.com/
CRISP-DM
• データ準備
データを分析⽤に加⼯する
• ⽋測値、外れ値の除外、正規化など
• モデリング
機械学習の⼿法を適⽤してモデルを作成する
• 学習、予測、予測結果の解釈
• 評価
モデルが、ビジネス上の⽬的を達成出来るかを評価する
• 共有・展開
分析結果から試作を計画・⽴案して実施する
Copyright (C) Takeshi Mikami. All rights reserved. 76
機械学習システムの開発プロセスフロー
データ分析のプロセスモデル(CRISP-DM)を紹介します
ビジネス
理解
データ
理解
評価
共有・展開
データ準備
モデリング
データ
77. takemikamiʼs note ‒ http://takemikami.com/
モデル開発の流れ
Copyright (C) Takeshi Mikami. All rights reserved. 77
機械学習システムの開発プロセスフロー
モデル開発の流れを紹介します
スコアリング
特徴量
⽣成
モデル
構築
(バッチ処理による)
スコアリング
(オンライン処理⽤)
モデル更新
モデル⽣成データ準備
データ
収集
データ
抽出
本番運⽤
モデル開発 基礎集計
精度評価
ハイパー
パラメータ調整
特徴量処理
業務データ
の理解
可視化
以下のようなツールを⽤い、モデル構築までの処理をチューニング
アルゴリズム選択
効果測定
機械学習によるモデル開発と、
施策への適⽤の流れ
78. takemikamiʼs note ‒ http://takemikami.com/
基礎集計と可視化:度数分布表とヒストグラム
• 度数分布表(frequency table)
データをいくつかの階級に分類し、度数を集計した表
• ヒストグラム(histogram)
度数分布表をグラフとした表したもの
Copyright (C) Takeshi Mikami. All rights reserved. 78
モデル開発のためのツール
度数分布表とヒストグラムについて説明します
79. takemikamiʼs note ‒ http://takemikami.com/
基礎集計と可視化:度数分布表とヒストグラム
Copyright (C) Takeshi Mikami. All rights reserved. 79
モデル開発のためのツール
Pandasでのヒストグラムの出⼒⽅法を⽰します
※HDFS/Hiveに格納されたデータの
ヒストグラムを描画する場合は
SparkSQLでランダムサンプリングする
80. takemikamiʼs note ‒ http://takemikami.com/
基礎集計と可視化:要約統計量
• 要約統計量とはデータの特徴を代表して表す値(代表値)
• 平均値(mean) ※相加平均
全データを加算し、データ数で割った値
• 中央値(median)
データを順に並べて、ちょうど真ん中にある値
(データが偶数個の場合は真ん中にある2値の中間値)
• 最頻値(mode)
出現データ数が最も多い値(階級)
Copyright (C) Takeshi Mikami. All rights reserved. 80
モデル開発のためのツール
要約統計量について説明します
¯x =
1
n
nX
i=1
xi
81. takemikamiʼs note ‒ http://takemikami.com/
基礎集計と可視化:要約統計量
• 平均値(mean) ※相加平均
• 中央値(median)
• 最頻値(mode)
Copyright (C) Takeshi Mikami. All rights reserved. 81
モデル開発のためのツール
Hiveクエリによる要約統計量の求め⽅を⽰す
select avg(col) from tbl;
select percentile_approx(col, 0.5) from tbl;
select col, count(*) cnt from tbl group by col order by cnt desc limit 1;
82. takemikamiʼs note ‒ http://takemikami.com/
基礎集計と可視化:要約統計量
Copyright (C) Takeshi Mikami. All rights reserved. 82
モデル開発のためのツール
Pandasでの要約統計量の出⼒⽅法を⽰します
最⼤値・最⼩値
中央値・四分位点
平均値・標準偏差
83. takemikamiʼs note ‒ http://takemikami.com/
基礎集計と可視化:相関と散布図
• 2種類のデータの関係性把握のため「相関係数」「散布図」等を利⽤
• 相関係数 (Pearson coefficient of correlation)
2種類の値の共分散を、各標準偏差の積で割った値
2種類のデータの関係性の強さを⽰す指標
-1〜1の間の値をとり、以下の意味になる
「負の相関がある(=-1)〜相関がない(=0)〜正の相関がある(=1)」
• 散布図 (scatter plot)
2種類のデータをX・Y軸の値に対応させて点をプロットした図
Copyright (C) Takeshi Mikami. All rights reserved. 83
モデル開発のためのツール
相関と散布図について説明します
1
n
Pn
i=1(xi ¯x)(yi ¯y)
q
1
n
Pn
i=1(xi ¯x)
2
q
1
n
Pn
i=1(yi ¯y)
2
84. takemikamiʼs note ‒ http://takemikami.com/
基礎集計と可視化:相関と散布図
• 相関係数(pearson coefficient of correlation)
Copyright (C) Takeshi Mikami. All rights reserved. 84
モデル開発のためのツール
Hiveクエリによる相関係数の求め⽅を⽰す
select corr(col1, col2) from tbl;
85. takemikamiʼs note ‒ http://takemikami.com/
基礎集計と可視化:相関と散布図
Copyright (C) Takeshi Mikami. All rights reserved. 85
モデル開発のためのツール
Pandasでの散布図の出⼒⽅法を⽰します
86. takemikamiʼs note ‒ http://takemikami.com/
特徴量処理:正規化
• データの正規化は、
異なる種類のデータを1つの尺度に揃えるために⾏います
例えば以下のような正規化⼿法があります
• MinMaxScaler
最⼤値・最⼩値を揃える正規化
→データの範囲が限られているデータの場合に有効
• StandardScaler
平均を0、分散を1に揃える正規化
→外れ値があるデータの場合に、外れ値を無視出来る
Copyright (C) Takeshi Mikami. All rights reserved. 86
モデル開発のためのツール
データの正規化について説明します
87. takemikamiʼs note ‒ http://takemikami.com/
特徴量処理:正規化 MinMaxScalerの例
Copyright (C) Takeshi Mikami. All rights reserved. 87
モデル開発のためのツール
MLlibでのMinMaxScalerを紹介します
⼊⼒データの作成
学習と変換
88. takemikamiʼs note ‒ http://takemikami.com/
特徴量処理:正規化 MinMaxScalerの例
Copyright (C) Takeshi Mikami. All rights reserved. 88
モデル開発のためのツール
MLlibでのMinMaxScalerを紹介します
最⼩値0、最⼤値1に正規化
89. takemikamiʼs note ‒ http://takemikami.com/
特徴量処理:次元削減
• 次元削減とは変数の数(データの次元数)を削減すること
Copyright (C) Takeshi Mikami. All rights reserved. 89
モデル開発のためのツール
次元削減(dimensionality reduction)について説明します
x1 x2 … xn y
#1 1 3 … 1 2
#2 2 5 … 4 4
#3 3 6 … 5 6
#4 4 7 … 4 8
#5 5 8 … 2 10
xʼ1 xʼ2 y
#1 4 4 2
#2 3 7 4
#3 6 8 6
#4 5 7 8
#5 6 8 10
元の説明変数
数が多い ⽬的変数 ⽬的変数
次元削減後の
説明変数
→データ圧縮・データの類似性の可視化に利⽤できる
※ PCA = Principal Component Analysis (主成分分析)
90. takemikamiʼs note ‒ http://takemikami.com/
特徴量処理:次元削減 PCAの例
Copyright (C) Takeshi Mikami. All rights reserved. 90
モデル開発のためのツール
MLlibでのPCA(主成分分析)を紹介します
5次元→3次元に削減する例
⼊⼒データの作成
学習と変換学習と変換
91. takemikamiʼs note ‒ http://takemikami.com/
予測精度の評価
• データセットを教師/検証⽤に分割 → 検証⽤/予測値を⽐較して評価
Copyright (C) Takeshi Mikami. All rights reserved. 91
モデル開発のためのツール
予測精度の評価について説明します
x1 x2 … xn y
#1 1 3 … 1 2
#2 2 5 … 4 4
… … … … … …
#79 3 6 … 5 6
#80 4 7 … 4 8
… … … … … …
#100 5 8 … 2 10
x1 x2 … xn y
#1 1 3 … 1 2
#2 2 5 … 4 4
… … … … … …
#79 3 6 … 5 6
x1 x2 … xn y
#80 4 7 … 4 8
… … … … … …
#100 5 8 … 2 10
予測モデル
x1 x2 … xn yʼ
#80 4 7 … 4 9
… … … … … …
#100 5 8 … 2 11
学習
(fitting)
予測
(transform)
教師データ
検証データ
データセット
説明変数 ⽬的変数
検証データと予測値を⽐較検証データと予測値を⽐較
92. takemikamiʼs note ‒ http://takemikami.com/
予測精度の評価
• 以下のような評価指標を使って予測精度を評価します
• MAE (Mean Absolute Error: 平均絶対誤差)
予測値・正解値の差の絶対値の平均値 →⼩さいほど良い
• RMSE (Root Mean Squared Error: ⼆乗平均平⽅根誤差)
予測値・正解値の差の2乗の平均値の平⽅根 →⼩さいほど良い
• Coefficient of Determination (決定係数)
予測値・正解値の相関係数の2乗 →1.0に近いほど良い
Copyright (C) Takeshi Mikami. All rights reserved. 92
モデル開発のためのツール
予測精度の評価について説明します
※https://spark.apache.org/docs/2.1.1/mllib-evaluation-metrics.html#regression-model-evaluation
93. takemikamiʼs note ‒ http://takemikami.com/
予測精度の評価 RMSEの計算例
Copyright (C) Takeshi Mikami. All rights reserved. 93
モデル開発のためのツール
MLlibでの精度評価の例を紹介します
データセットを教師/検証⽤に分割 (8:2)
(training, test) = ratings.randomSplit([0.8, 0.2])
検証⽤/予測値を⽐較して評価 (RMSE)
evaluator = RegressionEvaluator(metricName="rmse",
labelCol="rating", predictionCol="prediction")
rmse = evaluator.evaluate(predictions)
94. takemikamiʼs note ‒ http://takemikami.com/
Spark MLlibを使った機械学習の紹介
Spark MLlibでの機械学習
分類と回帰、クラスタリング、協調フィルタリング
Spark MLlibでの機械学習の応⽤
MLPipelines、アルゴリズムの実装
Copyright (C) Takeshi Mikami. All rights reserved. 94
95. takemikamiʼs note ‒ http://takemikami.com/
分類(classification) 決定⽊による分類の例
Copyright (C) Takeshi Mikami. All rights reserved. 95
Spark MLlibでの機械学習
MLlibでの決定⽊を紹介します
ライブラリ読込
データ準備
ラベル・特徴量の
index付け
96. takemikamiʼs note ‒ http://takemikami.com/
分類(classification) 決定⽊による分類の例
Copyright (C) Takeshi Mikami. All rights reserved. 96
Spark MLlibでの機械学習
MLlibでの決定⽊を紹介します
学習
予測
97. takemikamiʼs note ‒ http://takemikami.com/
分類(classification) 決定⽊による分類の例
Copyright (C) Takeshi Mikami. All rights reserved. 97
Spark MLlibでの機械学習
MLlibでの決定⽊を紹介します
評価
98. takemikamiʼs note ‒ http://takemikami.com/
回帰(regression) 線形回帰による回帰の例
Copyright (C) Takeshi Mikami. All rights reserved. 98
Spark MLlibでの機械学習
MLlibでの線形回帰を紹介します
ライブラリ読込
データ準備
学習
99. takemikamiʼs note ‒ http://takemikami.com/
回帰(regression) 線形回帰による回帰の例
Copyright (C) Takeshi Mikami. All rights reserved. 99
Spark MLlibでの機械学習
MLlibでの線形回帰を紹介します
評価
100. takemikamiʼs note ‒ http://takemikami.com/
クラスタリング(clustering) k-meansの例
Copyright (C) Takeshi Mikami. All rights reserved. 100
Spark MLlibでの機械学習
MLlibでのk-meansを紹介します
ライブラリ読込
データ準備
学習
101. takemikamiʼs note ‒ http://takemikami.com/
クラスタリング(clustering) k-meansの例
Copyright (C) Takeshi Mikami. All rights reserved. 101
Spark MLlibでの機械学習
MLlibでのk-meansを紹介します
評価
102. takemikamiʼs note ‒ http://takemikami.com/
協調フィルタリング ALSの例
Copyright (C) Takeshi Mikami. All rights reserved. 102
Spark MLlibでの機械学習
MLlibでのALSを紹介します
ライブラリ読込
データ準備
学習
予測
103. takemikamiʼs note ‒ http://takemikami.com/
協調フィルタリング ALSの例
Copyright (C) Takeshi Mikami. All rights reserved. 103
Spark MLlibでの機械学習
MLlibでのALSを紹介します
評価
104. takemikamiʼs note ‒ http://takemikami.com/
ML Pipeline
ML Pipelines
• ML Pipelinesとは、複数のアルゴリズムを1つにまとめるMLlibの機能
• 例:
「PCAでの説明変数の次元削減」と「SVMでのクラス分類」をまとめる
Copyright (C) Takeshi Mikami. All rights reserved. 104
Spark MLlibでの機械学習の応⽤
SparkのMLPipelinesについて説明します
PCAによる
次元削減
SVMでの
クラス分類
105. takemikamiʼs note ‒ http://takemikami.com/
ML Pipelines
• ML Pipelineにまとめていないと、
教師/対象データへの両⽅に同じ処理を記載する必要がある
Copyright (C) Takeshi Mikami. All rights reserved. 105
Spark MLlibでの機械学習の応⽤
SparkのMLPipelinesについて説明します
x1 x2 … xn y
#1 1 3 … 1 2
#2 2 5 … 4 4
… … … … … …
#79 3 6 … 5 6
x1 x2 … xn y
#80 4 7 … 4 ?
… … … … … ?
#100 5 8 … 2 ?
予測モデル
x1 x2 … xn yʼ
#80 4 7 … 4 9
… … … … … …
#100 5 8 … 2 11
教師データ
対象データ
予測結果
PCAによる
次元削減
SVMでの
クラス分類
PCAによる
次元削減
SVMでの
クラス分類
両⽅に同じ処理を記載両⽅に同じ処理を記載 ※精度チューニングの過程で頻繁に変更する部分なので
⼿間に加えて、反映漏れのミスも発⽣しやすい
106. takemikamiʼs note ‒ http://takemikami.com/
ML Pipelines
• ML Pipelineにまとめておくと、
教師/対象データに対して確実に同じ処理を実施できる
Copyright (C) Takeshi Mikami. All rights reserved. 106
Spark MLlibでの機械学習の応⽤
SparkのMLPipelinesについて説明します
x1 x2 … xn y
#1 1 3 … 1 2
#2 2 5 … 4 4
… … … … … …
#79 3 6 … 5 6
x1 x2 … xn y
#80 4 7 … 4 ?
… … … … … ?
#100 5 8 … 2 ?
予測モデル
x1 x2 … xn yʼ
#80 4 7 … 4 9
… … … … … …
#100 5 8 … 2 11
教師データ
対象データ
予測結果
ML Pipeline
PCAによる
次元削減
SVMでの
クラス分類
ML Pipeline
PCAによる
次元削減
SVMでの
クラス分類Pipeline化して置くと
確実に両⽅で同じ処理を実施
Pipeline化して置くと
確実に両⽅で同じ処理を実施
107. takemikamiʼs note ‒ http://takemikami.com/
アルゴリズムの実装
• 独⾃アルゴリズムを実装する場合はEstimaterとModelを実装する
Copyright (C) Takeshi Mikami. All rights reserved. 107
Spark MLlibでの機械学習の応⽤
SparkMLlibに独⾃のアルゴリズムを実装する⽅法を説明します
x1 x2 … xn y
#1 1 3 … 1 2
#2 2 5 … 4 4
… … … … … …
#79 3 6 … 5 6
x1 x2 … xn y
#80 4 7 … 4 ?
… … … … … ?
#100 5 8 … 2 ?
x1 x2 … xn yʼ
#80 4 7 … 4 9
… … … … … …
#100 5 8 … 2 11
教師データ
対象データ
予測結果
Estimator
(fit)
Model
(transform)
IN: DataFrame
OUT: Model
IN: DataFrame OUT: DataFrame
108. takemikamiʼs note ‒ http://takemikami.com/
アルゴリズムの実装 Estimatorの実装
• Estimatorのfitに学習のロジックを実装します
Copyright (C) Takeshi Mikami. All rights reserved. 108
Spark MLlibでの機械学習の応⽤
SparkMLlibに独⾃のアルゴリズムを実装する⽅法を説明します
class MyAlgorithm (override val uid: String)
extends Estimator[MyAlgorithmModel] {
override def fit(dataset: Dataset[_]): MyAlgorithmModel = {
....
val model = new MyAlgorithmModel(....)
copyValues(model)
}
override def copy(extra: ParamMap):MyAlgorithm = defaultCopy(extra)
override def transformSchema(schema: StructType): StructType = {
....
}
}
学習のロジックを実装
IN: DataFrame
OUT: Model
109. takemikamiʼs note ‒ http://takemikami.com/
アルゴリズムの実装 Modelの実装
• Modelに予測のロジックを実装します
Copyright (C) Takeshi Mikami. All rights reserved. 109
Spark MLlibでの機械学習の応⽤
SparkMLlibに独⾃のアルゴリズムを実装する⽅法を説明します
class MyAlgorithmModel (override val uid: String, ...)
extends Model[MyAlgorithmModel] {
override def transform(dataset: Dataset[_]): DataFrame = {
....
}
override def copy(extra: ParamMap): MyAlgorithmModel = {
val copied = new MyAlgorithmModel(uid, ...)
copyValues(copied, extra).setParent(parent)
}
override def transformSchema(schema: StructType): StructType = {
....
StructType(schema.fields :+ StructField($(predictionCol), FloatType, false))
}
}
学習のロジックを実装
IN: DataFrame
OUT: DataFrame
DataFrameに追加される
カラムの情報
(通常は予測値のカラム)
110. takemikamiʼs note ‒ http://takemikami.com/
参考⽂献リスト
• 下⽥倫⼤、諸岡⼀成、今井雄太、⽯川有、⽥中裕⼀、⼩宮篤史、加嵜⻑
⾨「詳解 Apache Spark」技術評論社 2016
• 丸⼭宏、神⾕直樹、⼭⽥敦「データサイエンティスト・ハンドブック」
近代科学社 2015
• 福島真太朗「UsefulR② データ分析プロセス」共⽴出版 2015
• 末吉正成・⾥洋平・坂巻隆治・⼩林雄⼀郎・⼤城信晃「Rではじめるビ
ジネス統計分析」翔泳社 2014
• 稲垣宣⽣・⼭根芳知・吉⽥光雄「統計学⼊⾨」裳華房 1992
Copyright (C) Takeshi Mikami. All rights reserved. 110
付録
本資料作成にあたって参考にした⽂献リストです
111. takemikamiʼs note ‒ http://takemikami.com/
参考Webサイトリスト
• 有賀康顕「⼤規模データに対するデータサイエンスの進め⽅」
https://www.slideshare.net/Cloudera_jp/data-science-toward-big-
data-cwt2016
• ⼟橋昌「Apache Spark の紹介(前半:Sparkのキホン)」
https://www.slideshare.net/hadoopxnttdata/apache-spark-spark
Copyright (C) Takeshi Mikami. All rights reserved. 111
付録
本資料作成にあたって参考にしたWebサイトリストです