68
有限会社 来栖川電算 山口 陽平 EMR #ACE つぶやくときはハッシュタグを忘れずに!

JAWSDAYS 2014 ACEに聞け! EMR編

Embed Size (px)

DESCRIPTION

JAWSDAYS 2014 で発表に使ったスライドです。 EMR や Mahout を使ったことがない初心者向けの内容になっています。とっかかりがなくて、困っている人にはちょうど良いと思います。 パッチ画像を K-Means でクラスタリングするという内容ですので視覚的に面白い結果がでます。画像処理の入門としてもよいかもしれません。 スライドの中で使っているプログラムのソースコードとデータは下記の URL にあります。  http://kurusugawa.jp/2014/03/18/jawsdays2014/

Citation preview

Page 1: JAWSDAYS 2014 ACEに聞け! EMR編

有限会社 来栖川電算 山口 陽平

EMR

#ACE つぶやくときはハッシュタグを忘れずに!

Page 2: JAWSDAYS 2014 ACEに聞け! EMR編

ゕンケート 知ってる? 興味ある? 使ってる?

ロゴのセンス

Page 3: JAWSDAYS 2014 ACEに聞け! EMR編

今日の話は Hadoop や Mahout を試したいプログラマ向け

• 自己紹介 & 会社紹介

• Mahout on EMR を試す手順 – Mahout プログラムを書いて EMR で実行

• 初心者が知っておくとよいこと – よくはまる罠・チューニングの考え方

• 話さないこと – Hadoop や Mahout の詳しい使い方

– Hbase・Hive・Pig on EMR とか • さんざん紹介されているのでそっちを見てね!

Page 4: JAWSDAYS 2014 ACEに聞け! EMR編

自己紹介 & 会社紹介 要するに技術力で開拓するタプ

Page 5: JAWSDAYS 2014 ACEに聞け! EMR編

• 必要なら何でも徹底的にやる研究者

– プログラミング言語・データベース分散

– ゕルゴリズム・機械学習・CV・自然言語

– 名古屋工業大学出身・未踏ソフトウェゕ経験

– 世界を美しく記述することを夢見る35歳

• 人を驚かせるのが好き

– ハードリゕルタイムJavaVM

– 1000台越え構成のペタバイト分散DB

– 秒間1000万クエリ処理できるKVS

– 超多クラス対応の超高速物体認識エンジン

山 口 陽 平 @melleo1978

※あくまでもメージです。 実物に髪の毛はありません。

Page 6: JAWSDAYS 2014 ACEに聞け! EMR編

• 概要:11年目 – 名古屋工業大学発ベンチャー(2003年)

• 目的:ロボの頭脳を作る – 知的インターフェイスによる社会の変革

– ソフトウェゕの品質・生産性の向上

• スタッフ:28人 – 役員3人〃正社員11人〃見習い8人

– データ作成5人〃家政婦1人

– IPA未踏ソフトウェゕ経験者多数

• 社風:難しことを楽しく – 職人〃挑戦〃自由〃昼食・夕食・飲み会は無料

来栖川電算 http://kurusugawa.jp/

弊社が目指すロボ ※写真はあくまでもメージです。

Page 7: JAWSDAYS 2014 ACEに聞け! EMR編

来栖川電算 認識技術 や 大規模なデータの分析 をやる会社

• 認識技術

– 情景画像文字認識

– 物体認識

– モーション認識・行動認識

• データ分析

– 対象:映像〃各種センサ〃サービスログ

– 規模:ペタバイト級

• 日々やってること

– ゕルゴリズム・機械学習・特徴量の研究と応用

Page 8: JAWSDAYS 2014 ACEに聞け! EMR編

AWS 活用事例 大学病院向けデータマニング環境

• Hadoopによる冗長化で高ゕベラビリテゖ • Pig+UDFにより手軽で自由な分析をサポート

Page 9: JAWSDAYS 2014 ACEに聞け! EMR編

