Download presentation
Presentation is loading. Please wait.
1
分散処理プラットフォーム Hadoop による Wikipedia データの 解析 森 竜也 (東京電機大学) 2010.11.7 1
2
概要 Wikipedia で配布されているデータファイル 日本語版で 6.5GB ほどの巨大な XML ファイル 1 個に全ページ内容が記述されている 公式には SQL ダンプに変換して使用する オープンソースの分散処理プラットフォーム Hadoop による処理方法を紹介 2
3
何ができるか? 例えば – ページ名やページの種別を出力する – 記事中に挙げられている参考文献を集める – テレビ番組の記事を抽出する などプログラミング次第で色々できる しかし得手不得手はある 3
4
見出し Wikipedia の配布データ Hadoop とは Hadoop プログラム入門 Wikipedia データへの応用 実例 Medawiki との比較 ダウンロード 4
5
Wikipedia の配布データ 5
6
ダウンロードサイト http://download.wikimedia.org/jawiki/latest/ 6 jawiki-latest-interwiki.sql.gz jawiki-latest-pages-meta-current.xml.bz2
7
jawiki-latest-pages-meta-current.xml 全ページ内容が記述されている XML ファイ ル 6.5GB page 要素が Wikipedia1 ページ分の情報 7 ヘッダー情報 ページ内容 1 ページ内容 2 ページ内容 3 ・ ページ内容 n ヘッダー情報 ページ内容 1 ページ内容 2 ページ内容 3 ・ ページ内容 n ページ要素 1,880,711 個
8
page 要素 8 Hadoop 1805248 34222653 2010-09-28T14:57:34Z Tire works 456732 バージョンを更新。 記事本文 …… Hadoop 1805248 34222653 2010-09-28T14:57:34Z Tire works 456732 バージョンを更新。 記事本文 …… title 要素 ページタイトル id 要素 ページ ID text 要素 記事本文 Wiki 形式の 生データ title 要素 ページタイトル id 要素 ページ ID text 要素 記事本文 Wiki 形式の 生データ
9
公式で紹介されている使い方 1.MediaWiki のインポート機能で取り込む 2. 変換ツールを使用して SQL ダンプに変換 – xml2sql, mwdumper Hadoop を利用した手法 – 簡単なプログラミングで分散処理が可能 9
10
Hadoop とは 10
11
Hadoop とは Apache で開発されている分散コンピュー ティングプラットフォーム Google の GFS(Google File System) と MapReduce の Java によるクローン もちろんオープンソース 分散処理、分散ファイルシステムなど – Hadoop を活用するためのサブプロジェクト有 11 Hadoop マスコッ ト
12
特徴 スケーラビリティ Hadoop で使用するのは普通、一般的な性能のマシ ン 5 台分の処理能力が必要なら 5 台 100 台分の処理能力が必要なら 100 台 というように必要に応じた規模のクラスタを構成 できる Yahoo! や facebook 、楽天などでも利用 – 数千台のマシン、数 TB のデータ – Wikipedia の数 GB のデータは Hadoop の利用例からすれ ば小さいほう 12
13
Hadoop プログラム入門 13
14
MapReduce Hadoop で使用する分散処理のアルゴリズ ム map 処理と reduce 処理の 2 段階で key と value のデータ組を出力、集約する 14 mapreduce
15
MapReduce 元データがレコード単位に分割されて map に配 布される map でデータを加工し key と value の組データを出 力 reducer は key 毎にまとめられた value 群を受け取 り、新たな key と value の組を出力 15 mapreduce
16
MapReduce の例 学校のテスト結果 1 人分の結果を書いたカードがある 手作業で組ごとの平均点を求めるには? 16 1 組 20 番 75 点
17
組ごとの平均点を算出 どうするか? 17 1 組 5 番 80 点 1 組 20 番 75 点 3 組 12 番 90 点 3 組 3 番 35 点 1 組 4 番 20 点 2 組 7 番 20 点 3 組 15 番 90 点 2 組 10 番 75 点 2 組 31 番 50 点 1 組 25 番 80 点
18
組ごとの平均点を算出 当然 1. 組ごとにカードを分ける 2. 組ごとに点数を足す 3. 平均点 = 合計点 / カードの枚数 18 1 組 5 番 80 点 1 組 20 番 75 点 1 組 4 番 20 点 1 組 25 番 80 点 2 組 7 番 20 点 2 組 10 番 75 点 2 組 31 番 50 点 3 組 12 番 90 点 3 組 3 番 35 点 3 組 15 番 90 点 255145 215 255/4=63.75145/3=48.33 215/3=71.66
19
MapReduce にあてはめる 1 人分のデータを map に配布 map は組を key, 点数を value にして出力 reduce は組ごとにグループ化されたデータ 群を受け取れるので、平均点を算出 19 ・・・ 1 組 63.75 2 組 48.33 3 組 71.66 3 組 7 番 20 点 2 組 15 番 90 点 1 組 4 番 20 点 1 20, 80, 75,80 2 20, 75, 50 3 35, 90, 90 1 20 3 20 2 90
20
処理対象データ 20 3 44 63 1 32 89 2 33 74 1 21 36 3 1 99 ・ 2 42 84 3 44 63 1 32 89 2 33 74 1 21 36 3 1 99 ・ 2 42 84 組 番号 点数
21
MapReduce プログラム実装 map を行う Mapper クラスの定義 reduce を行う Reducer クラスの定義 実行時の設定である Job オブジェクトの生 成 21
22
Mapper クラスと Reducer クラス Hadoop 側で用意されている抽象クラス Mapper と Reducer をオーバーライドして定 義する 必要なのは 1 つのメソッドだけ – Mapper なら map メソッド – Reducer なら reduce メソッド – 先ほどの平均点プログラムの場合 …… 22
23
平均点算出 Mapper 23 public class ScoreAverageMapper extends Mapper { protected void map(LongWritable key, Text value, Context context) throws IOException,InterruptedException { String[] columns = value.toString().split("\t"); int classN = Integer.parseInt(columns[0]); int score = Integer.parseInt(columns[2]); context.write(new IntWritable(classN), new IntWritable(score)); }; } public class ScoreAverageMapper extends Mapper { protected void map(LongWritable key, Text value, Context context) throws IOException,InterruptedException { String[] columns = value.toString().split("\t"); int classN = Integer.parseInt(columns[0]); int score = Integer.parseInt(columns[2]); context.write(new IntWritable(classN), new IntWritable(score)); }; } 総称型で入出力デー タの型を定義 value が 入力ファイル 1 行分 key が組 value が点数 として出力
24
平均点算出 Reducer 24 public class ScoreAverageReducer extends Reducer { protected void reduce(IntWritable key, Iterable values, Context context)throws IOException,InterruptedException { int sum = 0; int students = 0; for (IntWritable score : values) { sum += score.get(); students++; } context.write(key, new DoubleWritable((double)sum / (double)students)); }; } public class ScoreAverageReducer extends Reducer { protected void reduce(IntWritable key, Iterable values, Context context)throws IOException,InterruptedException { int sum = 0; int students = 0; for (IntWritable score : values) { sum += score.get(); students++; } context.write(key, new DoubleWritable((double)sum / (double)students)); }; } key が組 key (組)と結びついている value (点数)が Iterable として取得できる key が組 value が平均点 として出力
25
Job オブジェクトの生成 25 Job job = new Job(getConf()); job.setJarByClass(ScoreAverage.class); job.setMapperClass(ScoreAverageMapper.class); Mapper クラスの指定 job.setReducerClass(ScoreAverageReducer.class); Reducer クラスの指定 job.setMapOutputKeyClass(IntWritable.class); Mapper クラスの出力 key の型 job.setMapOutputValueClass(IntWritable.class); Mapper クラスの出力 value の 型 job.setOutputKeyClass(IntWritable.class); Reducer クラスの出力 key の型 job.setOutputValueClass(DoubleWritable.class); Reducer クラスの出力 value の 型 job.setInputFormatClass(TextInputFormat.class); Mapper へのデータの与え方 job.setOutputFormatClass(TextOutputFormat.class); 出力結果の形式 FileInputFormat.addInputPath(job, new Path(args[0])); 入力ファイルのパス FileOutputFormat.setOutputPath(job, new Path(args[1])); 出力ファイルのパス return job.waitForCompletion(true) ? 0 : 1; 設定内容で MapReduce を実行 Job job = new Job(getConf()); job.setJarByClass(ScoreAverage.class); job.setMapperClass(ScoreAverageMapper.class); Mapper クラスの指定 job.setReducerClass(ScoreAverageReducer.class); Reducer クラスの指定 job.setMapOutputKeyClass(IntWritable.class); Mapper クラスの出力 key の型 job.setMapOutputValueClass(IntWritable.class); Mapper クラスの出力 value の 型 job.setOutputKeyClass(IntWritable.class); Reducer クラスの出力 key の型 job.setOutputValueClass(DoubleWritable.class); Reducer クラスの出力 value の 型 job.setInputFormatClass(TextInputFormat.class); Mapper へのデータの与え方 job.setOutputFormatClass(TextOutputFormat.class); 出力結果の形式 FileInputFormat.addInputPath(job, new Path(args[0])); 入力ファイルのパス FileOutputFormat.setOutputPath(job, new Path(args[1])); 出力ファイルのパス return job.waitForCompletion(true) ? 0 : 1; 設定内容で MapReduce を実行
26
実際に動作させる Hadoop の 3 つのモード – スタンドアロン 開発用 – 疑似分散 動作確認用 – 分散環境 実環境 26
27
Hadoop の利点 1 1 つの map, reduce タスクは、ほかのタスクの進捗 状況を考慮する必要がない プログラミングが容易 他人の書いた MapReduce を再利用可能 27 ・・・ 1 組 63.75 2 組 48.33 3 組 71.66 この map タスクからすれば、 他の map がどういう状況であろう と、 自分の作業には関係ない
28
Hadoop に向かないこと MapReduce の実行には小さくないオーバー ヘッドが掛かる リアルタイムで結果を求めれるような処 理には不向き – 例えば検索システム – × 検索の度に MapReduce でデータを解析 – ○ あらかじめインデックスなどの 2 次的なデー タを MapReduce で生成しておく 28
29
Wikipedia データへの応用 29
30
Wikipedia データへの応用 平均点の時と同様に、この MapReduce の枠 組みに当てはめて考える 30 mapreduce jawiki-latest-pages- meta-current.xml
31
Wikipedia データへの応用 page 要素( 1 ページ分のデータ)が Mapper に配布する単位としてちょうど良さそう である 31 ヘッダー情報 ページ内容 1 ページ内容 2 ページ内容 3 ・ ページ内容 n ヘッダー情報 ページ内容 1 ページ内容 2 ページ内容 3 ・ ページ内容 n ページ要素 1,880,711 個
32
InputFormat の定義 入力ファイルを Mapper に与える形に分割 するクラス 平均点プログラムでは TextInputFormat – 入力ファイルを 1 行ずつ切り出す – 継承して page 要素を切り出す InputFormat を定 義 32 Input Format
33
WikipediaXmlInputFormat 実際には TextInputFormat の機能を利用して 1 行ずつ読みだし、 page 要素の始まりから 終わりまでを Mapper へ渡す 33 ヘッダー情報 ページ内容 1 ページ内容 2 ページ内容 3 ・ ページ内容 n ヘッダー情報 ページ内容 1 ページ内容 2 ページ内容 3 ・ ページ内容 n 1 ページの分のデータ を Mapper へ配布する
34
ページ名やページの種別を出力 記事、カテゴリ、リダイレクトを抽出 ページ名は title 要素から取得 判断基準 – カテゴリ ページ名が ”Category:” で始まる – リダイレクト 本文が #REDIRECT [[ 転送先 ]] という記述 – 記事 それ以外 34
35
実行時間 日本語版データファイル 使用マシン – OS: CentOS 5 – CPU: Xeon 3060 2.40GHz – メモリ : 4GB – マスタ 1 台、スレーブ 3 台 ページの種別を抽出のに 3 分程度 35
36
記事中に挙げられている 参考文献を集める Wikipedia では情報の出典を記載するガイ ドラインがある – 残念ながらあまり守られていない …… – (特に日本語版では) ISBN コードを集める – 世界中を書籍を識別するためのコード – Wikipedia は書籍の出典に ISBN コードを記述す るのは任意 36
37
記事中に挙げられている 参考文献を集める ページが記事であれば、本文から ISBN コー ドを抽出 – 正規表現によるパターンマッチ – ISBN (*[\d-]+) – 10 桁の旧規格と、 13 桁の新規格が混在 – 新規格への変換手順があるので、新規格に統 一して出力 37
38
参考文献 英語版日本語版ドイツ語版フランス語版 外部リンクが ある 42%39%52%30% 参考文献のセ クションがあ る 34%6%20%10% ISBN コードが ある 6%5%14%3% 38 書籍と、 Web 上の資源で参照している割合が異 なる
39
テレビ番組の記事を抽出する 以下の基準でテレビ番組であるか判定す る – カテゴリに ” ~番組 ” がある – テンプレートに ” 基礎情報 _ 番組 ” がある 39
40
MediaWiki との比較 40
41
MediaWiki との比較 処理データ分散処理言語 Wiki 記法 Hadoop XML ファイル可能 Java 自前で解析 MediaWiki データベー ス 不可能 PHP 標準の Parser 41 MediaWiki は単独のマシン上で PHP と RDB を使う Hadoop は複数のマシン上で Java を使う 複雑な Wiki 文法を解析するのは困難
42
テンプレート 与えた引数に応じて Parser が文字列を出力 する仕組み {{Lang-en|United States of America}} – Lang-en というテンプレート – 引数は ” Lang-en|United States of America” Parser の出力は 英語 : United States of America 42
43
なぜ Hadoop 上でテンプレートを 解析しにくいか 1 記事の という記述を見ても、 Lang-en が呼び出さ れていることは分かっても、 Lang-en がど のようなテンプレートかは分からない 43 {{Lang-en|United States of America}} 43 ・・・ 1 組 63.75 2 組 48.33 3 組 71.66 Mapper は自分が与えらたデータの ほかには参照できるデータがない
44
なぜ Hadoop 上でテンプレートを 解析しにくいか 2 テンプレートは入れ子にできる リンクやタグを書ける 44
45
MediaWiki との使い分け 45 処理データ分散処理言語 Wiki 記法 Hadoop XML ファイル可能 Java 自前で解析 MediaWiki データベー ス 不可能 PHP 標準の Parser 複雑な文法を解析する場合は、 MediaWiki を 利用したほうが効率的 Java にも代替パーサがある http://code.google.com/p/gwtwiki/ ある程度の文法はサポートされているが、 Wikipedia で使われている多くの extension ま ではサポートしきれない
46
おわりに 本日紹介したプログラムはソースコード と共に公開しています http://sourceforge.jp/projects/wik-ie/ ご清聴ありがとうございました 46
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.