Hadoopとは - redmine.syonbori.info¤ª田-Hadoop... · MapReduceの挙動まとめ...

Preview:

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では– システムの安全性

• スレーブがダウンした場合

– 障害発生時にもデータは損失されない• 複製によるデータ保持• 障害検知時の自動再配置