Hadoop

38
Hadoopの紹介 角田 直行 <[email protected]>

description

Yahoo!でも使われているMapReduceのオープンソース版「Apache Hadoop」の紹介と動かし方

Transcript of Hadoop

Page 1: Hadoop

Hadoopの紹介角田 直行 <[email protected]>

Page 2: Hadoop

Agenda

• Hadoopとは• MapReduceとは• Hadoopの動かし方• 最も簡単な実行• 複数マシンで実行• 独自Mapper、Reducerを書く

Page 3: Hadoop

Hadoopとは

• GoogleのMapReduceやGFS(Google File System)をDoug Cutting氏がJavaで実装したオープンソースプロダクト

• Apache Luceneのサブプロジェクト• Doug Cutting氏の子供が付けたぬいぐるみの名前

かわいくない・・・

Page 4: Hadoop

Doug Cutting氏 三部作

• Lucene - 全文検索ライブラリ• Nutch - Luceneを使ったWeb検索エンジン + Webクローラ

• Hadoop - Nutch開発から生まれたプロダクト

Page 5: Hadoop

Hadoopとは

• 何気にYahoo!が多く関わっている• Doug Cutting氏、他開発者の多くが中の人• つーか、Yahoo!がスポンサー• Hadoopベースの「Pig」という研究プロジェクトがある

もっとかわいくない・・・

Page 6: Hadoop

MapReduceとは

• GoogleのJeffrey Dean氏らによって開発された分散処理のためのプログラミングモデル

• 大量のデータを素早く処理するのに、複数CPUを積んだマシン1台で処理するのではなく、沢山のマシンを使って処理するアプローチを用いた技術

http://labs.google.com/papers/mapreduce.htmlhttp://www.radiumsoftware.com/0608.html#060831

Page 7: Hadoop

MapReduceとは

• C++で書かれている• MapReduceを利用したプログラムは5000以上(2006年7月時点)

• 実際は、MapReduceを簡単に扱えるようにしたスクリプト言語「Sawzall」(Rob Pike氏作)を使っているらしい

• 本番サーバでガンガンに使えるらしい(優先タスク管理が出来ている)

Page 8: Hadoop

MapReduceとは

• Mapタスク(フィルタ)• 膨大な量の元データを分解し、必要な情報を抽出し、有用な形へと変換し出力する

• Reduceタスク(アグリゲータ)• 抽出された情報を集約し、一塊のデータとして出力する

http://www.radiumsoftware.com/0608.html#060831

Page 10: Hadoop

GoogleでのMapReduce利用例

• 分散Grep• 分散ソート• 逆リンク解析• アクセスログ解析

• 検索インデックス構築• 文書クラスタ解析• 機械学習• 統計機械翻訳

・・・ etc

Page 11: Hadoop

Google File Systemとは

• Linux上に構築される分散ファイルシステム• マスターサーバ1つ、チャンクサーバいっぱい• ファイル操作は読みや追記が多く、書き換えが少ないという前提の元に最適化されている

• 冗長性が高い(壊れたら自動復旧)

http://dev.ariel-networks.com/column/tech/google_file_system

Page 12: Hadoop

最も簡単な実行

Page 13: Hadoop

ダウンロード、解凍、実行

$ env | grep JAVA

JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home

$ java -version

java -versionjava version "1.5.0_07"Java(TM) 2 Runtime Environment, Standard Edition

(build 1.5.0_07-154)Java HotSpot(TM) Client VM (build 1.5.0_07-87, mixed mode, sharing)

$ curl -O http://www.apache.org/dist/lucene/hadoop/stable/hadoop-0.13.0.tar.gz

$ tar zxvf hadoop-0.13.0.tar.gz

$ cd hadoop-0.13.0

$ bin/hadoop version

Hadoop 0.13.0Subversion https://svn.apache.org/repos/asf/lucene/hadoop/branches/

branch-0.13 -r 544207Compiled by cutting on Mon Jun 4 12:01:18 PDT 2007

$

Page 14: Hadoop

色々なExample

$ bin/hadoop jar hadoop-0.13.0-examples.jar wordcount <入力先Dir> <出力先Dir>

