28
1 OSC 2011 Tokyo/Spring Hadoop 入門++ オープンソースで作る分散処理基盤 2011年3月5日 山下 真一

OSC2011 Tokyo/Spring Hadoop入門

Embed Size (px)

DESCRIPTION

2011年3月5日 早稲田大学で開催されたオープンソースカンファレンス 2011 Tokyo/Springで発表した資料です。

Citation preview

Page 1: OSC2011 Tokyo/Spring Hadoop入門

1

OSC 2011 Tokyo/Spring

Hadoop 入門++オープンソースで作る分散処理基盤

2011年3月5日山下 真一

Page 2: OSC2011 Tokyo/Spring Hadoop入門

2

自己紹介

● 山下 真一 (やました しんいち)– 普通のサラリーマン

● 最近興味を持ってること– Android– 新しいApache Hadoop MapReduce

– ロングライド など● twitter : @ymstsn1

Page 3: OSC2011 Tokyo/Spring Hadoop入門

3

本日の発表内容

Hadoopの基礎知識

Hadoopの使い方

Hadoopのポイント

Hadoopとは何かを説明します

Hadoopでの動作させるアプリケーションについて説明します

Hadoopを利用する上でのポイントを説明します

Page 4: OSC2011 Tokyo/Spring Hadoop入門

4

Hadoopの基礎知識

Page 5: OSC2011 Tokyo/Spring Hadoop入門

5

Hadoopとは?

分散処理フレームワーク

分散処理ファイルシステム

MapReduce

HDFS

Google社が発表したGFS(Google File System)とMapReduce論文を米国Yahoo社のエンジニアが中心となって実装したもの

Hadoop : http://hadoop.apache.org/

Page 6: OSC2011 Tokyo/Spring Hadoop入門

6

Hadoopの特徴

● バッチ処理において威力を発揮するHadoopクラスタ

大量のデータ

(GB以上)

スケーラビリティ(CPU・メモリ・ディスクIO)

コモディティ(ソフトウェア・ハードウェア)

数時間~数日以上掛かる処理を数分~数十分で処理させる

Hadoopに関する注意点(1) Hadoop ≠ RDBMS(2) オンライン処理には不向き(3) 少量データの扱いに不向き

スモールスタートが可能(サーバの増設が容易)

Page 7: OSC2011 Tokyo/Spring Hadoop入門

7

Hadoopの使い道

大量のデータを以下のように扱います● 集計 (例: アクセス回数の集計)

– ランキング、検索精度のチェック● 抽出 (例: 18時~19時の訪問者一覧)

– リスク要因の洗い出し、● 分析 (例: ある商品と他の商品の購入者の関係)

– レコメンド、広告ターゲティング● 変換 など

Page 8: OSC2011 Tokyo/Spring Hadoop入門

8

HDFS

NameNode(Master)

DataNode (Slave)クライアント

3 1 2

②①

Heartbeat

ファイル

メタ情報管理

ブロック管理

DataNode状態監視

ブロックの保存

1つのブロックを複数のDataNodeで保存→ 任意のDataNodeが故障してもデータを失わない

Page 9: OSC2011 Tokyo/Spring Hadoop入門

9

MapReduceの仕組み

<A, 10>

<A, 25>

<C, 15><B, 20>

Map

Map

Map

Reduce

Reduce

Shuffle: 同じKeyでデータを集約

・<Key, Value>の形でデータを管理・MapやReduceを分散処理させる

<D, 5>

<D, 10>

<B, 10><C, 5>

<A, {10,25} >

<C, 10>

<C, {10,5,15} >

<B, {20,10} ><D, {5,10} >

<A, 35 ><C, 30 >

<B, 30 ><D, 15 >

スコアの抽出

何らかの処理

スコア一覧

Page 10: OSC2011 Tokyo/Spring Hadoop入門

10

Hadoop MapReduce

JobTracker(MASTER)

TaskTracker(SLAVE)

クライアント

① ① ③ ②

Map Map Reduce

MMR M

RM R

タスク実行中

タスク実行待ち

タスク実行(競争)中

Heartbeat

MapReduceジョブ管理

タスク管理

TaskTracker状態監視

MapReduceジョブ

データのローカリティを意識したタスクの実行

同じ処理の投機的実行

Map,Reduceタスクの実行

Page 11: OSC2011 Tokyo/Spring Hadoop入門

11

Hadoopの持つ数字