AWS 活用事例 広告企業向けデータマニング環境

• 最新手法でビッグデータを分析し、ニーズ・施策の発掘 • 分析期間・分析対象は何十倍にも増える予定

Page 10: JAWSDAYS 2014 ACEに聞け! EMR編

AWS 活用事例 組込企業向けデータマニング環境

• 様々なゕルゴリズムが並列計算に対応し始めている。 • スポットでしか分析しないなら AWS は非常に安い。

Page 11: JAWSDAYS 2014 ACEに聞け! EMR編

AWS 活用事例 EC サト用データマニング環境

• Hadoopによる冗長化で高ゕベラビリテゖ • Pig・hBase・MapReduceによるリゕルタム集計

Page 12: JAWSDAYS 2014 ACEに聞け! EMR編

AWS 活用事例 オンラン機械学習フレームワーク試験環境

• 深夜に緩和申請して、寝て起きたら使えるようになってた。中の人の対応がはやい!

Page 13: JAWSDAYS 2014 ACEに聞け! EMR編

AWS 活用事例 物体認識サービス 1000sors.com

• SWSとCloudFormationを組み合わせれば、物体認識サービスに必要なンスタンス群を簡単に制御可能

Page 14: JAWSDAYS 2014 ACEに聞け! EMR編

AWS 活用事例 物体認識サービスのための機械学習環境

• S3上に構築した分散フゔルシステムに全てを格納 – 画像・教師・設定・スクリプト・辞書・レポート・ログ – バッチ的なシステムのためのフゔイルシステムはすぐ作れる

Page 15: JAWSDAYS 2014 ACEに聞け! EMR編

AWS 活用事例 情景画像文字認識のための機械学習環境

• 文字認識のための大規模機械学習 – 30タスク(8段) 4~5日/回(普通のcore i7マシン) – cc2.8xlargeのSPOTで節約(時間:1/4〃費用:1/2)

• ※1時間以内にセーブポイントまで進める工夫が必要

Page 16: JAWSDAYS 2014 ACEに聞け! EMR編

AWS 活用事例集 “すっごく” 便利なのでいっぱい使ってます!

毎月、猛烈に増えているよ!

詳細は過去のスライドを見てね!

Page 17: JAWSDAYS 2014 ACEに聞け! EMR編

EMR ざっくり把握しよう

Page 18: JAWSDAYS 2014 ACEに聞け! EMR編

EMR すぐに使える hadoop

• 大規模データの蓄積・バッチ分析が得意

– 非構造化データの処理:検索インデック作成

• Java で分散処理(MapReduce)が簡単に書ける

– 構造化データの処理:ログ集計

• Hive・HBase・Pig を使えば SQL ぽく書ける

← コレ

Page 19: JAWSDAYS 2014 ACEに聞け! EMR編

EMR 単なる hadoop との違い

• 追加機能 – 分散フゔイルシステムとして S3 も選べる

– AWS 環境に合わせてチューニングされてる

• 選ぶだけでンストールできる機能 – 構造化データの処理:Hive〃Hbase〃Pig

– 監視:Ganglia

• クラスタの管理 – 起動:ノード数を入力するだけ

– 監視・操作:Web・CLI・SDK

Page 20: JAWSDAYS 2014 ACEに聞け! EMR編

EMR 料金 … よく考えると安い!

• EC2 料金 + EMR 料金(1時間単位) – EMR 料金:EC2 料金(オンデマンド)× 1/4 ~ 1/7

– リザーブドやスポットで節約可能

• 例:cc2.8xlarge … 2.9$/時間 – 買うと 30 万円 ⇒ 1000 時間

– 4 台時間/実験 ⇒ 250 実験

– 普段はローカルの小さなデータで実験。たまに大きなデータで実験するときだけなら安い

– スポット使えば 20% くらいは節約できそう

Page 21: JAWSDAYS 2014 ACEに聞け! EMR編

