Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

OSC2011 Tokyo/Spring Hadoop入門

4,044 views

Published on

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

Published in: Technology
  • Be the first to comment

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で分散処理してみましょう!

×