● バージョン : 0.21.0 (最新版)

● クラスタ規模 : 最大4000台● 分散ファイルシステムの容量 : 数十PB

– 1TBのHDDを1000台以上利用してもOK!● 100TBのデータのソート : 173秒● HDFSのブロックサイズ : 64MB (default)

● ブロックのレプリケーション数 : 3 (default)

Page 12: OSC2011 Tokyo/Spring Hadoop入門

12

Hadoopの使い方

Page 13: OSC2011 Tokyo/Spring Hadoop入門

13

Hadoopの動作に必要なもの

OS

Java

Hadoop

RedHat, CentOS, Ubuntu,Windows(要Cygwin)

Sun (現 Oracle) の JVM 64bit

Apacheコミュニティ版 HadoopCloudera版 Hadoop

※ ポイント仮想環境上にHadoop環境を構築しない!(動作確認レベルであれば問題ない)

または、Amazon Elastic MapReduceを利用する

Page 14: OSC2011 Tokyo/Spring Hadoop入門

14

MapReduceを実行する方法

Java MapReduceのAPIに沿って分散処理させる方法を実装する

各種言語 Hadoop Streamingを利用する

Pig

Hive

データの流れに沿って処理したい内容を定義するSQLライクな言語によって処理したい内容を定義する

Page 15: OSC2011 Tokyo/Spring Hadoop入門

15

Hadoop MapReduceの特徴

● Map処理、Reduce処理、ジョブ定義のみで動作

– 内部通信などはフレームワーク内で対応MapReduceジョブ定義クラス入力・出力ファイルのパス、ジョブ名、ジョブ各種設定

入力フォーマットクラス

データ型クラス

Mapクラス

Partitionerクラス

Groupingクラス

Reduceクラス

出力フォーマットクラス

処理内で扱うデータ型の定義

入力書式などの定義

Map処理の定義

Shuffleでのデータ集約の定義

Shuffleでのデータ集約の定義

Reduce処理の定義

出力書式などの定義

Page 16: OSC2011 Tokyo/Spring Hadoop入門

16

Hadoop MapReduceの特徴

<A, 10>

<A, 25>

<C, 15><B, 20>

Map

Map

Map

Reduce

Reduce

Shuffle

<D, 5>

<D, 10>

<B, 10><C, 5>

<A, {10,25} >

<C, 10>

<C, {10,5,15} >

<B, {20,10} ><D, {5,10} >

<A, 35 ><C, 30 >

<B, 30 ><D, 15 >

入力フォーマットクラス出力フォーマットクラス

ReduceクラスMapクラス

Partitionerクラス

Groupingクラス

ジョブクラス

Page 17: OSC2011 Tokyo/Spring Hadoop入門

17

WordCountのソースコード

Job

Reduce

Map

public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); String[] otherArgs =     new GenericOptionsParser(conf, args).getRemainingArgs(); if (otherArgs.length != 2) { System.err.println("Usage: wordcount <in> <out>"); System.exit(2); } Job job = new Job(conf, "word count"); job.setJarByClass(WordCount.class); job.setMapperClass(TokenizerMapper.class); job.setCombinerClass(IntSumReducer.class); job.setReducerClass(IntSumReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(otherArgs[0])); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); }}

約50行の記述で分散処理を実行できる!