MAHOUT ざっくり把握しよう

Page 22: JAWSDAYS 2014 ACEに聞け! EMR編

Mahout Hadoop 用の機械学習ラブラリ

• 機械学習ゕルゴリズムがいっぱい – 数十種類:分類〃回帰〃クラスタリング〃…

– 最新版:0.9(EMR で使えるのは 0.8)

• スケーラブルな実装 – R では手におえないデータ量でも OK

– 速くはないが、台数でゴリ押し

• そこそこ手軽(R よりちょっと面倒) – 入出力:HDFS 上のシーケンスフゔイル

– 実行:CLI を使えばプログラムレス

Page 23: JAWSDAYS 2014 ACEに聞け! EMR編

Mahout いろんなゕルゴリズムが実装されている

• 1.0 になるともっと充実!

Collaborative Filtering

User-Based Collaborative Filtering

Item-Based Collaborative Filtering

Matrix Factorization with Alternating Least Squares

Matrix Factorization with Alternating Least Squares on Implicit Feedback

Weighted Matrix Factorization, SVD++, Parallel SGD

Classification

Logistic Regression

Naive Bayes / Complementary Naive Bayes

Random Forest

Hidden Markov Models

Multilayer Perceptron

Clustering

Canopy Clustering

k-Means Clustering

Fuzzy k-Means

Streaming k-Means

Spectral Clustering

Dimensionality Reduction

Singular Value Decomposition

Lanczos Algorithm

Stochastic SVD

Principal Component Analysis

Topic Models

Latent Dirichlet Allocation

Miscellaneous

Frequent Pattern Mining

RowSimilarityJob

ConcatMatrices

Collocations

Page 24: JAWSDAYS 2014 ACEに聞け! EMR編

パッチ画像をクラスタリング の前準備

EMR 上で Mahout の K-Means を使って

Page 25: JAWSDAYS 2014 ACEに聞け! EMR編

クラスタリング クラスタ(似ているデータの集団)を求めること

• ゕルゴリズムと「似ている」の基準が変われば、求まるクラスタが全く異なる

• 求まったクラスタを指し示す言葉がない場合が多い(解釈が難しいことがある)

Page 26: JAWSDAYS 2014 ACEに聞け! EMR編

クラスタの使い方 クラスタを使ってデータを再表現

• データの再表現

– ラベル化

• 所属するクラスタ番号

– 所属度ベクトル化

• (クラスタ1の所属度〃…〃クラスタnの所属度)

– 容量・処理時間を節約できる

– 線形識別器で分離し易くなる

• データへのラベル付与

– ラベルで検索できる(ノイズ除去に使える)

Page 27: JAWSDAYS 2014 ACEに聞け! EMR編

これから行う実験 角や境界付近のパッチ画像をクラスタリング

• 角や境界付近の多様性が分かるといいな

– 本の表紙画像:2094 枚

• 2011 年 4 月出版 @ amazon.co.jp

– 1枚から抽出するパッチ:最大 512 個

Page 28: JAWSDAYS 2014 ACEに聞け! EMR編

用意したデータ パッチ画像が入ったバナリフゔル(約1GB)

• バナリフゔルの作り方

– グレースケール画像からキーポイント(位置・方向・大きさ)を検出

– そこからN×N へ正規化した画像を抽出

– 抽出した画像の輝度値(N2個)をバイナリフゔイルへ追記

Page 29: JAWSDAYS 2014 ACEに聞け! EMR編

パッチ画像をクラスタリング EMR 上で Mahout の K-Means を使って

Page 30: JAWSDAYS 2014 ACEに聞け! EMR編

EMR の実行メージ 必要なものを S3 に配置して実行

• EMR はステップ単位(jar)で実行

Page 31: JAWSDAYS 2014 ACEに聞け! EMR編

大雑把な手順 Mahout の入出力形式に合わせて関数呼出

• Mahout プログラムを作成

– pom フゔイルを作成

