Your SlideShare is downloading. ×
0
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Googleの基盤クローン Hadoopについて
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Googleの基盤クローン Hadoopについて

11,174

Published on

@ Kernel Reading Party (20080704)

@ Kernel Reading Party (20080704)

Published in: Technology, News & Politics
0 Comments
11 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
11,174
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
236
Comments
0
Likes
11
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Google の基盤クローン Hadoop について 太田 一樹 <kazuki.ohta@gmail.com>
  • 2. 自己紹介 <ul><li>太田一樹 </li></ul><ul><ul><li>東京大学情報理工学系研究科コンピューター科学専攻石川研究室 M1 </li></ul></ul><ul><ul><ul><li>HPC 系の話 ( 並列ファイルシステム ) </li></ul></ul></ul><ul><ul><li>個人サイト </li></ul></ul><ul><ul><ul><li>http://kzk9.net/ </li></ul></ul></ul><ul><ul><ul><li>http://kzk9.net/blog/ </li></ul></ul></ul><ul><ul><li>興味 </li></ul></ul><ul><ul><ul><li>OS, ネットワーク , I/O, 分散システム </li></ul></ul></ul><ul><ul><li>OSS 的活動 </li></ul></ul><ul><ul><ul><li>I was a committer of KDE, uim, SigScheme </li></ul></ul></ul><ul><ul><ul><li>copybench? </li></ul></ul></ul><ul><ul><ul><li>Kernel Reporter </li></ul></ul></ul>
  • 3. とは? <ul><li>Google の基盤ソフトウェアのクローン </li></ul><ul><ul><li>Google File System, MapReduce </li></ul></ul><ul><li>Yahoo Research の Doug Cutting 氏が開発 </li></ul><ul><ul><li>元々は Lucene のサブプロジェクト </li></ul></ul><ul><ul><li>Doug の子供の持っているぬいぐるみの名前 </li></ul></ul><ul><li>Java で記述 ! </li></ul>
  • 4. Google 関連 参考論文 &amp; スライド <ul><li>The Google File System </li></ul><ul><ul><li>Sanjay Ghemawat, Howard Gobioff, and Shu-Tak Leong, SOSP 2003 </li></ul></ul><ul><li>MapReduce: Simplified Data Processing on Large Clusters </li></ul><ul><ul><li>Jeffrey Dean and Sanjay Ghemawat, SOSP 2004 </li></ul></ul><ul><li>Parallel Architectures and Compilation Techniques (PACT) 2006, KeyNote </li></ul><ul><ul><li>http://www.cs.virginia.edu/~pact2006/program/mapreduce-pact06-keynote.pdf </li></ul></ul>
  • 5. Hadoop 参考文献 <ul><li>Hadoop 公式サイト </li></ul><ul><ul><li>http://hadoop.apache.org/core/ </li></ul></ul><ul><ul><li>Wiki: http://wiki.apache.org/hadoop/ </li></ul></ul><ul><ul><ul><li>インストール方法・チュートリアル・プレゼン資料など </li></ul></ul></ul><ul><ul><li>Running Hadoop on Ubuntu Linux </li></ul></ul><ul><ul><ul><li>http://www.michael-noll.com/wiki/Running_Hadoop_On_Ubuntu_Linux_(Single-Node_Cluster) </li></ul></ul></ul><ul><ul><ul><li>http://www.michael-noll.com/wiki/Running_Hadoop_On_Ubuntu_Linux_%28Multi-Node_Cluster%29 </li></ul></ul></ul><ul><li>Hadoop, hBase で構築する大規模データ処理システム on Codezine </li></ul><ul><ul><li>http://codezine.jp/a/article/aid/2448.aspx </li></ul></ul>
  • 6. Hadoop の開発状況
  • 7. 性能 <ul><li>Apache Hadoop wins TeraSort Benchmark! </li></ul><ul><ul><li>http://developer.yahoo.com/blogs/hadoop/2008/07/apache_hadoop_wins_terabyte_sort_benchmark.html </li></ul></ul><ul><ul><li>規定フォーマットの 1T データをソート </li></ul></ul><ul><ul><li>209 seconds (5G/sec, 5M/sec per node) </li></ul></ul><ul><ul><ul><li>910 nodes, 4 dual core Xeon 2.0GHz, 1G Ether </li></ul></ul></ul>物量作戦
  • 8. 性能 ( 僕が測ってみた )
  • 9. 関連プロジェクト <ul><li>hBase </li></ul><ul><ul><li>BigTable クローン </li></ul></ul><ul><li>Pig </li></ul><ul><ul><li>クエリ言語で MapReduce プログラムを記述 </li></ul></ul>clean = FILTER raw BY org.apache.pig.tutorial.NonURLDetector(query);
  • 10. MapReduce Motivation
  • 11. 問題 <ul><li>インターネットの爆発的普及により、非常に大規模なデータが蓄積されている </li></ul><ul><ul><li>例えば Web ページのサイズを考えてみる </li></ul></ul><ul><ul><ul><li>200 億ページ * 20KB = 400 TB </li></ul></ul></ul><ul><ul><li>Disk 読み込み性能は 50MB/sec (SATA) </li></ul></ul><ul><ul><ul><li>1 台では読み込むだけでも約 100 日 </li></ul></ul></ul><ul><ul><ul><li>保存するだけでも 500G のディスクが 1000 個程度必要 </li></ul></ul></ul><ul><li>このデータを効率的に処理したい </li></ul>
  • 12. 解決方法 <ul><li>お金 </li></ul><ul><ul><li>とにかく大量のマシンを用意 </li></ul></ul><ul><ul><li>1000 台マシンがあれば 1 台で 400G 処理すれば ok </li></ul></ul><ul><ul><li>読み込むのに 8000 秒程度で済む </li></ul></ul>
  • 13. お金だけでは解決しない <ul><li>プログラミングが非常に困難になる </li></ul><ul><ul><li>プロセス起動 </li></ul></ul><ul><ul><li>プロセス監視 </li></ul></ul><ul><ul><li>プロセス間通信 </li></ul></ul><ul><ul><li>デバッグ </li></ul></ul><ul><ul><li>最適化 </li></ul></ul><ul><ul><li>故障時への対応 </li></ul></ul><ul><li>しかも、新しいプログラムを作る度にこれらの問題をいちいち実装する必要がある </li></ul>うはー めんどくせー!
  • 14. 既存の分散 / 並列プログラミング環境 <ul><li>MPI (Message Passing Interface) </li></ul><ul><ul><li>並列プログラミングのためのライブラリ </li></ul></ul><ul><ul><ul><li>スパコンの世界では主流 </li></ul></ul></ul><ul><ul><li>プログラマは各プロセスの挙動を記述 </li></ul></ul><ul><ul><ul><li>通信プリミティブ (Send, Recv, All-to-All) が提供されており、それを用いてデータ通信を実現 </li></ul></ul></ul><ul><ul><li>利点 </li></ul></ul><ul><ul><ul><li>通信パターンなどをプログラマがコントロールでき、問題に対して最適なプログラムを記述する事ができる </li></ul></ul></ul>
  • 15. MPI の問題点 <ul><li>問題点 </li></ul><ul><ul><li>耐障害性への考慮が少ない </li></ul></ul><ul><ul><ul><li>アプリケーションが独自にチェックポイント機能を実装 </li></ul></ul></ul><ul><ul><ul><li>1 万台以上の環境で計算するには耐えられない </li></ul></ul></ul><ul><ul><ul><ul><li>1 台が 1000 日程度で壊れるとすると、 1 日で 10 台程度壊れる </li></ul></ul></ul></ul><ul><ul><ul><ul><li>壊れる度にチェックポイントから戻すとかやってらんない </li></ul></ul></ul></ul><ul><ul><ul><ul><li>RAID 組んでもそのうち壊れるので一緒 </li></ul></ul></ul></ul><ul><ul><li>通信パターンなどを記述する作業が多くなり、実際のアルゴリズムを記述するのにたどり着くまで時間がかかる </li></ul></ul>
  • 16. そこで MapReduce <ul><li>大体の 大規模データ処理を行う問題に特化したプログラミングモデル </li></ul><ul><ul><li>アルゴリズムの記述のみにプログラマが集中できる </li></ul></ul><ul><ul><li>ただし世の中の問題全てに対して最適なモデルではない </li></ul></ul><ul><li>ライブラリ側で面倒な事を全て担当 </li></ul><ul><ul><li>自動的に処理を分散 / 並列化 </li></ul></ul><ul><ul><li>ロードバランシング </li></ul></ul><ul><ul><li>ネットワーク転送・ディスク使用効率化 </li></ul></ul><ul><ul><li>耐障害性の考慮 </li></ul></ul><ul><ul><ul><li>1 ノードで失敗したら違う場所でやりなおせばいいよね </li></ul></ul></ul><ul><ul><li>MapReduce が賢くなれば、それを使う全てのプログラムが賢くなる! </li></ul></ul>
  • 17. MapReduce 型の処理 <ul><li>WordCount </li></ul><ul><li>Grep </li></ul><ul><li>Sort ( 適切な Partition 関数を選択する必要 ) </li></ul><ul><li>Log Analysis </li></ul><ul><li>Web Graph Generation </li></ul><ul><li>Inverted Index Construction </li></ul><ul><li>Machine Learning </li></ul><ul><ul><li>NaiveBayes, K-means, Expectation Maximization, etc. </li></ul></ul>
  • 18. Google での使用率
  • 19. MapReduce Model
  • 20. MapReduce の実行フロー Data Map Data Map Data Map Reduce Reduce Data Data Shuffle
  • 21. MapReduce の実行フロー <ul><li>入力読み込み </li></ul><ul><ul><li>&lt;key, value&gt;* </li></ul></ul><ul><li>Map </li></ul><ul><ul><li>map: &lt;key, value&gt; ⇒ &lt;key’, value’&gt;* </li></ul></ul><ul><li>Shuffle </li></ul><ul><ul><li>shuffle: &lt;key’, reducers&gt; ⇒ destination reducer </li></ul></ul><ul><li>Reduce </li></ul><ul><ul><li>reduce: &lt;key’, &lt;value’&gt; * &gt; ⇒ &lt;key’’, value’’&gt;* </li></ul></ul><ul><li>出力書き出し </li></ul><ul><ul><li>&lt;key’’, value’’&gt;* </li></ul></ul>
  • 22. MapReduce の実行フロー Data Map Data Map Data Map Reduce Reduce Data Data Shuffle &lt;k, v&gt;* &lt;k, v&gt;* &lt;k, v&gt;* &lt;k, v&gt;* ⇒ &lt;k’, v’&gt;* &lt;k’, &lt;v’&gt;*&gt;* ⇒ &lt;k’’, v’’&gt;* &lt;k, v&gt;* ⇒ &lt;k’, v’&gt;* &lt;k, v&gt;* ⇒ &lt;k’, v’&gt;* &lt;k’, &lt;v’&gt;*&gt;* ⇒ &lt;k’’, v’’&gt;*
  • 23. 例 : ワードカウント Data Map Data Map Data Map Reduce Reduce Data Data Shuffle foo foo foo bar bar buzz 入力文書 : doc1
  • 24. 例 : ワードカウント Data Map Data Map Data Map Reduce Reduce Data Data Shuffle foo foo foo bar bar buz 入力文書 : doc1 doc1: foo doc1: foo doc1: foo doc1: bar doc1: bar doc1: buz
  • 25. 例 : ワードカウント Data Map Data Map Data Map Reduce Reduce Data Data Shuffle foo foo foo bar bar buz 入力文書 : doc1 doc1: foo doc1: bar doc1: bar doc1: buz doc1: foo doc1: foo
  • 26. 例 : ワードカウント Data Map Data Map Data Map Reduce Reduce Data Data foo foo foo bar bar buz 入力文書 : doc1 doc1: foo doc1: bar doc1: bar doc1: buz doc1: foo doc1: foo foo: 1 foo: 1 bar: 1 foo: 1 bar: 1 buz: 1
  • 27. 例 : ワードカウント Data Map Data Map Data Map Reduce Reduce Data Data foo foo foo bar bar buz 入力文書 : doc1 foo: 1 foo: 1 bar: 1 foo: 1 bar: 1 buz: 1 bar: &lt;1, 1&gt; buz: &lt;1&gt; foo: &lt;1, 1, 1&gt;
  • 28. 例 : ワードカウント Data Map Data Map Data Map Reduce Reduce Data Data foo foo foo bar bar buz 入力文書 : doc1 bar: &lt;1, 1&gt; buz: &lt;1&gt; foo: &lt;1, 1, 1&gt;
  • 29. 例 : ワードカウント Data Map Data Map Data Map Reduce Reduce Data Data foo foo foo bar bar buz 入力文書 : doc1 foo: &lt;1, 1, 1&gt; bar: &lt;1, 1&gt; buz: &lt;1&gt; foo: 3 bar: 2 buz: 1
  • 30. 例 : ワードカウント Data Map Data Map Data Map Reduce Reduce Data Data foo foo foo bar bar buz 入力文書 : doc1 bar: 2 buz: 1 foo: 3
  • 31. 例 : ワードカウント <ul><li>擬似コード </li></ul>map(string key, string value) { foreach word in value: emit(word, 1); } reduce(string key, vector&lt;int&gt; values) { int result = 0; for (int i = 0; I &lt; values.size(); i++) result += values[i]; emit(key, result); }
  • 32. MapReduce の特徴 <ul><li>データ通信 </li></ul><ul><ul><li>各 Map 処理、 Reduce 処理は完全に並列に実行可能 </li></ul></ul><ul><ul><li>マシンを増やせばその分処理能力が増える </li></ul></ul><ul><li>耐故障性 </li></ul><ul><ul><li>失敗した Map, Reduce 処理は他のノードで再実行される </li></ul></ul><ul><ul><li>遅い Map, Reduce 処理についても同じ </li></ul></ul><ul><li>ローカリティ </li></ul><ul><ul><li>データのある場所で計算を始めれば、ネットワークを使う必要がなくなる </li></ul></ul><ul><ul><li>Moving Computation is Cheaper Than Moving Data </li></ul></ul>
  • 33. 論文に書かれていない、僕が思う MapReduce の短所 <ul><li>Shuffle フェーズで大規模に通信が発生 </li></ul><ul><ul><li>全 Mapper &lt;-&gt; 全 Reducer の通信 </li></ul></ul><ul><ul><li>輻輳が起こって、台数が多いと進まなくなりそう </li></ul></ul><ul><ul><li>数百~数千台程度のクラスタがいくつも有る? </li></ul></ul>Map Map Map Reduce Reduce Shuffle
  • 34. Hadoop Architecture
  • 35. Hadoop の中身 <ul><li>Hadoop Distributed File System (HDFS) </li></ul><ul><ul><li>GFS のクローン </li></ul></ul><ul><ul><li>MapReduce プログラムの入力や出力に使用 </li></ul></ul><ul><li>Hadoop MapReduce </li></ul><ul><ul><li>MapReduce 実現するためのサーバー , ライブラリ </li></ul></ul>
  • 36. Hadoop Distributed File System <ul><li>Master/Slave アーキテクチャ </li></ul><ul><li>ファイルはブロックという単位に分割して保存 </li></ul><ul><li>NameNode </li></ul><ul><ul><li>Master </li></ul></ul><ul><ul><li>ファイルのメタデータ ( パス・権限など ) を管理 </li></ul></ul><ul><li>DataNode </li></ul><ul><ul><li>Slave </li></ul></ul><ul><ul><li>実際のデータ ( ブロックを管理 ) </li></ul></ul>
  • 37. From: http://hadoop.apache.org/core/docs/current/hdfs_design.html
  • 38. データ配置のアルゴリズム (1) <ul><li>あるデータをレプリケーション付きで書き込みたいとき、どのノードに配置するか? </li></ul><ul><ul><li>転送量を少なく </li></ul></ul><ul><ul><li>なるべく安全に ( 異なるラック・異なる DC) </li></ul></ul>
  • 39. レプリケーションのアルゴリズム (2) <ul><li>Hadoop は結構適当にやっている </li></ul><ul><ul><li>1 つ目は必ずローカルに書く </li></ul></ul><ul><ul><li>2 つ目は異なるラックに書く </li></ul></ul><ul><ul><li>3 つ目は同じラックの違うノードに書く </li></ul></ul><ul><ul><li>4 つ目移行はランダム </li></ul></ul>意外とこういう適当なのが 上手く行くの かもしれない
  • 40. GFS に有って HDFS に無いもの <ul><li>Atomic な Append </li></ul><ul><ul><li>HADOOP-1700 </li></ul></ul><ul><ul><ul><li>http://issues.apache.org/jira/browse/HADOOP-1700 </li></ul></ul></ul><ul><li>ロック </li></ul><ul><ul><li>GFS では Chubby と呼ばれる分散ロックサービスを使用している </li></ul></ul><ul><ul><li>Hadoop には Chubby 相当のものがないので、ファイルの上書きは出来ず、新規作成しか出来ない </li></ul></ul>
  • 41. Hadoop MapReduce <ul><li>Master/Slave アーキテクチャ </li></ul><ul><li>JobTracker </li></ul><ul><ul><li>Master </li></ul></ul><ul><ul><li>Job を Task に分割し、 Task を各 TaskTracker に分配 </li></ul></ul><ul><ul><ul><li>Job: MapReduce プログラムの実行単位 </li></ul></ul></ul><ul><ul><ul><li>Task: MapTask, ReduceTask </li></ul></ul></ul><ul><ul><li>全ての Task の進行状況を監視し、死んだり遅れたりした Task は別の TaskTracker で実行させる </li></ul></ul><ul><li>TaskTracker </li></ul><ul><ul><li>Slave </li></ul></ul><ul><ul><li>JobTracker にアサインされた Task を実行 </li></ul></ul><ul><ul><ul><li>実際の計算処理を行う </li></ul></ul></ul>
  • 42. MapReduce Architecture JobTracker TaskTracker
  • 43. Map フェーズ <ul><li>分割された入力を読み込み、 map プログラムを動かす </li></ul><ul><li>Partitioner( 通常は Hash) を使用して宛先を決定 </li></ul><ul><li>バッファサイズが閾値を越えたらメモリ上でソートしてディスクに書き出す </li></ul><ul><li>すべてが終わったらソートされたものをさらに外部マージソート </li></ul>(k, v) Reducer1 宛て Reducer2 宛て
  • 44. Reduce フェーズ <ul><li>Map フェーズの出力をフェッチ </li></ul><ul><li>メモリ上でキー毎にまとめあげる </li></ul><ul><li>Reduce プログラムを動かす </li></ul><ul><li>出力を HDFS に書き出し </li></ul><ul><ul><li>Amazon S3 などにも書き出せる </li></ul></ul>
  • 45. Hadoop HDFS Manual
  • 46. HDFS の操作方法 # ls alias dfsls=&apos;~/hadoop/bin/hadoop dfs -ls‘ # ls -r alias dfslsr=&apos;~/hadoop/bin/hadoop dfs -lsr‘ # rm alias dfsrm=&apos;~/hadoop/bin/hadoop dfs -rm‘ # rm -r alias dfsrmr=&apos;~/hadoop/bin/hadoop dfs -rmr&apos; # cat alias dfscat=&apos;~/hadoop/bin/hadoop dfs -cat‘ # mkdir alias dfsmkdir=&apos;~/hadoop/bin/hadoop dfs -mkdir‘
  • 47. HDFS の操作方法 hadoop@pficore:~$ dfsls Found 5 items /user/hadoop/access-log &lt;r 3&gt; 3003 2008-04-30 00:21 /user/hadoop/hoge &lt;r 3&gt; 2183 2008-04-30 00:32 /user/hadoop/reported &lt;dir&gt; 2008-04-30 00:28 /user/hadoop/wcinput &lt;r 3&gt; 29 2008-05-08 10:17 /user/hadoop/wcoutput &lt;dir&gt; 2008-05-08 11:48
  • 48. HDFS の操作方法 <ul><li>HDFS 上にファイルを転送 </li></ul><ul><li>HDFS 上からファイルを転送 </li></ul>alias dfsput=&apos;~/hadoop/bin/hadoop dfs -put‘ dfsput &lt;local-path&gt; &lt;hdfs-path&gt; alias dfsget=&apos;~/hadoop/bin/hadoop dfs -get‘ dfsget &lt;hdfs-path&gt; &lt;local-path&gt;
  • 49. HDFS の使用方法 hadoop@pficore:~$ dfsls Found 0 items hadoop@pficore:~$ dfsput hoge.txt hoge.txt hadoop@pficore:~$ dfsls Found 1 items /user/hadoop/hoge.txt &lt;r 3&gt; 31 2008-05-08 12:00
  • 50. HDFS の特徴 <ul><li>Master/Slave アーキテクチャなので、 Master に付加が高まると全体のスループットが落ちる </li></ul><ul><ul><li>メタデータ操作を少なくするのがポイント </li></ul></ul><ul><ul><li>出来るだけ”少ない数”の”巨大なファイル”を格納するようにする </li></ul></ul><ul><ul><li>感覚的には数百 M ~数 G 程度のファイルを作るのが良さそう </li></ul></ul>
  • 51. Hadoop Programming on Hadoop with “Java”
  • 52. Skipped for Kernel Hackers  who never want to write Java :-P
  • 53. Hadoop Programming on Hadoop with “ Hadoop Streaming ” (sh, C, C++, Ruby, Python, etc.)
  • 54. HadoopStreaming <ul><li>標準入出力を介して MapReduce 処理を書けるようにするための仕組み </li></ul><ul><ul><li>sh ・ C++ ・ Ruby ・ Python など、任意の言語で MapReduce が可能になる </li></ul></ul><ul><ul><li>http://hadoop.apache.org/core/docs/r0.15.3/streaming.html </li></ul></ul><ul><li>Hadoop Streaming は単純な wrapper ライブラリ </li></ul><ul><ul><li>指定したプログラムの標準入力に &lt;key, value&gt; を渡す </li></ul></ul><ul><ul><li>標準出力から結果を読み込み、それを出力 </li></ul></ul><ul><li>Amazon, Facebook 等でも Streaming 経由で Hadoop が使われているらしい </li></ul><ul><ul><li>http://wiki.apache.org/hadoop/PoweredBy </li></ul></ul>
  • 55. 使い方 <ul><li>実行方法 </li></ul>./bin/hadoop jar contrib/hadoop-0.15.3-streaming.jar -input inputdir [HDFS のパス ] -output outputdir [HDFS のパス ] -mapper map [map プログラムのパス ] -reduce reduce [reduce プログラムのパス ] -inputformat [TextInputFormat | SequenceFileAsTextInputFormat] -outputformat [TextOutputFormat]
  • 56. InputFormat <ul><li>-inputformat オプション </li></ul><ul><li>入力ファイルのフォーマットを指定 </li></ul><ul><ul><li>TextInputFormat (default) </li></ul></ul><ul><ul><ul><li>ファイルの任意の位置で適当に分割される </li></ul></ul></ul><ul><ul><ul><li>&lt;k, v&gt; = &lt; ファイルのオフセット , ファイルの中身 &gt; </li></ul></ul></ul><ul><ul><li>SequenceFileAsTextInputFormat </li></ul></ul><ul><ul><ul><li>1 行 1map 処理 </li></ul></ul></ul><ul><ul><ul><ul><li>“ key value ” という列が並んでいるファイル郡を用意 </li></ul></ul></ul></ul><ul><ul><ul><li>&lt;k, v&gt; = &lt;key, value&gt; (1 行毎 ) </li></ul></ul></ul>
  • 57. <ul><li>TextInputFormat </li></ul><ul><li>SequenceFileAsTextInputFormat </li></ul>Hoge fu ga fafa fdsaf dasfd sak fjadsj fdsaf dsafdsa fdsafdsafdsa fadsfdsa fdsa fsafds &lt;offset, Hoge fu ga fafa fdsaf dasfd sak fjadsj fdsaf &gt; &lt;offset, fdsafdsafdsa fadsfdsa fdsa fsafds&gt; k1 v1 k2 v2 k3 v3 &lt;k1, v1&gt; &lt;k2, v2&gt; &lt;k3, v3&gt; mapper mapper
  • 58. OutputFormat <ul><li>-outputformat オプション </li></ul><ul><li>出力ファイルのフォーマットを指定 </li></ul><ul><ul><li>TextOutputFormat (default) </li></ul></ul><ul><ul><ul><li>“ key value” が 1 行ずつ書き出される </li></ul></ul></ul>
  • 59. Map <ul><li>標準入力を読み込み </li></ul><ul><ul><li>inputFormat によって渡されるものが違う </li></ul></ul><ul><ul><ul><li>TextInputFormat の場合、 value しか渡されない </li></ul></ul></ul><ul><ul><ul><ul><li>内部的には key にファイルの offset が使われているが、意味の無い情報なのでそもそも渡されないようになっている </li></ul></ul></ul></ul><ul><ul><ul><li>SequenceFileAsTextInput の場合、 key と value が 区切りで渡される </li></ul></ul></ul><ul><li>結果を標準出力に書き込み </li></ul><ul><ul><li>key’, value’ を 区切りで 1 行ずつ出力 </li></ul></ul>
  • 60. Reduce <ul><li>標準入力を読み込み </li></ul><ul><ul><li>key val のように 1 行で key と val が渡される </li></ul></ul><ul><ul><li>同じ key については1つの reducer 内で処理される事が保証されている </li></ul></ul><ul><li>標準出力に書き出し </li></ul><ul><ul><li>key, value を 文字区切りで 1 行ずつ書き出し </li></ul></ul>
  • 61. 例 : Ruby によるワードカウント map.rb #!/usr/bin/env ruby while !STDIN.eof? line = STDIN.readline.strip ws = line.split ws.each { |w| puts &amp;quot;#{w} 1“ } end reduce.rb #!/usr/bin/env ruby h = {} while !STDIN.eof? line = STDIN.readline.strip word = line.split(&amp;quot; &amp;quot;)[0] unless h.has_key? word h[word] = 1 else h[word] += 1 end end h.each { |w, c| puts &amp;quot;#{w} #{c}“ } $ ./bin/hadoop jar contrib/hadoop-0.15.3-streaming.jar -input wcinput -output wcoutput -mapper /home/hadoop/kzk/map.rb -reducer /home/hadoop/kzk/reduce.rb -inputformat TextInputFormat -outputformat TextOutputFormat
  • 62. 例 : 出力を圧縮する <ul><li>-jobconf mapred.output.compress=true </li></ul><ul><ul><li>Key, Value それぞれに対して gzip 圧縮がかかる </li></ul></ul><ul><ul><li>読み込む為には特別なオプションは必要なし </li></ul></ul>$ ./bin/hadoop jar contrib/hadoop-0.15.3-streaming.jar -input wcinput -output wcoutput -mapper /home/hadoop/kzk/map.rb -reducer /home/hadoop/kzk/reduce.rb -inputformat TextInputFormat -outputformat TextOutputFormat -jobconf mapred.output.compress=true
  • 63. ためしに書いてみたもの <ul><li>ワードカウント </li></ul><ul><ul><li>Wikipedia 全体 </li></ul></ul><ul><ul><li>中間ファイル圧縮 </li></ul></ul><ul><ul><li>出力ファイル圧縮 </li></ul></ul><ul><li>検索インデックス作成 </li></ul><ul><ul><li>20G </li></ul></ul><ul><ul><li>Lucene を使用 </li></ul></ul><ul><li>全部 I/O ネック </li></ul><ul><li>数十台程度の環境で特に問題なく動いた </li></ul>
  • 64. Enjoy Playing Around Hadoop  Thank you! kzk

×