Hadoop
-
Upload
naoyuki-kakuda -
Category
Technology
-
view
20.713 -
download
1
description
Transcript of Hadoop
Hadoopの紹介角田 直行 <[email protected]>
Agenda
• Hadoopとは• MapReduceとは• Hadoopの動かし方• 最も簡単な実行• 複数マシンで実行• 独自Mapper、Reducerを書く
Hadoopとは
• GoogleのMapReduceやGFS(Google File System)をDoug Cutting氏がJavaで実装したオープンソースプロダクト
• Apache Luceneのサブプロジェクト• Doug Cutting氏の子供が付けたぬいぐるみの名前
かわいくない・・・
Doug Cutting氏 三部作
• Lucene - 全文検索ライブラリ• Nutch - Luceneを使ったWeb検索エンジン + Webクローラ
• Hadoop - Nutch開発から生まれたプロダクト
Hadoopとは
• 何気にYahoo!が多く関わっている• Doug Cutting氏、他開発者の多くが中の人• つーか、Yahoo!がスポンサー• Hadoopベースの「Pig」という研究プロジェクトがある
もっとかわいくない・・・
MapReduceとは
• GoogleのJeffrey Dean氏らによって開発された分散処理のためのプログラミングモデル
• 大量のデータを素早く処理するのに、複数CPUを積んだマシン1台で処理するのではなく、沢山のマシンを使って処理するアプローチを用いた技術
http://labs.google.com/papers/mapreduce.htmlhttp://www.radiumsoftware.com/0608.html#060831
MapReduceとは
• C++で書かれている• MapReduceを利用したプログラムは5000以上(2006年7月時点)
• 実際は、MapReduceを簡単に扱えるようにしたスクリプト言語「Sawzall」(Rob Pike氏作)を使っているらしい
• 本番サーバでガンガンに使えるらしい(優先タスク管理が出来ている)
MapReduceとは
• Mapタスク(フィルタ)• 膨大な量の元データを分解し、必要な情報を抽出し、有用な形へと変換し出力する
• Reduceタスク(アグリゲータ)• 抽出された情報を集約し、一塊のデータとして出力する
http://www.radiumsoftware.com/0608.html#060831
MapReduceとは
http://d.hatena.ne.jp/YuichiTanaka/20060923
Plaggerを使っていると、MapReduceがどんなものかが掴めるかもしれない?
GoogleでのMapReduce利用例
• 分散Grep• 分散ソート• 逆リンク解析• アクセスログ解析
• 検索インデックス構築• 文書クラスタ解析• 機械学習• 統計機械翻訳
・・・ etc
Google File Systemとは
• Linux上に構築される分散ファイルシステム• マスターサーバ1つ、チャンクサーバいっぱい• ファイル操作は読みや追記が多く、書き換えが少ないという前提の元に最適化されている
• 冗長性が高い(壊れたら自動復旧)
http://dev.ariel-networks.com/column/tech/google_file_system
最も簡単な実行
ダウンロード、解凍、実行
$ 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
$
色々な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
複数マシンで実行
準備するもの
•マシン複数台(mac01, mac02, mac03)• mac01をマスターとする•mac01, mac02, mac03をスレーブとする• Java 1.5以上• SSHサーバ稼働
ディレクトリレイアウト
/Users/kaku/hadoop-deployed/hadoop-0.13.0
/Users/kaku/hadoop-deployed/filesystem
/Users/kaku/hadoop-deployed
hadoop環境ルートディレクトリ
hadoopインストールディレクトリ
HDFSルートディレクトリ
※全マシン、上記の通りに配置する
用語説明
•Namenode - DFS上でのマスタ、1つ• Datanode - DFS上でのスレーブ、沢山• Jobtracker - MR上でのマスタ、1つ• Tasktracker - MR上でのスレーブ、沢山
SSH公開鍵登録
•mac01で鍵作成
•mac01~03に登録$ ssh-keygen -t rsa
$ vi ~/.ssh/authorized_keys
スレーブ登録
$ cd ~/hadoop-deployed/hadoop-0.13.0
$ cat conf/slaves
localhost
$ vi conf/slaves
$ cat conf/slaves
mac01
mac02
mac03
$
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
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のホスト名:ポート
スレーブマシン数の倍数より大きい素数がいいらしい
スレーブマシン数の倍数に近い素数がいいらしい
<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>
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/
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
$
起動
$ 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
$
ポート確認
$ 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)
$
http://mac01:50060/tasktracker.jsp
MapReduce実行中
停止
$ 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
$
独自Mapper、Reducerを書く
例:単語カウント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
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);
}
}
}
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));
}
}
Eclipse プラグイン
• IBM alphaWorksにて公開している、Hadoopアプリケーション支援ツール
• 現状は、ウィザードでMapper、Reducerのスケルトンを作ってくれるだけ
• 今後に期待
http://www.alphaworks.ibm.com/tech/mapreducetools
最後に
情報少な杉
• オフィシャルのドキュメント少ない• 検索エンジンも全然ヒットしない• 誰もブログ書いてない• 韓国、中国にそこそこ情報あり(翻訳ツール必須)• 自分も発表した以上のことは全然分かりません><
ご清聴ありがとうございました