– main プログラムを作成

• バイナリフゔイルから入力形式へ変換

• K-Means でクラスタリング

• 出力形式からバイナリフゔイルへ変換

• ローカル(疑似分散環境)で実行

• EMR で実行(WebUI)

Page 32: JAWSDAYS 2014 ACEに聞け! EMR編

MAHOUT プログラムを作成 パッチ画像をクラスタリングするために

Page 33: JAWSDAYS 2014 ACEに聞け! EMR編

入力形式 2種類のシーケンスフゔル(分割OK)

• K-Means に渡すパスは親階層

ベクトルデータ(今回はバイナリファイルを素朴に変換)

パス target/input/patches/part-XXXXX

形式 {Key:Long, Value:Vector<Double>}

意味 {Key:ベクトル番号, Value:クラスタリング対象ベクトル}

クラスタデータ(今回はベクトルデータの先頭 K 個)

パス target/input/clusters/part-XXXXX

形式 {Key:Text, Value:Kluster}

意味 {Key:クラスタ名, Value:クラスタ番号と初期のクラスタ中心}

Page 34: JAWSDAYS 2014 ACEに聞け! EMR編

出力形式 2種類のシーケンスフゔル(分割OK)

• K-Means に渡すパスは親階層

クラスタデータ

初期パス target/output/clusters-0/part-XXXXX

中間パス target/output/clusters-X/part-r-XXXXX

最終パス target/output/clusters-X-final/part-r-XXXXX

形式 {Key:Int, Value:Cluster}

意味 {Key:クラスタ番号, Value:クラスタの中心と半径}

ベクトルデータの分類結果

パス target/output/clusteredPoints/part-m-XXXXX

形式 {Key:Int, Value:WeightedVector<Double>}

意味 {Key:クラスタ番号, Value:クラスタリング対象ベクトル}

Page 35: JAWSDAYS 2014 ACEに聞け! EMR編

pom フゔル Eclipse で Maven プロジェクトを作成

• Mahout 0.8 への依存関係を追加

• 依存先を jar に含める設定を追加

– これから作る main クラスの完全修飾名 <dependencies> <dependency><groupId>org.apache.mahout</groupId><artifactId>mahout-core</artifactId><version>0.8</version></dependency> <dependency><groupId>org.apache.mahout</groupId><artifactId>mahout-math</artifactId><version>0.8</version></dependency> <dependency><groupId>org.apache.mahout</groupId><artifactId>mahout-examples</artifactId><version>0.8</version></dependency> </dependencies> <build><plugins><plugin> <artifactId>maven-assembly-plugin</artifactId> <configuration> <descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs> <archive><manifest><mainClass>jp.kurusugawa.pacth_clustering</mainClass></manifest></archive> </configuration> <executions><execution> <id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals> </execution></executions> </plugin></plugins></build>

Page 36: JAWSDAYS 2014 ACEに聞け! EMR編

main プログラム ベクトルデータを書き込む

• LongWritableとVectorWritableを使う private static void downloadPatches(Configuration aConfiguration, Path aWorkingInputPatchesPath, Path aPatchesPath, int aColumnCount) throws IOException { SequenceFile.Writer tOutput = openSequenceFileWriter(aConfiguration, aWorkingInputPatchesPath, LongWritable.class, VectorWritable.class); try { LongWritable tRowIndexWritable = new LongWritable(); VectorWritable tRowWritable = new VectorWritable(); DataInputStream tInput = openDataInputStream(aConfiguration, aPatchesPath); try { long tRowCount = getFileLength(aConfiguration, aPatchesPath) / aColumnCount; for (long tRowIndex = 0L; tRowIndex < tRowCount; tRowIndex++) { Vector tRow = new RandomAccessSparseVector(aColumnCount); for (int tColumnIndex = 0; tColumnIndex < aColumnCount; tColumnIndex++) tRow.setQuick(tColumnIndex, tInput.readUnsignedByte()); tRowIndexWritable.set(tRowIndex); tRowWritable.set(tRow); tOutput.append(tRowIndexWritable, tRowWritable); } } finally { IOUtils.closeQuietly(tInput); } } finally { IOUtils.closeQuietly(tOutput); } }