public class WordCount {

public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{

private final static IntWritable one = new IntWritable(1); private Text word = new Text();

public void map(Object key, Text value, Context context ) throws IOException, InterruptedException { StringTokenizer itr = new StringTokenizer(value.toString()); while (itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } }

public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> { private IntWritable result = new IntWritable();

public void reduce(Text key, Iterable<IntWritable> values, Context context ) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } }

Page 18: OSC2011 Tokyo/Spring Hadoop入門

18

PigによるWordCount

Rawdata = LOAD '/tmp/' USING PigStorage(',') AS (row:chararray);

Words = FOREACH Rawdata GENERATE FLATTEN (TOKENIZE((chararray)$0));

Grouped = GROUP Words BY $0;

Counts = FOREACH Grouped GENERATE COUNT(Words), group;

Ordered = ORDER Counts by $0 DESC;

STORE Ordered INTO 'pig-wordcount';

6行でWordCountを実現できるMapReduceを意識しない記述である

Page 19: OSC2011 Tokyo/Spring Hadoop入門

19

デモCloudera版Hadoop

(CDH3beta4)を利用してデモをします

Page 20: OSC2011 Tokyo/Spring Hadoop入門

20

ApacheのログをMapReduceにて処理

ジョブ:アクセスログより日付別・時間別・コンテンツ別の    カウント数を集計する

Map

Map

Reduce

Reduce

<X月Y日, {1, 1, 1,・・・} >

<Z時, {1,1,・・・} >

日付別集計結果

Apacheアクセスログ

<日付, 1><時間, 1>

<コンテンツ, 1>

時間帯別集計結果

Reduceコンテンツ別集計結果

<x.html, {1,1,・・・} >

Page 21: OSC2011 Tokyo/Spring Hadoop入門

21

MapReduceでのソースコード

簡単に説明します

Page 22: OSC2011 Tokyo/Spring Hadoop入門

22

Pigで実装した場合-- 入力LD = LOAD 'access_log*' USING PigStorage(' ') as  (host:chararray, ymdhms:chararray, method:chararray, contents:chararray, others:chararray);

-- データ取り出しTK = FOREACH LD     GENERATE SUBSTRING(ymdhms, 0, 7), SUBSTRING(ymdhms, 9, 11), contents;

-- 日付別カウントGYMD = GROUP TK BY $0;FYMD = FOREACH GYMD GENERATE group, COUNT(TK);

-- 時間別カウントGHOUR = GROUP TK BY $1;FHOUR = FOREACH GHOUR GENERATE group, COUNT(TK);

-- コンテンツ別カウントGCONT = GROUP TK BY $2;FCONT = FOREACH GCONT GENERATE group, COUNT(TK);

-- 出力STORE FYMD INTO 'result-pig-ymd' USING PigStorage(' ');STORE FHOUR INTO 'result-pig-hour' USING PigStorage(' ');STORE FCONT INTO 'result-pig-contents' USING PigStorage(' ');

Page 23: OSC2011 Tokyo/Spring Hadoop入門

23

HadoopのポイントHadoopを扱う上で

気をつけるポイントを説明します

Page 24: OSC2011 Tokyo/Spring Hadoop入門

24

ポイント1ファイルの扱い

● ログの解析をHadoopで処理する

1つあたりのサイズは数KB~数MB Hadoopクラスタ

数千~数万のファイルを格納

HadoopのMapReduceで単純に処理させる場合、効率が悪い[ポイント]

Hadoopは少量データの扱いは苦手 → ログファイルを結合してHadoopクラスタに格納するなど   工夫が必要!

Page 25: OSC2011 Tokyo/Spring Hadoop入門

25

Combine処理

ポイント2MapReduce処理のポイント

● Combinerの利用

– Map処理結果でReduce処理を実行する– Job.setCombinerClass(クラス名)にて指定する

<A, 10>

<C, 15><B, 20>Map

Map

Map

Reduce

Reduce

<D, 5><A, 25><C, 10><D, 10>

<B, 10><C, 5>

<A, {10,25} ><C, {10,5,15} >

<B, {20,10} ><D, {15} >

<A, 35 ><C, 30 >

<B, 30 ><D, 15 >

Reduceクラス<A, 25><C, 10><D, 15>

[ポイント]Shuffleでの通信量の削減

Page 26: OSC2011 Tokyo/Spring Hadoop入門

26

ポイント2MapReduce処理のポイント

● Reduce処理数の設定

– 真に必要な場合以外はReduce処理数を1にしない

Map

Map

Map

Reduce

MapReduceの処理はメモリ上でデータを扱えない場合、ディスクアクセスを頻発させる。1つのReduceで大量のデータを扱う場合、ディスクアクセスが多発する

Page 27: OSC2011 Tokyo/Spring Hadoop入門

27

ポイント3Hadoop環境

● 複数のディスクがある場合は両方とも利用する

– ディスクIO分散– Hadoopの領域は個別にパーティションを用意

● ログ領域とも分ける● 仮想環境上でHadoopクラスタを構築しない

– 仮想化によるオーバヘッドは大きい!

Page 28: OSC2011 Tokyo/Spring Hadoop入門

28

まとめ

● Hadoopは2つの大きな役割をもつ

– HDFS : 分散ファイルシステム– MapReduce : 分散処理フレームワーク

● 分散処理を少ない記述量で実現できる● PigやHiveといったツールを利用することでより簡単に処理を実現できる

● 特別な環境なしで扱うことが出来る色々なデータを溜めて

Hadoopで分散処理してみましょう!