View
5.511
Download
3
Embed Size (px)
DESCRIPTION
プログラミング生放送勉強会 第4回 @名古屋の発表資料。
Citation preview
MapReduce 初心者が
Hadoop をさわってみた
~もちろん C++ から~
プログラミング生放送勉強会第4回@名古屋2010/06/26(土) You&I
Agenda
1. Hadoopとは
2. MapReduceとは
3. Hadoopの構成
4. なぜHadoopか?
5. Hadoopの環境構築
6. C++からHadoopを使う
7. まとめ
0.自己紹介
• H/N You&I (読み:ユー アンド アイ)
• 出身 生まれも育ちも名古屋市
• 年齢 30代前半
• 本職 商学部出身の職業プログラマ
• 言語 C++, VisualBasic 6.0, 日本語COBOL
• 日記 http://d.hatena.ne.jp/youandi/
• 所属 大規模分散技術勉強会in名古屋
名古屋アジャイル勉強会*
わんくま同盟(名古屋勉強会)*
0.余談
名古屋近郊の勉強会を検索するには、以下のカ
レンダーが便利。
• DSTokaiカレンダー
• ATNDカレンダー検索
• IT勉強会カレンダー検索
1.Hadoopとは
1. Hadoopとは
2. MapReduceとは
3. Hadoopの構成
4. なぜHadoopか?
5. Hadoopの環境構築
6. C++からHadoopを使う
7. まとめ
1.Hadoopとは(1/5)
• Apache Hadoop プロジェクト
http://hadoop.apache.org/
• Hadoopは幾つかのサブプロジェクトで構成
詳細は後ほど3章で説明します。
• HadoopはGoogleが2004年に発表したMapR
educeに関する学術論文を参考に作られてい
ます。
詳細は後ほど2章で説明します。
1.Hadoopとは(2/5)
• アイコンはぞうさんです
• 「ハドゥープ」って読みます
• 「hadoop」は造語です
• Javaで作成されたフレームワークです
• 基本的にLinux上で動作させて利用します
• 夜間バッチ処理等によく利用されています
• 分散処理を行うフレームワークです
1.Hadoopとは(3/5)
• Streaming APIを利用するとJava以外の言語
からも利用できます
• 但し、C++の場合はPipesを利用します
• 直線的なスケーラビリティがあります
• ペタバイト(1024TB)超のデータを扱えます
• 今までやむなく捨てていたデータを活用
1.Hadoopとは(4/5)
• スケーラビリティとデータの整合性について
Hadoop(に限らず、データベース)を深く語る上では、以下の知
識も必要となってくる・・・らしい。
– CAP定理
– ACID
– BASEトランザクション
参考
http://d.hatena.ne.jp/jyukutyo/20090430/1241174854
http://www.publickey1.jp/blog/10/nosqlcap.html
http://www.infoq.com/jp/articles/graph-nosql-neo4j
でも、今日のセッションでは特に気にしない(キリッ
1.Hadoopとは(5/5)
日本語で読める解説書
• O'Reilly - Hadoop
http://www.oreilly.co.jp/books/9784873114392/
http://oreilly.com/catalog/9780596521981/
http://oreilly.com/catalog/0636920010388/
2.MapReduceとは
1. Hadoopとは
2. MapReduceとは
3. Hadoopの構成
4. なぜHadoopか?
5. Hadoopの環境構築
6. C++からHadoopを使う
7. まとめ
2.MapReduceとは(1/5)
Googleの論文
• The Google File System (2003年)
http://labs.google.com/papers/gfs.html
• MapReduce: Simplified Data Processing on Large
Clusters (2004年)
http://labs.google.com/papers/mapreduce.html
• 論文中に出てくる基盤技術
– Google File System
– MapReduce
– BigTable
– Chubby(未だにOSSクローン実装はない)
2.MapReduceとは(2/5)
• Googleのシステムについての解説は書籍にな
っているのでそちらをご覧下さい。
• ISBN:978-4774134321
2.MapReduceとは(3/5)
• MapReduceの処理
Mapタスク
入力データ
Reduceタスク
出力データ
データをKeyとValueの組み合わせに変換
ログデータ等の処理対象データ
Key毎にデータをグループ化
2.MapReduceとは(4/5)
• MapReduceの処理(詳細)
Mapタスク
入力データ
Reduceタスク
出力データ
データをKeyとValueの組み合わせに変換
ログデータ等の処理対象データ
Key毎にデータをグループ化
入力スプリット 入力データをMapタスクの処理単位に分割
Combiner
Partitioner Reduceタスクに入力データを振り分け
Mapタスクの結果が多すぎる場合にデータを集約
2.MapReduceとは(5/5)
細かく説明すると長くなるので続きはWebで!
• CodeZine > Hadoop、hBaseで構築する大規模分散データ処
理システム
http://codezine.jp/article/detail/2448
• Yahoo! Developer Network > Hadoop Tutorial
http://developer.yahoo.com/hadoop/tutorial/module4.html
• Yahoo! JAPAN TechBlog > Hadoopで、かんたん分散処理
http://techblog.yahoo.co.jp/cat207/cat209/hadoop/
• Yahoo! JAPAN TechBlog > Hadoopを使いこなす(1)
http://techblog.yahoo.co.jp/cat207/cat209/_footnote/
• Hadoop入門
http://www.slideshare.net/pfi/hadoop-2525724
3.Hadoopの構成
1. Hadoopとは
2. MapReduceとは
3. Hadoopの構成
4. なぜHadoopか?
5. Hadoopの環境構築
6. C++からHadoopを使う
7. まとめ
3.Hadoopの構成(1/3)
Googleシステム構成 Hadoop
Google File System
(GFS)
Hadoop Distributed
File System(HDFS)
MapRedudeHadoop
MapReduce
BigTable HBase
• Googleシステム構成とHadoopの比較
3.Hadoopの構成(2/3)
• Hadoopのサブプロジェクト構成
HDFS
(Hadoop Distributed File System)
MapReduce
(Job Scheduling - Raw Processing)
HBase
(RealTime Query)
Chukwa
(Displaying, Monitoring, Analyzing Logs)
Pig
(Data Flow)
Hive
(Batch SQL)
ZooK
eeper
(Coord
ination)
Avro
(Serializ
ation)
3.Hadoopの構成(3/3)
• Hadoopのクラスタ構成
Data Node
Client
Name Node
Data Node Data Node
Job Tracker
4.なぜHadoopか?
1. Hadoopとは
2. MapReduceとは
3. Hadoopの構成
4. なぜHadoopか?
5. Hadoopの環境構築
6. C++からHadoopを使う
7. まとめ
4.なぜHadoopか?(1/2)
• HBaseで高速にデータ書き込み可能
• HDFSにより大容量データも格納可能
• MapReduce他で高速にデータ処理可能
• 容易にスケールアップ可能
安西先生!タイムドリブンなシミュレータのデータ処理を速くしたいです!
4.なぜHadoopか?(2/2)
Hadoopの活用事例
• Yahoo!
• Yahoo! JAPAN
• クックパッド
資料を公開いたしました!(クックパッドの裏側見せます in 大
阪&名古屋)
http://techlife.cookpad.com/2010/04/14/urapad_oosakanag
oya/
みてわかるクラウドマガジンvol.1
http://itpro.nikkeibp.co.jp/article/MAG/20100402/346577/
5.Hadoopの環境構築
1. Hadoopとは
2. MapReduceとは
3. Hadoopの構成
4. なぜHadoopか?
5. Hadoopの環境構築
6. C++からHadoopを使う
7. まとめ
5.Hadoopの環境構築(1/2)
• 用意するモノ– Linuxの環境
– Java Runtime Environment
– Hadoop
※Windows + Cygwinでもいけるけど、C++から
利用する場合は、Linux環境が必要
5.Hadoopの環境構築(2/2)
細かく説明すると長くなるので続きはWebで!
• きりんさん日記 > 1台構成のHadoopを30分で試してみ
る(CentOS + Cloudera)
http://saburi380.blogspot.com/2009/11/301hadoopc
entos-cloudera.html
• Cloudera社のサイトでは、各種Linuxディストリビューシ
ョン向けのインストールパッケージを提供しています
http://www.cloudera.com/
6.C++からHadoopを使う
1. Hadoopとは
2. MapReduceとは
3. Hadoopの構成
4. なぜHadoopか?
5. Hadoopの環境構築
6. C++からHadoopを使う
7. まとめ
6.C++からHadoopを使う(1/10)
• C++からHadoopを使うには– Hadoop Pipes
– Hadoop Streaming API
– Hadoop の Apache Thrift API
• 今回はベーシックにHadoop Pipesで
• フォルダ構成
hadoop-0.20.2
/c++
/Linux-i386-32
/Linux-amd64-64
6.C++からHadoopを使う(2/10)
• (参考)Hadoop Streaming APIをRubyから利
用する場合の呼び出し・・・アレ?
% hadoop ¥
jar $HADOOP_INSTALL/contrib/streaming/
hadoop-*-streaming.jar ¥
-input input.txt ¥
-output output ¥
-mapper my_mapper.rb ¥
-reducer my_reducer.rb
6.C++からHadoopを使う(3/10)
• Hadoop Pipesのクラス構成
TaskContextMapContext
ReduceContext
Closable
Mapper
Reducer
Partitioner
RecordReader
RecordWriter
Factory TemplateFactory
JobConf
6.C++からHadoopを使う(4/10)
• 単純なサンプル(1行=1レコードの固定長気象データ)
#include <algorithm>
#include <limits>
#include <string>
#include "hadoop/Pipes.hh"
#include "hadoop/TemplateFactory.hh"
#include "hadoop/StringUtils.hh"
using namespace HadoopPipes;
using namespace HadoopUtils;
6.C++からHadoopを使う(5/10)
class MyMapper : public Mapper {
public:
MyMapper( TaskContext& context ) { }
virtual void map( MapContext& context ) {
std::string line = context.getInputValue();
std::string year = line.substr( 15, 4 );
std::string airTemp = line.substr( 87, 5 );
context.emit( year, airTemp );
}
};
6.C++からHadoopを使う(6/10)
class MyReducer : public Reducer {
public:
MyReducer( TaskContext& context ) { }
virtual void reduce( ReduceContext& context ) {
int maxValue = INT_MIN;
while ( context.nextValue() ) {
maxValue
= std::max( maxValue, toInt( context.getInputValue() ) );
}
context.emit( context.getInputKey(), toString( maxValue ) );
}
};
6.C++からHadoopを使う(7/10)
int main( int argc, char* argv[] )
{
return runTask(
TemplateFactory< MyMapper, MyReducer >() );
}
6.C++からHadoopを使う(8/10)
• Makefile(32bit環境向け)
CC=g++
CPPFLAGS= ¥
-m32 ¥
-I$(HADOOP_INSTALL)/c++/$(PLATFORM)/include
max_temp: max_temp.cpp
$(CC) $(CPPFLAGS) $< -Wall ¥
-L$(HADOOP_INSTALL)/c++/$(PLATFORM)/lib ¥
-lhadooppipes -lhadooputils -lpthread ¥
-g -O2 -o $@
6.C++からHadoopを使う(9/10)
• Hadoop PipesでのC++プログラムの呼び出し
% hadoop pipes ¥
-D hadoop.pipes.java.recordreader=true ¥
-D hadoop.pipes.java.recordwriter=true ¥
-input input.txt ¥
-output output ¥
-program max_temp
6.C++からHadoopを使う(10/10)
• Hadoopを使うと言っても、実の所はHadoopか
ら利用されるプログラムを準備する事
• 実は今説明したサンプルは、MapReduceのI/F
を利用するもの
• HBaseをC++から利用するには、REST APIま
たはApache Thrift APIを使う
• Thrift APIはちょっと調べきれませんでした・・・
• JavaのI/Fと比較してRESTやThriftを経由する
とパフォーマンスは落ちるらしい
7.まとめ
1. Hadoopとは
2. MapReduceとは
3. Hadoopの構成
4. なぜHadoopか?
5. Hadoopの環境構築
6. C++からHadoopを使う
7. まとめ
7.まとめ
• HadoopはHDFSというファイルシステムとMap
Reduceを基盤としたサブプロジェクトの集まり
• Java以外の言語からも利用できる
• C++でも簡単にI/Fを実装できる
• この機会に名古屋近郊に在住でもっと深く勉強
したいお方は、是非大名古屋にご参加を!
• おっと、今日はここまでにしておこうか。
興味を持って頂いたなら色々と試してみてね!
Let’s Hadoop!