Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
Hadoopとは
• Hadoopの二本柱– 分散ファイルシステムHDFS(Hadoop Distributed File System)– 分散プログラミングモデルMapReduce
• Hadoopの目的– 大規模ファイル処理
• 格納,加工• ペタバイト規模• 複数計算機の協調動作
– スケーラブルシステム• 数百~数千台規模
– Key-Value store
Node Node Node Node
HDFS
MapReduce
Hadoopとは
• 分散コンピューティング環境• 基本的にマスタースレーブモデル• 構成
– Namenode(HDFS)• HDFSの管理を行う
– Datanode(HDFS)• HDFSの実データ保持,応答
– Jobtracker(MapReduce)• MapReduceのスケジューリング
– Tasktracker(MapReduce)• MapReduceの実処理
2
Node(マスタ)
Node(スレーブ)
Node(スレーブ)
Node(スレーブ)
HDFS
MapReduceJobtracker
Tasktracker
Tasktracker
Tasktracker
Namenode
Datanode
Datanode
Datanode
HDFSの仕組み
• マスタースレーブモデル– マスター:全体を管理するNamenode
– スレーブ:ファイルを保持するDatanode
• ファイルの分割と多重化– ファイルはファイルブロックに分割,複数ノードに配置
• 読み出し効率化
– ファイルブロックは複製され,複数ノードに配置• 読み出し効率化
• 障害耐性
– ファイル読み出しに最適化した構成
f1 f2
file
HDFSにおけるファイルの搭載
Namenode
DatanodeDatanodeSlave Node
Slave NodeDatanode
nodeselection
negotiationfile
Datanode Datanode Datanode
Selected node
f1 f2
split
duplicate duplicate
f1 f2
HDFSにおけるファイルの読み出し
Namenode
DatanodeDatanodeSlave Node
Slave NodeDatanode
nodeselection
negotiationfile
Datanode Datanode Datanode
Selected node
f1 f2f1 f2
negotiation
f1 f2
transfer(file pieces)
merge
HDFSの障害耐性
• 障害発生時にもデータは損失されない
–複製によるデータ保持
–障害検知時の自動再配置
Datanode Datanode Datanode
A1
B2
A2
B1 B2
A1 A2
B1
A1
B2
HDFSの特徴
• 高速アクセス– 分割数(複製数)だけアクセス速度増
• スケーラビリティ,運用の省力化– 大容量ストレージ
• Datanodeの台数に応じた容量を持つ
– Datanodeを追加するだけで規模が大きくなる• コマンド一つでDatanodeとしてHDFSに参加できる
– 障害発生ノードにただちに対応しなくてよい• 障害耐性により,一部に障害が発生しても運用可能• 後日除去し,新たなノードを追加すればよい
– 障害ノードのデータ復旧はしなくてよい
MapReduceの仕組み
• 入力はファイル断片がばらばらに与えられる
– HDFSのファイルブロック
• 一つずつ入力を加工する(Map)
• ソートして順序を整理する(Shuffle)
• ルールに従ってまとめ上げる(Reduce)
M
a
p
S
h
u
f
f
l
e
R
e
d
u
c
e
入力ファイル
出力ファイル
MapReduceの特徴
• Key-Value store
–常にKey,Valueのペアで1レコードとして扱う
• HDFS上のファイルからの入力
– Key:ファイル上の行番号
– Value:その行のテキスト列
Value
Key
Value
Key
Value
Key
MapReduceの例
map key:aa value:1
map key:bbb value:1
map key:aa value:1
shuffle
key:aa value:1 key:bbb value:1key:aa value:1
reduce reduce
key:aa value:2 key:bbb value:1
入力テキストファイル:aabbbaa
出力テキストファイル:aa 2bbb 1
key:1 value:aa
key:2 value:bbb
key:3 value:aa
入力
出力 出力
MapReduceの挙動まとめ
• Map(主なプログラマー定義部分)– Key-Valueペアを入力から受け取る– 加工したKey-ValueペアをShuffleに渡す
• Shuffle– Key-Valueペアを同一Key毎にまとめる– Keyでソートする– まとめたKey-Values(複数value)をReduceに渡す
• Reduce(主なプログラマー定義部分)– 同一KeyでまとめられたValue’s’を受け取る– Valuesをまとめて加工する– Key-Valueペアとして出力する
※ Shuffleも定義可能だが,通常は必要でない※ Map,Reduceともに複数key-valueペア出力可能
MapReduceの特徴
• 並列処理による効率性– 各Map処理は独立
– Mapは参加する計算機の台数だけ高速化可能
– Reduceの高速化はアルゴリズム次第• Reduceは分割数だけ出力ファイルが増える
– 日付毎解析などなら許容できるだろうが…
• 本質的に分割不可能な部分は高速化できない– 物理シミュレーションなどは全体が1step完走しないと次に進めない
– ほとんどすべての並列処理系に共通の問題
• HDFSとの連携– ファイルブロックを持つDatanode上で実行できる
• 入力データを集める際に効率的(局所性)
Map処理
• public static class CountMapper extendsMapper<LongWritable, Text, Text, IntWritable>
{protected void map(LongWritable key, Text value,
Context context)throws IOException,
InterruptedException {context.write(value, new IntWritable(1));
}}
行番号 テキスト
入力 key:行番号 value:テキスト出力 key:テキスト value:1
Reduce処理
• public static class CountReducer extendsReducer<Text, IntWritable, Text, IntWritable>
{protected void reduce(Text key, Iterable<IntWritable> values,
Context context) throws IOException,
InterruptedException {int count = 0;for (IntWritable i : values)
count += i.get();context.write(key, new IntWritable(count));
}}
イテレーションによる要素の取り出し
入力 key:テキスト values:1の列挙出力 key:テキスト value:上valuesの足し合わせ
同一keyでまとめられたものテキスト
まとめ
• Hadoopクラスタはマスタースレーブモデル– スレーブを追加することでスケールする
• HDFS– ファイルは分割される
• ファイルブロック
– ファイルは複製される• 多重化による障害対策
• MapReduce– MapとReduce
• 通常記述する部分• Mapは独立した加工• Reduceはまとめあげる加工
– key-valueモデル• MapReduceの入力形式• データ構造に注意
– key-value組毎にMap処理が行えるよう
15
Node(マスタ)
Node(スレーブ)
Node(スレーブ)
Node(スレーブ)
HDFS
MapReduceJob
trackerTask
trackerTask
trackerTask
tracker
Namenode
Datanode
Datanode
Datanode
Q&A質疑応答
APPENDIXおそらくこのスライドに含めるべきではないものを一時保存する領域
JobConfに与えるべきもの
InputFormat
OutputFormat
Mapper
Reducer
InputFormat<K,V>
OutputFormat<K,V>Mapper<K1,V1,K2,V2>
Interface
InterfaceInterface
Your Mapper
Class
MapReduceBase
Class
Reducer<K1,V1,K2,V2>
Interface
Your ReducerClass
MapReduceBase
Class
InputFormatJobConf.setInputFormat(Class<? extends InputFormat>)
InputFormat<K,V> FileInputFormat<K,V> TextInputFormat
KeyValueTextInputFormatDBInputFormat<T>
Interface abstract class class
class
class
FileInputFormat<K,V> 継承型を利用する場合の例
conf.setInputFormat(TextInputFormat.class);FileInputFormat.setInputPaths(conf,new Path(“input”));
DBInputFormat<T> を利用する場合
Hadoopパッケージ内src/example下のDBCountPageView.javaの例を参照
<LongWritable,Text>
<Text,Text><LongWritable,T extends DBWritable>
<K,V>
Mapperの総称型の制約
Mapper<K1,V1,K2,V2>
Your Mapper
Class
MapReduceBase
Class
Interface
Mapper<K,V,K2,V2>
•InputFormat<K,V>と同一
Mapper<K,V,k,v>
•Reducer<k,v,k2,v2>と同一•JobConfに指定されている場合
•MapOutputKeyClassのもの•MapOutputValueClassのもの
OutputFormatJobConf.setInputFormat(Class<? extends OutputFormat>)
OutputFormat<K,V> FileOutputFormat<K,V> TextOutputFormat<K,V>
DBOutputFormat<T>
Interface abstract class class
class
FileOutputFormat<K,V> 継承型を利用する場合の例
conf.setOutputFormat(TextOutputFormat.class);FileOutputFormat.setOutputPath(conf, new Path(“output”));
DBOutputFormat<T> を利用する場合
Hadoopパッケージ内src/example下のDBCountPageView.javaの例を参照
Reducerの総称型の制約
Reducer<K1,V1,K2,V2>
Your Reducer
Class
MapReduceBase
Class
Interface
Reducer<K,V,K2,V2>
•Mapper<K1,V1,K,V>と同一
Reducer<K,V,k,v>
•OutputFormat<k,v>と同一(指定されていれば)
•JobConfに指定されている場合•OutputKeyClassのもの•OutputValueClassのもの
HDFSの障害態勢
• 「一般に」クラスタが大きくなると障害発生確率は上がる– 1台が安定動作している確率pに対してn台クラスタが安定動作している確率はpn
• 99.9%で障害なく動作する(障害発生確率0.1%)サーバ100台で構成するクラスタは9.5%の確率で障害が発生する
– 大規模クラスタではいつもどこかで障害が起きていると考えるべき
• 求められる障害態勢– 障害発生時に全体がダウンしない– 障害発生時にデータが損失しない
• Hadoopでは– システムの安全性
• スレーブがダウンした場合
– 障害発生時にもデータは損失されない• 複製によるデータ保持• 障害検知時の自動再配置