Page 37: JAWSDAYS 2014 ACEに聞け! EMR編

main プログラム クラスタデータを書き込む

• TextとKlusterを使う

• 「似ている」の基準:マンハッタン距離 private static void downloadClusters(Configuration aConfiguration, Path aWorkingInputClustersPath, Path aPatchesPath, int aColumnCount, int aClusterCount) throws IOException { SequenceFile.Writer tOutput = openSequenceFileWriter(aConfiguration, aWorkingInputClustersPath, Text.class, Kluster.class); try { DataInputStream tInput = openDataInputStream(aConfiguration, aPatchesPath); try { int tClusterCount = (int) Math.min(aClusterCount, getFileLength(aConfiguration, aPatchesPath) / aColumnCount); for (int tClusterIndex = 0; tClusterIndex < tClusterCount; tClusterIndex++) { Vector tCenter = new RandomAccessSparseVector(aColumnCount); for (int tColumnIndex = 0; tColumnIndex < aColumnCount; tColumnIndex++) tCenter.setQuick(tColumnIndex, tInput.readUnsignedByte()); Kluster tCluster = new Kluster(tCenter, tClusterIndex, new ManhattanDistanceMeasure()); tOutput.append(new Text(tCluster.getIdentifier()), tCluster); } } finally { IOUtils.closeQuietly(tInput); } } finally { IOUtils.closeQuietly(tOutput); } }

Page 38: JAWSDAYS 2014 ACEに聞け! EMR編

main プログラム K-Means でクラスタリング

• 出力先を削除する(やらないとこける)

• 入力元と出力先のパスを指定し実行する private static void run(Path aPatchesPath, Path aClustersPath, Path aWorkingInputPatchesPath, Path aWorkingInputClustersPath, Path aWorkingOutputPath, int aColumnCount, int aClusterCount) throws IOException, InterruptedException, ClassNotFoundException { Configuration tConfiguration = new Configuration(); System.out.println("download patches"); HadoopUtil.delete(tConfiguration, aWorkingInputPatchesPath); downloadPatches(tConfiguration, new Path(aWorkingInputPatchesPath, "part-00000"), aPatchesPath, aColumnCount); System.out.println("download clusters"); HadoopUtil.delete(tConfiguration, aWorkingInputClustersPath); downloadClusters(tConfiguration, new Path(aWorkingInputClustersPath, "part-00000"), aPatchesPath, aColumnCount, aClusterCount); System.out.println("clustering"); HadoopUtil.delete(tConfiguration, aWorkingOutputPath); KMeansDriver.run(tConfiguration, aWorkingInputPatchesPath, aWorkingInputClustersPath, aWorkingOutputPath, new ManhattanDistanceMeasure(), 0.001D, 10, true, 0D, false); System.out.println("upload clusters"); uploadClusters(tConfiguration, getWorkingOutputClustersPaths(tConfiguration, aWorkingOutputPath), aClustersPath, aColumnCount); }

Page 39: JAWSDAYS 2014 ACEに聞け! EMR編

main プログラム 出来上がったクラスタデータを読み込む

