Upload
shinichi-yamashita
View
3.543
Download
3
Embed Size (px)
DESCRIPTION
2011年3月5日 早稲田大学で開催されたオープンソースカンファレンス 2011 Tokyo/Springで発表した資料です。
Citation preview
1
OSC 2011 Tokyo/Spring
Hadoop 入門++オープンソースで作る分散処理基盤
2011年3月5日山下 真一
2
自己紹介
● 山下 真一 (やました しんいち)– 普通のサラリーマン
● 最近興味を持ってること– Android– 新しいApache Hadoop MapReduce
– ロングライド など● twitter : @ymstsn1
3
本日の発表内容
Hadoopの基礎知識
Hadoopの使い方
Hadoopのポイント
Hadoopとは何かを説明します
Hadoopでの動作させるアプリケーションについて説明します
Hadoopを利用する上でのポイントを説明します
4
Hadoopの基礎知識
5
Hadoopとは?
分散処理フレームワーク
分散処理ファイルシステム
MapReduce
HDFS
Google社が発表したGFS(Google File System)とMapReduce論文を米国Yahoo社のエンジニアが中心となって実装したもの
Hadoop : http://hadoop.apache.org/
6
Hadoopの特徴
● バッチ処理において威力を発揮するHadoopクラスタ
大量のデータ
(GB以上)
スケーラビリティ(CPU・メモリ・ディスクIO)
コモディティ(ソフトウェア・ハードウェア)
数時間~数日以上掛かる処理を数分~数十分で処理させる
Hadoopに関する注意点(1) Hadoop ≠ RDBMS(2) オンライン処理には不向き(3) 少量データの扱いに不向き
スモールスタートが可能(サーバの増設が容易)
7
Hadoopの使い道
大量のデータを以下のように扱います● 集計 (例: アクセス回数の集計)
– ランキング、検索精度のチェック● 抽出 (例: 18時~19時の訪問者一覧)
– リスク要因の洗い出し、● 分析 (例: ある商品と他の商品の購入者の関係)
– レコメンド、広告ターゲティング● 変換 など
8
HDFS
NameNode(Master)
DataNode (Slave)クライアント
①
3 1 2
①
①
②
②
②①
①
①
③
③
③
①
①
①
②
②
②
Heartbeat
ファイル
メタ情報管理
ブロック管理
DataNode状態監視
ブロックの保存
1つのブロックを複数のDataNodeで保存→ 任意のDataNodeが故障してもデータを失わない
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 >
スコアの抽出
何らかの処理
スコア一覧
10
Hadoop MapReduce
JobTracker(MASTER)
TaskTracker(SLAVE)
クライアント
① ① ③ ②
Map Map Reduce
MMR M
RM R
タスク実行中
タスク実行待ち
タスク実行(競争)中
Heartbeat
MapReduceジョブ管理
タスク管理
TaskTracker状態監視
MapReduceジョブ
データのローカリティを意識したタスクの実行
同じ処理の投機的実行
Map,Reduceタスクの実行
11
Hadoopの持つ数字
● バージョン : 0.21.0 (最新版)
● クラスタ規模 : 最大4000台● 分散ファイルシステムの容量 : 数十PB
– 1TBのHDDを1000台以上利用してもOK!● 100TBのデータのソート : 173秒● HDFSのブロックサイズ : 64MB (default)
● ブロックのレプリケーション数 : 3 (default)
12
Hadoopの使い方
13
Hadoopの動作に必要なもの
OS
Java
Hadoop
RedHat, CentOS, Ubuntu,Windows(要Cygwin)
Sun (現 Oracle) の JVM 64bit
Apacheコミュニティ版 HadoopCloudera版 Hadoop
※ ポイント仮想環境上にHadoop環境を構築しない!(動作確認レベルであれば問題ない)
または、Amazon Elastic MapReduceを利用する
14
MapReduceを実行する方法
Java MapReduceのAPIに沿って分散処理させる方法を実装する
各種言語 Hadoop Streamingを利用する
Pig
Hive
データの流れに沿って処理したい内容を定義するSQLライクな言語によって処理したい内容を定義する
15
Hadoop MapReduceの特徴
● Map処理、Reduce処理、ジョブ定義のみで動作
– 内部通信などはフレームワーク内で対応MapReduceジョブ定義クラス入力・出力ファイルのパス、ジョブ名、ジョブ各種設定
入力フォーマットクラス
データ型クラス
Mapクラス
Partitionerクラス
Groupingクラス
Reduceクラス
出力フォーマットクラス
処理内で扱うデータ型の定義
入力書式などの定義
Map処理の定義
Shuffleでのデータ集約の定義
Shuffleでのデータ集約の定義
Reduce処理の定義
出力書式などの定義
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クラス
ジョブクラス
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); } }
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を意識しない記述である
19
デモCloudera版Hadoop
(CDH3beta4)を利用してデモをします
20
ApacheのログをMapReduceにて処理
ジョブ:アクセスログより日付別・時間別・コンテンツ別の カウント数を集計する
Map
Map
Reduce
Reduce
<X月Y日, {1, 1, 1,・・・} >
<Z時, {1,1,・・・} >
日付別集計結果
Apacheアクセスログ
<日付, 1><時間, 1>
<コンテンツ, 1>
時間帯別集計結果
Reduceコンテンツ別集計結果
<x.html, {1,1,・・・} >
21
MapReduceでのソースコード
簡単に説明します
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(' ');
23
HadoopのポイントHadoopを扱う上で
気をつけるポイントを説明します
24
ポイント1ファイルの扱い
● ログの解析をHadoopで処理する
1つあたりのサイズは数KB~数MB Hadoopクラスタ
数千~数万のファイルを格納
HadoopのMapReduceで単純に処理させる場合、効率が悪い[ポイント]
Hadoopは少量データの扱いは苦手 → ログファイルを結合して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での通信量の削減
26
ポイント2MapReduce処理のポイント
● Reduce処理数の設定
– 真に必要な場合以外はReduce処理数を1にしない
Map
Map
Map
Reduce
MapReduceの処理はメモリ上でデータを扱えない場合、ディスクアクセスを頻発させる。1つのReduceで大量のデータを扱う場合、ディスクアクセスが多発する
27
ポイント3Hadoop環境
● 複数のディスクがある場合は両方とも利用する
– ディスクIO分散– Hadoopの領域は個別にパーティションを用意
● ログ領域とも分ける● 仮想環境上でHadoopクラスタを構築しない
– 仮想化によるオーバヘッドは大きい!
28
まとめ
● Hadoopは2つの大きな役割をもつ
– HDFS : 分散ファイルシステム– MapReduce : 分散処理フレームワーク
● 分散処理を少ない記述量で実現できる● PigやHiveといったツールを利用することでより簡単に処理を実現できる
● 特別な環境なしで扱うことが出来る色々なデータを溜めて
Hadoopで分散処理してみましょう!