OSC2011 Tokyo/Spring Hadoop入門

3,948 views

Published on

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

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,948
On SlideShare
0
From Embeds
0
Number of Embeds
11
Actions
Shares
0
Downloads
116
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

OSC2011 Tokyo/Spring Hadoop入門

  1. 1. OSC 2011 Tokyo/Spring Hadoop 入門++ オープンソースで作る分散処理基盤 2011年3月5日 山下 真一1
  2. 2. 自己紹介 ● 山下 真一 (やました しんいち) – 普通のサラリーマン ● 最近興味を持ってること – Android – 新しいApache Hadoop MapReduce – ロングライド など ● twitter : @ymstsn12
  3. 3. 本日の発表内容 Hadoopの基礎知識 Hadoopとは何かを説明します Hadoopの使い方 Hadoopでの動作させるアプリ ケーションについて説明します Hadoopのポイント Hadoopを利用する上での3 ポイントを説明します
  4. 4. Hadoopの基礎知識4
  5. 5. Hadoopとは? HDFS 分散処理ファイルシステム MapReduce 分散処理フレームワーク Google社が発表したGFS(Google File System)と MapReduce論文を米国Yahoo社のエンジニアが 中心となって実装したもの5 Hadoop : http://hadoop.apache.org/
  6. 6. Hadoopの特徴 ● バッチ処理において威力を発揮する Hadoop スケーラビリティ クラスタ (CPU・メモリ・ディスクIO) コモディティ 大量の (ソフトウェア・ハードウェア) データ (GB以上) スモールスタートが可能 (サーバの増設が容易) 数時間~数日以上掛かる 処理を数分~数十分で Hadoopに関する注意点 (1) Hadoop ≠ RDBMS 処理させる6 (2) オンライン処理には不向き (3) 少量データの扱いに不向き
  7. 7. Hadoopの使い道 大量のデータを以下のように扱います ● 集計 (例: アクセス回数の集計) – ランキング、検索精度のチェック ● 抽出 (例: 18時~19時の訪問者一覧) – リスク要因の洗い出し、 ● 分析 (例: ある商品と他の商品の購入者の関係) – レコメンド、広告ターゲティング7 ● 変換 など
  8. 8. HDFS ブロックの DataNode 保存 ブロック 状態監視 管理 Heartbeat ① ① ③ ② メタ情報 管理 ② ① ② NameNode ③ ① ② ① (Master) 3 1 2 ② ① ③ ① ファイル ① ① ② クライアント DataNode (Slave)8 1つのブロックを複数のDataNodeで保存 → 任意のDataNodeが故障してもデータを失わない
  9. 9. MapReduceの仕組み スコア 一覧 Shuffle: 同じKeyでデータを集約 <A, 10> <A, {10,25} > <B, 20> <C, {10,5,15} > 何らかの処理 Map <C, 15> Reduce <A, 35 > <D, 5> <C, 30 > Map <A, 25> <C, 10> <D, 10> <B, 30 > Reduce <B, 10> <D, 15 > Map <C, 5> <B, {20,10} > <D, {5,10} > スコアの抽出 ・<Key, Value>の形でデータを管理9 ・MapやReduceを分散処理させる
  10. 10. Hadoop MapReduce MapReduceジョブ TaskTracker Map Map Reduce 管理 状態監視 タスク ① ① ③ ② 管理 Heartbeat データのローカリティを意識したJobTracker タスクの実行 (MASTER) R M M M MapReduce ジョブ 同じ処理の投機的実行 M R R クライアント TaskTracker タスク実行待ち Map,Reduce 10 (SLAVE) タスク実行中 タスクの実行 タスク実行(競争)中
  11. 11. Hadoopの持つ数字 ● バージョン : 0.21.0 (最新版) ● クラスタ規模 : 最大4000台 ● 分散ファイルシステムの容量 : 数十PB – 1TBのHDDを1000台以上利用してもOK! ● 100TBのデータのソート : 173秒 ● HDFSのブロックサイズ : 64MB (default)11 ● ブロックのレプリケーション数 : 3 (default)
  12. 12. Hadoopの使い方12
  13. 13. Hadoopの動作に必要なもの Apacheコミュニティ版 Hadoop Hadoop Cloudera版 Hadoop Java Sun (現 Oracle) の JVM 64bit RedHat, CentOS, Ubuntu, OS Windows(要Cygwin) または、Amazon Elastic MapReduceを利用する ※ ポイント 仮想環境上にHadoop環境を構築しない!13 (動作確認レベルであれば問題ない)
  14. 14. MapReduceを実行する方法 MapReduceのAPIに沿って Java 分散処理させる方法を実装する 各種言語 Hadoop Streamingを利用する データの流れに沿って処理したい Pig 内容を定義する SQLライクな言語によって処理し Hive たい内容を定義する14
  15. 15. Hadoop MapReduce の特徴 ● Map処理、Reduce処理、ジョブ定義のみで動作 – 内部通信などはフレームワーク内で対応 MapReduceジョブ定義クラス 入力・出力ファイルのパス、ジョブ名、ジョブ各種設定 データ型クラス 処理内で扱うデータ型の定義 入力フォーマットクラス 入力書式などの定義 Mapクラス Map処理の定義 Partitionerクラス Shuffleでのデータ集約の定義 Groupingクラス Shuffleでのデータ集約の定義 Reduceクラス Reduce処理の定義15 出力フォーマットクラス 出力書式などの定義
  16. 16. Hadoop MapReduce ジョブクラス の特徴 Shuffle Groupingクラス <A, 10> <A, {10,25} > <B, 20> <C, {10,5,15} > Map <C, 15> Reduce <A, 35 > <D, 5> <C, 30 > Map <A, 25> <C, 10> Reduceクラス Mapクラス <D, 10> <B, 30 > Reduce <B, 10> <D, 15 > Map <C, 5> <B, {20,10} > Partitioner <D, {5,10} > クラス 出力フォーマットクラス16 入力フォーマットクラス
  17. 17. WordCountのpublic class WordCount { ソースコード public static class TokenizerMapper extends Mapper<Object, Text, Text, IntWritable>{ public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); private final static IntWritable one = new IntWritable(1); String[] otherArgs = private Text word = new Text();     new GenericOptionsParser(conf, args).getRemainingArgs(); if (otherArgs.length != 2) { public void map(Object key, Text value, Context context System.err.println("Usage: wordcount <in> <out>"); ) throws IOException, InterruptedException { System.exit(2); StringTokenizer itr = new StringTokenizer(value.toString()); } while (itr.hasMoreTokens()) { Job job = new Job(conf, "word count"); word.set(itr.nextToken()); job.setJarByClass(WordCount.class); context.write(word, one); job.setMapperClass(TokenizerMapper.class); } Map job.setCombinerClass(IntSumReducer.class); } } job.setReducerClass(IntSumReducer.class); job.setOutputKeyClass(Text.class); public static class IntSumReducer job.setOutputValueClass(IntWritable.class); extends Reducer<Text,IntWritable,Text,IntWritable> { FileInputFormat.addInputPath(job, new Path(otherArgs[0])); private IntWritable result = new IntWritable(); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); public void reduce(Text key, Iterable<IntWritable> values, } Context context } ) throws IOException, InterruptedException { Job int sum = 0; for (IntWritable val : values) { sum += val.get(); } 約50行の記述で分散処理を result.set(sum); context.write(key, result); Reduce } 17 } 実行できる!
  18. 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を実現できる18 MapReduceを意識しない記述である
  19. 19. デモ Cloudera版Hadoop (CDH3beta4)を利用して デモをします19
  20. 20. Apacheのログを MapReduceにて処理 <X月Y日, {1, 1, 1,・・・} > 日付別 Reduce Map 集計結果 <日付, 1> <Z時, {1,1,・・・} > 時間帯別 <時間, 1> Reduce <コンテンツ, 1> 集計結果 Map コンテンツ Reduce Apache 別集計結果 アクセスログ <x.html, {1,1,・・・} > ジョブ:アクセスログより日付別・時間別・コンテンツ別の20     カウント数を集計する
  21. 21. MapReduceでの ソースコード 簡単に説明します21
  22. 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( ); 22STORE FCONT INTO result-pig-contents USING PigStorage( );
  23. 23. Hadoopのポイント Hadoopを扱う上で 気をつけるポイントを説明します23
  24. 24. ポイント1 ファイルの扱い ● ログの解析をHadoopで処理する 数千~数万のファイルを格納 1つあたりのサイズは 数KB~数MB Hadoopクラスタ HadoopのMapReduceで単純に処理させる場合、効率が悪い [ポイント] Hadoopは少量データの扱いは苦手 → ログファイルを結合してHadoopクラスタに格納するなど    工夫が必要!24
  25. 25. ポイント2 MapReduce処理のポイント ● Combinerの利用 – Map処理結果でReduce処理を実行する – Job.setCombinerClass(クラス名)にて指定する <A, 10> <B, 20> <A, {10,25} > Map <C, 15> <C, {10,5,15} > Combine処理 <A, 35 > Reduce <D, 5> <C, 30 > <A, 25> Map <A, 25> <C, 10> <C, 10> <D, 15> Reduceクラス <D, 10> <B, 30 > Reduce <B, 10> <D, 15 > Map <C, 5> <B, {20,10} > [ポイント]25 <D, {15} > Shuffleでの通信量の削減
  26. 26. ポイント2 MapReduce処理のポイント ● Reduce処理数の設定 – 真に必要な場合以外はReduce処理数を1にしない Map Reduce Map MapReduceの処理はメモリ上でデータを 扱えない場合、ディスクアクセスを頻発 Map させる。 1つのReduceで大量のデータを扱う場合、 ディスクアクセスが多発する26
  27. 27. ポイント3 Hadoop環境 ● 複数のディスクがある場合は両方とも利用する – ディスクIO分散 – Hadoopの領域は個別にパーティションを用意 ● ログ領域とも分ける ● 仮想環境上でHadoopクラスタを構築しない – 仮想化によるオーバヘッドは大きい!27
  28. 28. まとめ ● Hadoopは2つの大きな役割をもつ – HDFS : 分散ファイルシステム – MapReduce : 分散処理フレームワーク ● 分散処理を少ない記述量で実現できる ● PigやHiveといったツールを利用することでより簡 単に処理を実現できる ● 特別な環境なしで扱うことが出来る 色々なデータを溜めて28 Hadoopで分散処理してみましょう!

×