Upload
youhei-yamaguchi
View
1.382
Download
4
Embed Size (px)
DESCRIPTION
JAWSDAYS 2014 で発表に使ったスライドです。 EMR や Mahout を使ったことがない初心者向けの内容になっています。とっかかりがなくて、困っている人にはちょうど良いと思います。 パッチ画像を K-Means でクラスタリングするという内容ですので視覚的に面白い結果がでます。画像処理の入門としてもよいかもしれません。 スライドの中で使っているプログラムのソースコードとデータは下記の URL にあります。 http://kurusugawa.jp/2014/03/18/jawsdays2014/
Citation preview
有限会社 来栖川電算 山口 陽平
EMR
#ACE つぶやくときはハッシュタグを忘れずに!
ゕンケート 知ってる? 興味ある? 使ってる?
ロゴのセンス
今日の話は Hadoop や Mahout を試したいプログラマ向け
• 自己紹介 & 会社紹介
• Mahout on EMR を試す手順 – Mahout プログラムを書いて EMR で実行
• 初心者が知っておくとよいこと – よくはまる罠・チューニングの考え方
• 話さないこと – Hadoop や Mahout の詳しい使い方
– Hbase・Hive・Pig on EMR とか • さんざん紹介されているのでそっちを見てね!
自己紹介 & 会社紹介 要するに技術力で開拓するタプ
• 必要なら何でも徹底的にやる研究者
– プログラミング言語・データベース分散
– ゕルゴリズム・機械学習・CV・自然言語
– 名古屋工業大学出身・未踏ソフトウェゕ経験
– 世界を美しく記述することを夢見る35歳
• 人を驚かせるのが好き
– ハードリゕルタイムJavaVM
– 1000台越え構成のペタバイト分散DB
– 秒間1000万クエリ処理できるKVS
– 超多クラス対応の超高速物体認識エンジン
山 口 陽 平 @melleo1978
※あくまでもメージです。 実物に髪の毛はありません。
• 概要:11年目 – 名古屋工業大学発ベンチャー(2003年)
• 目的:ロボの頭脳を作る – 知的インターフェイスによる社会の変革
– ソフトウェゕの品質・生産性の向上
• スタッフ:28人 – 役員3人〃正社員11人〃見習い8人
– データ作成5人〃家政婦1人
– IPA未踏ソフトウェゕ経験者多数
• 社風:難しことを楽しく – 職人〃挑戦〃自由〃昼食・夕食・飲み会は無料
来栖川電算 http://kurusugawa.jp/
弊社が目指すロボ ※写真はあくまでもメージです。
来栖川電算 認識技術 や 大規模なデータの分析 をやる会社
• 認識技術
– 情景画像文字認識
– 物体認識
– モーション認識・行動認識
• データ分析
– 対象:映像〃各種センサ〃サービスログ
– 規模:ペタバイト級
• 日々やってること
– ゕルゴリズム・機械学習・特徴量の研究と応用
AWS 活用事例 大学病院向けデータマニング環境
• Hadoopによる冗長化で高ゕベラビリテゖ • Pig+UDFにより手軽で自由な分析をサポート
AWS 活用事例 広告企業向けデータマニング環境
• 最新手法でビッグデータを分析し、ニーズ・施策の発掘 • 分析期間・分析対象は何十倍にも増える予定
AWS 活用事例 組込企業向けデータマニング環境
• 様々なゕルゴリズムが並列計算に対応し始めている。 • スポットでしか分析しないなら AWS は非常に安い。
AWS 活用事例 EC サト用データマニング環境
• Hadoopによる冗長化で高ゕベラビリテゖ • Pig・hBase・MapReduceによるリゕルタム集計
AWS 活用事例 オンラン機械学習フレームワーク試験環境
• 深夜に緩和申請して、寝て起きたら使えるようになってた。中の人の対応がはやい!
AWS 活用事例 物体認識サービス 1000sors.com
• SWSとCloudFormationを組み合わせれば、物体認識サービスに必要なンスタンス群を簡単に制御可能
AWS 活用事例 物体認識サービスのための機械学習環境
• S3上に構築した分散フゔルシステムに全てを格納 – 画像・教師・設定・スクリプト・辞書・レポート・ログ – バッチ的なシステムのためのフゔイルシステムはすぐ作れる
AWS 活用事例 情景画像文字認識のための機械学習環境
• 文字認識のための大規模機械学習 – 30タスク(8段) 4~5日/回(普通のcore i7マシン) – cc2.8xlargeのSPOTで節約(時間:1/4〃費用:1/2)
• ※1時間以内にセーブポイントまで進める工夫が必要
AWS 活用事例集 “すっごく” 便利なのでいっぱい使ってます!
毎月、猛烈に増えているよ!
詳細は過去のスライドを見てね!
EMR ざっくり把握しよう
EMR すぐに使える hadoop
• 大規模データの蓄積・バッチ分析が得意
– 非構造化データの処理:検索インデック作成
• Java で分散処理(MapReduce)が簡単に書ける
– 構造化データの処理:ログ集計
• Hive・HBase・Pig を使えば SQL ぽく書ける
← コレ
EMR 単なる hadoop との違い
• 追加機能 – 分散フゔイルシステムとして S3 も選べる
– AWS 環境に合わせてチューニングされてる
• 選ぶだけでンストールできる機能 – 構造化データの処理:Hive〃Hbase〃Pig
– 監視:Ganglia
• クラスタの管理 – 起動:ノード数を入力するだけ
– 監視・操作:Web・CLI・SDK
EMR 料金 … よく考えると安い!
• EC2 料金 + EMR 料金(1時間単位) – EMR 料金:EC2 料金(オンデマンド)× 1/4 ~ 1/7
– リザーブドやスポットで節約可能
• 例:cc2.8xlarge … 2.9$/時間 – 買うと 30 万円 ⇒ 1000 時間
– 4 台時間/実験 ⇒ 250 実験
– 普段はローカルの小さなデータで実験。たまに大きなデータで実験するときだけなら安い
– スポット使えば 20% くらいは節約できそう
MAHOUT ざっくり把握しよう
Mahout Hadoop 用の機械学習ラブラリ
• 機械学習ゕルゴリズムがいっぱい – 数十種類:分類〃回帰〃クラスタリング〃…
– 最新版:0.9(EMR で使えるのは 0.8)
• スケーラブルな実装 – R では手におえないデータ量でも OK
– 速くはないが、台数でゴリ押し
• そこそこ手軽(R よりちょっと面倒) – 入出力:HDFS 上のシーケンスフゔイル
– 実行:CLI を使えばプログラムレス
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
パッチ画像をクラスタリング の前準備
EMR 上で Mahout の K-Means を使って
クラスタリング クラスタ(似ているデータの集団)を求めること
• ゕルゴリズムと「似ている」の基準が変われば、求まるクラスタが全く異なる
• 求まったクラスタを指し示す言葉がない場合が多い(解釈が難しいことがある)
クラスタの使い方 クラスタを使ってデータを再表現
• データの再表現
– ラベル化
• 所属するクラスタ番号
– 所属度ベクトル化
• (クラスタ1の所属度〃…〃クラスタnの所属度)
– 容量・処理時間を節約できる
– 線形識別器で分離し易くなる
• データへのラベル付与
– ラベルで検索できる(ノイズ除去に使える)
これから行う実験 角や境界付近のパッチ画像をクラスタリング
• 角や境界付近の多様性が分かるといいな
– 本の表紙画像:2094 枚
• 2011 年 4 月出版 @ amazon.co.jp
– 1枚から抽出するパッチ:最大 512 個
用意したデータ パッチ画像が入ったバナリフゔル(約1GB)
• バナリフゔルの作り方
– グレースケール画像からキーポイント(位置・方向・大きさ)を検出
– そこからN×N へ正規化した画像を抽出
– 抽出した画像の輝度値(N2個)をバイナリフゔイルへ追記
パッチ画像をクラスタリング EMR 上で Mahout の K-Means を使って
EMR の実行メージ 必要なものを S3 に配置して実行
• EMR はステップ単位(jar)で実行
大雑把な手順 Mahout の入出力形式に合わせて関数呼出
• Mahout プログラムを作成
– pom フゔイルを作成
– main プログラムを作成
• バイナリフゔイルから入力形式へ変換
• K-Means でクラスタリング
• 出力形式からバイナリフゔイルへ変換
• ローカル(疑似分散環境)で実行
• EMR で実行(WebUI)
MAHOUT プログラムを作成 パッチ画像をクラスタリングするために
入力形式 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:クラスタ番号と初期のクラスタ中心}
出力形式 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:クラスタリング対象ベクトル}
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>
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); } }
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); } }
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); }
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); } }
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); }
ローカルで実行 パッチ画像をクラスタリングするために
ローカルで実行 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); }
EMRで実行 パッチ画像をクラスタリングするために
EMR で実行 必要なものを S3 に配置しよう!
• Management Console でパスを指定
EMR で実行 すぐに起動できて、そこそこ監視しやすい
• S3バケットを作成 – main プログラムが入った jar を配置する
– それが処理するデータを配置する
• クラスタを起動 – ログの出力先とインスタンス数を決める
– ステップ(jar と引数)を追加する
• クラスタを監視 – 各種指標から想定通りの進行かを確認する
• S3バケットから出力をダウンロード
クラスタを起動 EMR Management Console
• Create cluster ⇒ 各種設定
– ログ出力先
– インスタンス
– ステップ
クラスタを起動 EMR Management Console
• Cluster Configuration
– クラスタ名とログ出力先を設定する
• ログ出力先:s3n://バケット名/パス/
• Software Configuration
– Hadoop のバージョンを設定する
• Mahout 0.8 を使うには Hadoop 1.0.3
– 追加インストールするものを選ぶ
• 使わないなら消しておく。
クラスタを起動 EMR Management Console
• Hardware Configuration – インスタンスタイプと数を設定する
• マスター(main プログラムが動くノード):1個
• コゕ(タスクも処理するデータノード):0個~
• タスク(タスクを処理するノード):0個~
– 1台構成(マスターのみ)
– 複数台構成(マスターと他のノード) • マスターはタスクを処理しないのでしょぼくていい
• 1時間弱で終わるように選ぶと安い
• 1時間以上かかる場合に Spot を選ぶと危険な場合も
• 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
クラスタを起動 EMR Management Console
• 設定完了 ⇒ Create cluster
クラスタを監視 EMR Management Console
• Cluster List からクラスタを選択
クラスタを監視 EMR Management Console
• Cluster – クラスタの設定を確認できる
• Summary〃Configuration Details〃Security/Network〃Hardware
• Monitoring ← ボトルネックが分かる
– クラスタの負荷を様々な観点で確認できる • Cluster Status〃Map/Reduce〃Node Status〃IO
• Steps ← 失敗した処理が分かる
– ステップの進捗を様々な粒度で確認できる • Step〃Job〃Task
クラスタを監視 EMR Management Console
• Monitoring > Cluster Status
– クラスタが処理しているジョブの量が分かる
• 失敗したジョブがあるか?
クラスタを監視 EMR Management Console
• Monitoring > Map/Reduce
– クラスタが処理しているタスクの量が分かる
• Map/Reduce数は想定通りか?
• スロットは足りているか?
クラスタを監視 EMR Management Console
• Monitoring > Node Status
– ノードの稼働状況が分かる
• ノードが死んでないか?
クラスタを監視 EMR Management Console
• Monitoring > IO
– S3とHDFSにかかる負荷が分かる
• IOの量は想定通りか?IOがボトルネックか?
クラスタを監視 EMR Management Console
• Steps
– ステップの進捗が分かる
• 追加したステップ(main プログラム)の進捗が分かる。追加もできる。
– ステップのログが分かる
• main プログラムのログが stderr・stdout に出る
EMR で実行 EMR Management Console
• Steps > All Jobs > Tasks
– ジョブとステップのログが分かる。
• ステップ(main プログラム)から起動されたジョブ、それを構成するタスクが分かる。
クラスタを監視 EC2 Management Console
• Monitoring
– 各インスタンスのCPU・IOの負荷が分かる
• EC2 レベルで見るのもよい
結果を見てみよう パッチ画像をクラスタリング
実験結果 角や境界を表しているクラスタが得られた
• 中心に穴
– 少しずれることも
• 境界の形
– │・┌・├・┼
– =・#・○
• 輝度勾配の強弱
– 質感・照明
• ⇒ 結構面白い!
チューニング 基本に忠実にやれば OK
チューニング 今回の main プログラムのダメなところ
• S3 ⇔ HDFS – マスターだけで動くので
• スケールしない
• マスターが変換中にスレーブが遊んでる
– スケールさせるには • Mapper として実装
• 入力フゔイルを事前に分割 or 分割可能に
• Mahout 用入力が無駄にでかい – Byteがdoubleになっちゃう ⇒ 圧縮で解決
– K-Means 簡単だし、自分で実装してもいいよね
チューニング データが増えてきたら
• データが増えてきたら
– 基本的にノードを増やせばいい
– ほとんどそれでうまくいく
• ちゃんと見積もって監視しよう
– 各ノードはどのくらい資源を使い切ってる?
– Mapper と Reducer の数は想定通り?
– CPU と IOどっちがボトルネック?
まとめ
まとめ こわがらずに試してみよう
• Hadoop クラスタの起動が楽
– 計算時のみ起動する使い方がお勧め
• Hadoop クラスタの監視も楽
– Management Consoleだけでも結構分かる
• Mahout もそんなに難しくない
– 数十行で程度で試せる
– 単なる集計ではできないことができる
– 機械学習やると Hadoop 使ってる感じがする
おしまい ご清聴ありがとうございました
面白いと思ったら投票してね!