• IntWritable・ClusterWritableを使う private static void uploadClusters(Configuration aConfiguration, Path[] aWorkingOutputClustersPaths, Path aClustersPath, int aColumnCount) throws IOException { DataOutputStream tOutput = openDataOutputStream(aConfiguration, aClustersPath); try { for (Path tClustersPath : aWorkingOutputClustersPaths) { SequenceFile.Reader tReader = openSequenceFileReader(aConfiguration, tClustersPath); try { IntWritable tClusterIndex = new IntWritable(); ClusterWritable tClusterWritable = new ClusterWritable(); while (tReader.next(tClusterIndex, tClusterWritable)) { Vector tCenter = tClusterWritable.getValue().getCenter(); for (int tColumnIndex = 0; tColumnIndex < aColumnCount; tColumnIndex++) { long tValue = Math.round(tCenter.getQuick(tColumnIndex)); tOutput.write(tValue < 0L ? 0 : tValue > 255L ? 255 : (int) tValue); } } } finally { IOUtils.closeQuietly(tReader); } } } finally { IOUtils.closeQuietly(tOutput); } }

Page 40: JAWSDAYS 2014 ACEに聞け! EMR編

main プログラム フゔルシステムにゕクセスするユーテゖリテゖ

• パスからフゔルシステムを決定しないと EMR で実行したときにこける

– hdfs://、s3://、s3n:// が混在するから

private static FileSystem getFileSystem(Configuration aConfiguration, Path aPath) throws IOException { return FileSystem.get(aPath.toUri(), aConfiguration); } private static FileStatus[] getFileStatuses(Configuration aConfiguration, Path aPath, PathFilter aPathFilter) throws IOException { return getFileSystem(aConfiguration, aPath).listStatus(aPath, aPathFilter); } private static long getFileLength(Configuration aConfiguration, Path aPath) throws IOException { return getFileSystem(aConfiguration, aPath).getContentSummary(aPath).getLength(); } private static DataInputStream openDataInputStream(Configuration aConfiguration, Path aPath) throws IOException { return getFileSystem(aConfiguration, aPath).open(aPath); } private static DataOutputStream openDataOutputStream(Configuration aConfiguration, Path aPath) throws IOException { return getFileSystem(aConfiguration, aPath).create(aPath); } private static SequenceFile.Reader openSequenceFileReader(Configuration aConfiguration, Path aPath) throws IOException { return new SequenceFile.Reader(getFileSystem(aConfiguration, aPath), aPath, aConfiguration); } private static SequenceFile.Writer openSequenceFileWriter(Configuration aConfiguration, Path aPath, Class<?> aKeyClass, Class<?> aValueClass) throws IOException { return new SequenceFile.Writer(getFileSystem(aConfiguration, aPath), aConfiguration, aPath, aKeyClass, aValueClass); }

Page 41: JAWSDAYS 2014 ACEに聞け! EMR編

ローカルで実行 パッチ画像をクラスタリングするために

Page 42: JAWSDAYS 2014 ACEに聞け! EMR編

ローカルで実行 EMR で実行する前にローカルで動くようにする

• まずは小さなデータで試す

• 成功すると右みたいな感じ

– たくさんログがでる

– たくさんフゔイルができる

– シーケンスフゔイルを開くとデータ型が分かる

• バージョン違いでデータ型が変わったのに気付ける

Page 43: JAWSDAYS 2014 ACEに聞け! EMR編

main プログラム EMR で実行する前にパスを指定できるように変更

• 両環境で実行できるプログラム

– 中間データのパスも指定できると便利 public static void main(String[] aArguments) throws IOException, InterruptedException, ClassNotFoundException { Path tPatchesPath = new Path("src/test/resources/patches/patches.bin"); Path tClustersPath = new Path("src/test/resources/patches/clusters.bin"); Path tWorkingInputPatchesPath = new Path("target/input/patches"); Path tWorkingInputClustersPath = new Path("target/input/clusters"); Path tWorkingOutputPath = new Path("target/output"); int tColumnCount = 31 * 31; int tClusterCount = 256; if (aArguments.length > 0) { tPatchesPath = new Path(aArguments[0]); tClustersPath = new Path(aArguments[1]); tWorkingInputPatchesPath = new Path(aArguments[2]); tWorkingInputClustersPath = new Path(aArguments[3]); tWorkingOutputPath = new Path(aArguments[4]); tColumnCount = Integer.parseInt(aArguments[5]); tClusterCount = Integer.parseInt(aArguments[6]); } run(tPatchesPath, tClustersPath, tWorkingInputPatchesPath, tWorkingInputClustersPath, tWorkingOutputPath, tColumnCount, tClusterCount); }