入力先Dir以下のファイルの単語を数え上げる

$ bin/hadoop jar hadoop-0.13.0-examples.jar pi <Map数> <1MapあたりのSample数>

円周率計算

$ bin/hadoop jar hadoop-0.13.0-examples.jar grep <入力先Dir> <出力先Dir> <regex>

Grep

Page 15: Hadoop

複数マシンで実行

Page 16: Hadoop

準備するもの

•マシン複数台(mac01, mac02, mac03)• mac01をマスターとする•mac01, mac02, mac03をスレーブとする• Java 1.5以上• SSHサーバ稼働

Page 17: Hadoop

ディレクトリレイアウト

/Users/kaku/hadoop-deployed/hadoop-0.13.0

/Users/kaku/hadoop-deployed/filesystem

/Users/kaku/hadoop-deployed

hadoop環境ルートディレクトリ

hadoopインストールディレクトリ

HDFSルートディレクトリ

※全マシン、上記の通りに配置する

Page 18: Hadoop

用語説明

•Namenode - DFS上でのマスタ、1つ• Datanode - DFS上でのスレーブ、沢山• Jobtracker - MR上でのマスタ、1つ• Tasktracker - MR上でのスレーブ、沢山

Page 19: Hadoop

SSH公開鍵登録

•mac01で鍵作成

•mac01~03に登録$ ssh-keygen -t rsa

$ vi ~/.ssh/authorized_keys

Page 20: Hadoop

スレーブ登録

$ cd ~/hadoop-deployed/hadoop-0.13.0

$ cat conf/slaves

localhost

$ vi conf/slaves

$ cat conf/slaves

mac01

mac02

mac03

$

Page 21: Hadoop

conf/hadoop-env.sh

export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/

CurrentJDK/Home

export HADOOP_HOME=/Users/kaku/hadoop-deployed/hadoop-0.13.0

Page 22: Hadoop

conf/hadoop-site.xml<configuration>

<property>

<name>fs.default.name</name>

<value>mac01:9000</value>

</property>

<property>

<name>mapred.job.tracker</name>

<value>mac01:9001</value>

</property>

<property>

<name>mapred.map.tasks</name>

<value>17</value>

</property>

<property>

<name>mapred.reduce.tasks</name>

<value>7</value>

</property>

Namenodeのホスト名:ポート

Jobtrackerのホスト名:ポート

スレーブマシン数の倍数より大きい素数がいいらしい

スレーブマシン数の倍数に近い素数がいいらしい

Page 23: Hadoop

<property>

<name>dfs.name.dir</name>

<value>/Users/kaku/hadoop-deployed/filesystem/name</value>

</property>

<property>

<name>dfs.data.dir</name>

<value>/Users/kaku/hadoop-deployed/filesystem/data</value>

</property>

<property>

<name>mapred.system.dir</name>

<value>/Users/kaku/hadoop-deployed/filesystem/mapred/system</value>

</property>

<property>

<name>mapred.local.dir</name>

<value>/Users/kaku/hadoop-deployed/filesystem/mapred/local</value>

</property>

<property>

<name>dfs.replication</name>

<value>2</value>

</property>

</configuration>

Page 24: Hadoop

hadoopをリモートコピー

$ rsync -avrz -e ssh ~/hadoop-deployed/hadoop-0.13.0/ mac02:~/hadoop-deployed/

hadoop-0.13.0/

$ rsync -avrz -e ssh ~/hadoop-deployed/hadoop-0.13.0/ mac03:~/hadoop-deployed/

hadoop-0.13.0/

Page 25: Hadoop

Namenodeの初期化$ cd ~/hadoop-deployed/hadoop-0.13.0

$ bin/hadoop namenode -format

07/07/21 05:26:52 INFO dfs.Storage: Storage directory /Users/kaku/hadoop-deployed/

filesystem/name has been successfully formatted.

$ find ~/hadoop-deployed/filesystem

/Users/kaku/hadoop-deployed/filesystem

/Users/kaku/hadoop-deployed/filesystem/name

