• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228)
 

今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228)

on

  • 1,011 views

 

Statistics

Views

Total Views
1,011
Views on SlideShare
1,011
Embed Views
0

Actions

Likes
1
Downloads
18
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228) 今さら聞けないHadoop勉強会第2回 セントラルソフト株式会社(20120228) Presentation Transcript

    • 今さら聞けない Hadoop 勉強会 第2回 アルゴリズム編 セントラルソフト株式会社 システム1部 システム開発課 奥山 洋平1
    • 本勉強会の目的2
    • 本セミナーの目的 Hadoop に関連する技術や培ったノウハウを、勉強会に参加された方 と 共有する SlideShare で公開 「今さら聞けないhadoop セントラ ルソフト」で見つかります スケジュール  第1回 Hadoop 基礎(1月19日開催)  HDFS と MapReduce の概念  ロールプレイ  第2回 アルゴリズム(本日2月28日開催)  k-means アルゴリズム  TF-IDF アルゴリズム  第3回 「MapReduce 実装テクニック」を予定(3月予定)  ワードカウント  k-means  TF-IDF  第4回 「理論・エコシステム編」を予定(4月予定)  HDFS  HBase  Hive 3
    • 本日の目的 2つのアルゴリズムを通してアルゴリズムからジョブ フローにする流れを知ってもらう 今回 アルゴリズム ジョブフロー 次回予定 MapReduce プログラム 4
    • 目次 k-means アルゴリズム  アルゴリズムからジョブフローへ TF-IDF アルゴリズム  アルゴリズムからジョブフローへ まとめと次回の予定 5
    • k-means アルゴリズム
    • k-means アルゴリズムとは レコードの集合を k 個のよく似た特徴を持つ集合 (クラスタ)に分割(クラスタリング)するアルゴリ ズム k = 2 の例 クラスタ レコード 7
    • クラスタリングの活用例 機械学習  手書き文字認識 この数字は 「9」 この数字は 何? 9のクラス 7のクラス タ タ 特徴抽出  「7」と「9」の分類に必要な特徴は? 8
    • k-means アルゴリズム概要 k-menas アルゴリズムは「クラスタの割り当て」と 「クラスタの重心を求める」という処理を繰り返し、 最適な重心を求めるアルゴリズム 9
    • k-means アルゴリズムの手順(1)1. 初期化  各レコードに対して、ランダムにクラスタを割り当てる2. 割り当てたクラスタの重心を求める3. 各レコードを、各クラスタの重心に一番近いクラスタ に 割り当て直す4. クラスタの割り当て変化がある 終了 2 の処理 クラスタの割り当てに変化が無い 10 予め決めた回数クラスタの割り当てを行った
    • k-means アルゴリズムの手順(2)k=3 3. クラスタの再割り当て 1. 初期化(ランダムにクラスタを割り当てる) 2. クラスタの重心を求める ⇒ クラスタの割り当てが変化したので クラスタの割り当てが変化しなかったので 2 の処理へ 処理終了11
    • アルゴリズムからジョブフローへ12
    • ジョブフローを作る際に意識すること MapReduce は分散処理なので、複雑な処理はでき ない  複雑な処理は複数回の MapReduce で実現する  本勉強会の説明では1回の MapReduce を1ジョブとす る  1ジョブの処理はシンプルにする 複雑な処理 ジョブ 2 複雑な ジョブ ジョブ 処理 1 4 ジョブ 3 13
    • k-means アルゴリズム1. 初期化  各レコードに対して、ランダムにクラスタを割り当てる2. 割り当てたクラスタの重心を求める3. 各レコードを、各クラスタの重心に一番近いクラスタ に 割り当て直す4. クラスタの割り当て変化がある 終了 2 の処理 クラスタの割り当てに変化が無い 14 予め決めた回数クラスタの割り当てを行った
    • 処理の流れ処理1:初期化処理2:割り当てたクラスタの重心を求める処理3:各レコードを、各クラスタの重心に一番近いクラ スタに 割り当て直す レコー ド集合 :入力 :出力開始 処理1 処理2 処理3 終了 :フロー :終了時入力 出力 処理3の 処理1 処理2 処理3 結果がファイ ファイ 結果 結果 結果 ル ル 最終出力15
    • MapReduce にできるか検討 それぞれの処理が1回の MapReduce で実現できそ うか 検討し、必要に応じて複数回のジョブで処理を実現 する 16
    • MapReduce の簡単な復習 MapReduce は以下の3つのフェーズで構成される  入力データの加工を行う「Map」  データの整理と分配を行う「Shuffle & Sort」  同じ key に対する value は一纏めにし、key 順にソートした データを Reduce を行うノードが受け取る  まとめられたデータに対して処理を行う「Reduce」 それぞれのフェーズの入出力は key と value のペア 17
    • 処理1概要 処理  各レコードに対して、ランダムにクラスタを割り当てる 入力(クラスタリングするデータファイル)  key : 入力ファイルの形式による  value : 1レコード 出力(ランダムにクラスタを割り当てられたレコー ド)  key : 割り当てられたクラスタ番号  value : 1レコード 18
    • 処理1検討 <入力形式によって異なるkey , 1レコード> 入力 乱数 処理1 1回の MapReduce で実現できそう <ランダムに割り当てたクラスタ , 1レコード> 出力19
    • 処理2概要 処理  割り当てられたクラスタの重心を求める 入力(ランダムにクラスタを割り当てられたレコー ド)  key : クラスタ番号  value : 1レコード 出力(クラスタの重心)  key : クラスタ番号  value : クラスタの重心の位置 20
    • 処理2検討 <クラスタ1, A><クラスタ2, B> <クラスタ1, C> Map 出力 Shuffle & Sort で同じクラスタは一纏まりになり、 Shuffle & Sort その纏まりでクラスタの重心が計算できる <クラスタ1, [A , C]> <クラスタ2, [B]> 1回の MapReduce で実現できそう Reduce 入力21
    • 処理3概要 処理  各レコードを、一番近いクラスタに割り当て直す 入力1(クラスタの重心)  key : クラスタ番号  value : クラスタの重心の位置 入力2(クラスタリングするデータファイル)  key : <要検討>  value : 1レコード 出力(クラスタを割り当て直したレコード)  key : 割り当てたクラスタ  value : 1レコード 22
    • 処理3検討 問題となりそうなところ  2つの形式のデータの入力はどうする?  クラスタの重心のデータはすべての Reduce を行うノー ドに 配布する必要があるがどうする?  すべてに配布しないと各レコードがどのクラスタに近いのか 比較できない 実現方法を知っていれば1回の MapReduce で 知らなければ MapReduce の回数を増やす 次回、1回の MapReduce で実現する方法を解説 予定 23
    • その他次回解説を行う問題 <要検討>にしてあった部分 処理3の終了後、条件によって処理を終了するか、 処理2の処理に戻るか分岐する問題 MapReduce の実装レベルの内容は次回行う(予 定) 24
    • TF-IDF アルゴリズム25
    • TF-IDF アルゴリズムとは 文書中の単語に関する重み付けのアルゴリズム  その単語がその文書でどれくらい特徴的であるかを 単語ごと文書ごとに数値化(tfidf 値)  出てくる文書が少なく、特定の文書での出現回数が多い単語ほ ど その文書での数値が大きい  キーワード抽出や Web 検索へ応用できる 例:ある文書中の tfidf 値 “Hadoop” : 0.3 文書 “HDFS” : 0.6 “MapReduce” : 0.5 26 …
    • tfidf 値の意味(1) 異なる文書の同じ単語の場合  単語の tfidf 値が高い文書ほど、その単語を特徴として持 つ文書  その単語がよく表れる文書 文書のキーワード 検索 文書A 文書B 文書C “Hadoop” : 0.3 “Hadoop” : 0.5 “Hadoop” : 0.2 “Hadoop” の検索結果は上位から 文書B , A , C 27
    • tfidf 値の意味(2) 一つの文書内の単語の場合  特定の文書中で tfidf 値が高い単語が、その文書を特徴付け る  文書のインデックス作成 文書のキーワード検索 の高速化 tfidf 値 インデックス “Hadoop” : 0.3 “HDFS” : 0.6 “HDFS” 文書A “Java” : 0.2 “MapReduce” “MapReduce” : 0.5 “Hadoop” “Ruby” : 0.1 … 28
    • TF-IDF アルゴリズム(tfidf 値の求め方)(1) tfidf 値は、単語の出現頻度(tf : term frequency)と 逆文書頻度(idf : inverse document frequency)の積で求め られる tfidf 単語の出現頻度 * 逆文書頻度 単語の出現頻度(tf)は以下の式で求められる 文書中の単語の出現回 数 単語の出現頻度 文書中の単語の総数 逆文書頻度(idf)は以下の式で求められる(この式は ジップの法則に由来する) 文書数 逆文書頻度 log10 単語が出現した文書数 29
    • TF-IDF アルゴリズム(tfidf 値の求め方)(2) 文書1 文書2 文書3 A tf:0.5 0.2385 単語の出現頻度 * 逆文書頻度 A 文書中の単語の出現回数 / 文書中の単語の総数 0.5 * 0.477 idf:0.477 2/4 log10(文書数/単語が出現した文書数) tf:0.25 log10(3 / 1) tf:0.33 B 0.044 B単語ごとに共通の値 0.05808 idf:0.176 C tf:0.25 C tf:0.33 C tf:0.25 idf:0 0 0 0 D tf:0.33 D tf:0.5 0.05808 0.088 idf:0.17 D 6 tf:0.25 E 0.11925 idf:0.4730 7
    • アルゴリズムからジョブフローへ31
    • k-means アルゴリズムとの違い k-means はアルゴリズムの中でフローが決まってい た TF-IDF は計算式だけでフローが無いので、どのよう な順番で処理を行うのか考えなければならない 32
    • ジョブフローを作る際に意識すること(再掲) MapReduce は分散処理なので、複雑な処理はでき ない  複雑な処理は複数回の MapReduce で実現する  ここでは1回の MapReduce を1ジョブとする  1ジョブの処理はシンプルにする 複雑な処理 ジョブ 2 複雑な ジョブ ジョブ 処理 1 4 ジョブ 3 33
    • MapReduce の簡単な復習(再掲) MapReduce は以下の3つのフェーズで構成される  入力データの加工を行う「Map」  データの整理と分配を行う「Shuffle & Sort」  同じ key に対する value は一纏めにし、key 順にソートした データを Reduce を行うノードが受け取る  まとめられたデータに対して処理を行う「Reduce」 それぞれのフェーズの入出力は key と value のペア 34
    • アルゴリズムからジョブフローへの流れ1. 大まかな処理に分ける2. 処理の入出力を考える3. データを Reduce からの参照のされ方で分ける 1. 全ての Reduce 2. 全てではないが複数の Reduce 3. 一つの Reduce4. 処理ごとに簡単な MapReduce で実現できるか検討 し、 必要に応じてジョブを増やす 35
    • 1.大まかな処理に分ける 必要なものを考え、大まかな処理に分ける 文書中の単語の出現回数を求める 文書中の単語の総数を求める 式に代入 tfidf 値 して計算 文書数を求める 単語が出現した文書数を求め る文書中の単語の出現回 数 文書数 * log10 文書中の単語の総数 単語が出現した文書数 36
    • 2.処理の入出力を考える(1)  どのような key と value のペアを出力するか考える  「式に代入して計算」の処理の場合 Hadoop : 0.3 文書A HDFS : 0.6 MapReduce : 0.5 … key は文書名と単語のペ value は ア tfidf 値 文書 A の Hadoop の 値: 0.3 文書 A の HDFS の 値: 0.6 文書 A の MapReduce の 値: 0.5 37
    • 2.処理の入出力を考える(2) 同様にして考えると以下の表のようになる 処理 key value 式に代入して計算 文書名/単語 tfidf 値 文書中の単語の出現回数を求める 文書名/単語 出現回数 文書中の単語の総数を求める 文書名 単語の総数 文書数を求める <要検討> 文書数 単語が出現した文書数を求める 単語 出現した文書 数 38
    • 2.処理の入出力を考える(3) 入力ファイルから文書名を取得する必要があるので、 今回の入力ファイルは説明を簡単にするため以下の フォーマットを用いる 入力ファイル タイトル名1@バイトオフセット 文章 タイトル名1@バイトオフセット 文章 タイトル名1@バイトオフセット 文章 タイトル名1@バイトオフセット 文章 タイトル名2@バイトオフセット 文章 タイトル名2@バイトオフセット 文章 タイトル名2@バイトオフセット 文章 … 39
    • 3.データを Reduce からの参照のされ方で分ける(1) 「式に代入して計算」の処理の入力を考える 全体で共通の値  以下は計算式と必要な値を求める処理の出力各文書で共通の値 全て異なる値 各単語で共通の 値 文書中の単語の出現回 数 文書数 * log10 文書中の単語の総数 単語が出現した文書数 処理 key value 文書中の単語の出現回数を求める 文書名/単語 出現回数 文書中の単語の総数を求める 文書名 単語の総数 文書数を求める <要検討> 文書数 単語が出現した文書数を求める 単語 出現した文書 数 40
    • 3.データを Reduce からの参照のされ方で分ける(2) 全体で共通の値  k-means のクラスタの中心データの配布と同じ方法を使 う 部分的に共通の値  ジョブ(MapReduce)を追加して全て異なる値と一緒に 扱う  全体で共通の値と同じ手法を使わない理由は次回 41
    • ここまでで構築した処理の流れ 文書数を求め 式に代入 る して計算 入力 文書中の単語の 出力ファイ 出現回数を求める ファイル ル 値をまとめ 値をまとめ (tfidf る1 る2 値) 単語が出現した 文書数を求める 文書中の単語の 総数を求める 42
    • 4.簡単な MapReduce で実現できるか検討43
    • 「文書数を求める」検討 入力ファイルから簡単な MapReduce で文書数を求 めることはできない 先に「文書のリスト作成」のジョブを作成してから だと、ワードカウントと同様にして文書数が求めら れる 文書数を求める 文書数を求め 文書名の る 文書名を数える リスト作成 44
    • 「文書中の単語の出現回数を求める」検討 入力から文書名と単語のペアを key にすれば、 ワードカウントと同様にして文書中の単語の出現回 数が求められる 45
    • 「単語が出現した文書数を求める」検討 入力ファイルから簡単な MapReduce で単語が出現 した文書数を求めることはできない 先に「文書で出現した単語のリスト」を作成しして からだと、ワードカウントと同様にして単語が出現 した文書数が求められる 単語が出現した文書数を求める 単語が出現し た文書数を求 リストから 文書で出現した める 単語が出現した 単語のリスト 文書数を求める 46
    • 「文書中の単語の総数を求める」検討 文書名を key にすれば、ワードカウントと同様にし て 文書中の単語の総数が求められる 47
    • ジョブフロー 文書数を求める 文書名の 文書名を数 式に代入 リスト作成 える して計算 文書中の単語の 出力 入力 出現回数を求めるファイ ファイル ル 値をまとめ 値をまとめ (tfidf 単語が出現した文書数を求める る1 る2 値) 文書で出現し リストから た 単語が出現した 単語のリスト 文書数を求める 文書中の単語の 総数を求める 48
    • まとめと次回の予定49
    • まとめ アルゴリズムからジョブフローにする手順 1. 大まかな処理に分ける 2. 処理の入出力を考える 3. データを Reduce からの参照のされ方で分ける 1. 全ての Reduce 2. 全てではないが複数の Reduce 3. 一つの Reduce 4. 処理ごとに簡単な MapReduce で実現できるか検討し、 必要に応じてジョブを増やす 50
    • 次回の予定 MapReduce プログラミング基礎とプログラミングテ クニック  ワードカウント  k-means  TF-IDF 51