Page 44: JAWSDAYS 2014 ACEに聞け! EMR編

EMRで実行 パッチ画像をクラスタリングするために

Page 45: JAWSDAYS 2014 ACEに聞け! EMR編

EMR で実行 必要なものを S3 に配置しよう!

• Management Console でパスを指定

Page 46: JAWSDAYS 2014 ACEに聞け! EMR編

EMR で実行 すぐに起動できて、そこそこ監視しやすい

• S3バケットを作成 – main プログラムが入った jar を配置する

– それが処理するデータを配置する

• クラスタを起動 – ログの出力先とインスタンス数を決める

– ステップ(jar と引数)を追加する

• クラスタを監視 – 各種指標から想定通りの進行かを確認する

• S3バケットから出力をダウンロード

Page 47: JAWSDAYS 2014 ACEに聞け! EMR編

クラスタを起動 EMR Management Console

• Create cluster ⇒ 各種設定

– ログ出力先

– インスタンス

– ステップ

Page 48: JAWSDAYS 2014 ACEに聞け! EMR編

クラスタを起動 EMR Management Console

• Cluster Configuration

– クラスタ名とログ出力先を設定する

• ログ出力先:s3n://バケット名/パス/

• Software Configuration

– Hadoop のバージョンを設定する

• Mahout 0.8 を使うには Hadoop 1.0.3

– 追加インストールするものを選ぶ

• 使わないなら消しておく。

Page 49: JAWSDAYS 2014 ACEに聞け! EMR編

クラスタを起動 EMR Management Console

• Hardware Configuration – インスタンスタイプと数を設定する

• マスター(main プログラムが動くノード):1個

• コゕ(タスクも処理するデータノード):0個~

• タスク(タスクを処理するノード):0個~

– 1台構成(マスターのみ)

– 複数台構成(マスターと他のノード) • マスターはタスクを処理しないのでしょぼくていい

• 1時間弱で終わるように選ぶと安い

• 1時間以上かかる場合に Spot を選ぶと危険な場合も

• EMR は計算用として使うのがおすすめ

Page 50: JAWSDAYS 2014 ACEに聞け! EMR編

クラスタを起動 EMR Management Console

• Steps

– Custom JAR を選んでパスと引数を設定する

• 中間データもすべて引数で設定できると便利

• 中間データのパスを S3 にしておくと便利

• デバッグ中は終了しないとすると便利

s3n://jawsdays2014/data/book_patches.bin s3n://jawsdays2014/data/book_clusters.bin hdfs:///input/book_patches hdfs:///input/book_clusters hdfs:///output 961 256

s3n://jawsdays2014/executables/patch_clustering-0.0.1-SNAPSHOT-jar-with-dependencies.jar

Page 51: JAWSDAYS 2014 ACEに聞け! EMR編

クラスタを起動 EMR Management Console

• 設定完了 ⇒ Create cluster

Page 52: JAWSDAYS 2014 ACEに聞け! EMR編

クラスタを監視 EMR Management Console

• Cluster List からクラスタを選択

Page 53: JAWSDAYS 2014 ACEに聞け! EMR編

クラスタを監視 EMR Management Console

• Cluster – クラスタの設定を確認できる

• Summary〃Configuration Details〃Security/Network〃Hardware

• Monitoring ← ボトルネックが分かる

– クラスタの負荷を様々な観点で確認できる • Cluster Status〃Map/Reduce〃Node Status〃IO

• Steps ← 失敗した処理が分かる

– ステップの進捗を様々な粒度で確認できる • Step〃Job〃Task

Page 54: JAWSDAYS 2014 ACEに聞け! EMR編

クラスタを監視 EMR Management Console