/Users/kaku/hadoop-deployed/filesystem/name/current

/Users/kaku/hadoop-deployed/filesystem/name/current/edits

/Users/kaku/hadoop-deployed/filesystem/name/current/fsimage

/Users/kaku/hadoop-deployed/filesystem/name/current/fstime

/Users/kaku/hadoop-deployed/filesystem/name/current/VERSION

/Users/kaku/hadoop-deployed/filesystem/name/image

/Users/kaku/hadoop-deployed/filesystem/name/image/fsimage

$

Page 26: Hadoop

起動

$ cd ~/hadoop-deployed/hadoop-0.13.0

$ cat bin/start-all.sh

starting namenode, logging to /Users/kaku/hadoop-deployed/hadoop-0.13.0/logs/hadoop-

kaku-namenode-mac01.out

macbook.local: starting datanode, logging to /Users/kaku/hadoop-deployed/hadoop-0.13.0/

logs/hadoop-kaku-datanode-mac01.out

localhost: starting secondarynamenode, logging to /Users/kaku/hadoop-deployed/

hadoop-0.13.0/logs/hadoop-kaku-secondarynamenode-mac01.out

starting jobtracker, logging to /Users/kaku/hadoop-deployed/hadoop-0.13.0/logs/hadoop-

kaku-jobtracker-mac01.out

macbook.local: starting tasktracker, logging to /Users/kaku/hadoop-deployed/hadoop-0.13.0/

logs/hadoop-kaku-tasktracker-mac01.out

$

Page 27: Hadoop

ポート確認

$ lsof -i:9000

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

java 1274 kaku 8u IPv6 0x3967a24 0t0 TCP [::127.0.0.1]:cslistener (LISTEN)

$ lsof -i:9001

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

java 1432 kaku 9u IPv6 0x5bdd7f8 0t0 TCP [::127.0.0.1]:etlservicemgr (LISTEN)

$

Page 29: Hadoop

MapReduce実行中

Page 30: Hadoop

停止

$ cd ~/hadoop-deployed/hadoop-0.13.0

$ cat bin/stop-all.sh

stopping jobtracker

mac01: stopping tasktracker

stopping namenode

mac01: stopping datanode

localhost: stopping secondarynamenode

$

Page 31: Hadoop

独自Mapper、Reducerを書く

Page 32: Hadoop

例:単語カウントJava Standard Edition and Java Enterprise Edition

<Java,1> <Standard,1> <Edition,1> <and,1>

<Java,1> <Enterprise,1> <Edition,1>

<Java,2> <Standard,1> <Edition,2>

<and,1> <Enterprise,1>

Mapper

Reducer

Page 33: Hadoop

Mapper

public class WordCountMapper extends MapReduceBase implements Mapper {

private static final IntWritable ONE = new IntWritable(1);

public void map(WritableComparable key, Writable value,

OutputCollector output, Reporter reporter) throws IOException {

StringTokenizer itr = new StringTokenizer(value.toString());

while (itr.hasMoreTokens()) {

output.collect(new Text(itr.nextToken()), ONE);

}

}

}

Page 34: Hadoop

Reducer

public class WordCountReducer extends MapReduceBase implements Reducer {

public void reduce(WritableComparable key, Iterator values,

OutputCollector output, Reporter reporter) throws IOException {

int sum = 0;

while (values.hasNext()) {

sum += ((IntWritable) values.next()).get();

}

output.collect(key, new IntWritable(sum));

}

}

Page 35: Hadoop

Eclipse プラグイン

• IBM alphaWorksにて公開している、Hadoopアプリケーション支援ツール

• 現状は、ウィザードでMapper、Reducerのスケルトンを作ってくれるだけ

• 今後に期待

http://www.alphaworks.ibm.com/tech/mapreducetools

Page 36: Hadoop

最後に

Page 37: Hadoop

情報少な杉

• オフィシャルのドキュメント少ない• 検索エンジンも全然ヒットしない• 誰もブログ書いてない• 韓国、中国にそこそこ情報あり(翻訳ツール必須)• 自分も発表した以上のことは全然分かりません><

Page 38: Hadoop

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