• Monitoring > Cluster Status

– クラスタが処理しているジョブの量が分かる

• 失敗したジョブがあるか?

Page 55: JAWSDAYS 2014 ACEに聞け! EMR編

クラスタを監視 EMR Management Console

• Monitoring > Map/Reduce

– クラスタが処理しているタスクの量が分かる

• Map/Reduce数は想定通りか?

• スロットは足りているか?

Page 56: JAWSDAYS 2014 ACEに聞け! EMR編

クラスタを監視 EMR Management Console

• Monitoring > Node Status

– ノードの稼働状況が分かる

• ノードが死んでないか?

Page 57: JAWSDAYS 2014 ACEに聞け! EMR編

クラスタを監視 EMR Management Console

• Monitoring > IO

– S3とHDFSにかかる負荷が分かる

• IOの量は想定通りか?IOがボトルネックか?

Page 58: JAWSDAYS 2014 ACEに聞け! EMR編

クラスタを監視 EMR Management Console

• Steps

– ステップの進捗が分かる

• 追加したステップ(main プログラム)の進捗が分かる。追加もできる。

– ステップのログが分かる

• main プログラムのログが stderr・stdout に出る

Page 59: JAWSDAYS 2014 ACEに聞け! EMR編

EMR で実行 EMR Management Console

• Steps > All Jobs > Tasks

– ジョブとステップのログが分かる。

• ステップ(main プログラム)から起動されたジョブ、それを構成するタスクが分かる。

Page 60: JAWSDAYS 2014 ACEに聞け! EMR編

クラスタを監視 EC2 Management Console

• Monitoring

– 各インスタンスのCPU・IOの負荷が分かる

• EC2 レベルで見るのもよい

Page 61: JAWSDAYS 2014 ACEに聞け! EMR編

結果を見てみよう パッチ画像をクラスタリング

Page 62: JAWSDAYS 2014 ACEに聞け! EMR編

実験結果 角や境界を表しているクラスタが得られた

• 中心に穴

– 少しずれることも

• 境界の形

– │・┌・├・┼

– =・#・○

• 輝度勾配の強弱

– 質感・照明

• ⇒ 結構面白い!

Page 63: JAWSDAYS 2014 ACEに聞け! EMR編

チューニング 基本に忠実にやれば OK

Page 64: JAWSDAYS 2014 ACEに聞け! EMR編

チューニング 今回の main プログラムのダメなところ

• S3 ⇔ HDFS – マスターだけで動くので

• スケールしない

• マスターが変換中にスレーブが遊んでる

– スケールさせるには • Mapper として実装

• 入力フゔイルを事前に分割 or 分割可能に

• Mahout 用入力が無駄にでかい – Byteがdoubleになっちゃう ⇒ 圧縮で解決

– K-Means 簡単だし、自分で実装してもいいよね

Page 65: JAWSDAYS 2014 ACEに聞け! EMR編

チューニング データが増えてきたら

• データが増えてきたら

– 基本的にノードを増やせばいい

– ほとんどそれでうまくいく

• ちゃんと見積もって監視しよう

– 各ノードはどのくらい資源を使い切ってる?

– Mapper と Reducer の数は想定通り?

– CPU と IOどっちがボトルネック?

Page 66: JAWSDAYS 2014 ACEに聞け! EMR編

まとめ

Page 67: JAWSDAYS 2014 ACEに聞け! EMR編

まとめ こわがらずに試してみよう

• Hadoop クラスタの起動が楽

– 計算時のみ起動する使い方がお勧め

• Hadoop クラスタの監視も楽

– Management Consoleだけでも結構分かる

• Mahout もそんなに難しくない

– 数十行で程度で試せる

– 単なる集計ではできないことができる

– 機械学習やると Hadoop 使ってる感じがする

Page 68: JAWSDAYS 2014 ACEに聞け! EMR編

おしまい ご清聴ありがとうございました

面白いと思ったら投票してね!