INTEROP
     クラウドコンピューティング
      コンペティション2010
「HadoopクラスタをZERO-CONFで
  100+台まで拡張チャレンジ」

       チーム ハピルス
      藤川幸一 @fujibee
     平野智也 @tomoya55
   株式会社シリウステクノロジーズ
Hadoopとは?
• 大規模データ並列分散処理フレームワーク
• Google MapReduceのオープンソースクローン
• テラバイトレベルのデータ処理に必要
 – 標準的なHDDがRead 50MB/sとして400TB(Webス
   ケール)のReadだけで2000時間
 – 分散ファイルシステムと分散処理フレームワーク
   が必要
Hadoopクラスタ拡張の現状
• マスタの設定ファイルにスレーブの場所を記
  述
• すべてのスレーブにHadoopパッケージをイン
  ストール
• それぞれのスレーブにタスク用の設定ファイ
  ルを配置
                    などなど


 ⇒ スレーブが大量にあると手間がかかる!
HudsonでZERO-CONF
Hadoopクラスタ拡張
• Hadoopスレーブ配布フレームワークとして
  Hudsonを利用する
• Hudsonはビルドツールとして知られているが実
  は分散フレームワークとして利用できる
 – HudsonはZERO-CONFでスレーブを簡単にアタッチす
   ることが可能
 – さらにHudsonのマスタとスレーブはそれぞれ、
   Hadoopのマスタとスレーブを立ち上げることが可能

よってHudsonのスレーブ追加ツールを開発すれ
ば、HadoopのZERO-CONFクラスタ拡張が可能!
構成図
同ノード
                                  同ノード
                    Hudson
   Hudson           スレーブ
                                    Hudson
   マスタ                              スレーブ
                      Hudson
                      スレーブ

              起動
       起動                    起動          起動

                      Hadoop
                      スレーブ
            ジョブ実行                   Hadoop
   Hadoop                           スレーブ
    マスタ             Hadoop
                    スレーブ
                                              ×100
Hadoop Papyrus
• HadoopジョブをRubyのDSLで実行できるオー
  プンソースフレームワーク
 – 本来HadoopジョブはJavaで記述する
 – Javaだと複雑な記述がほんの数行で書ける!
• IPA未踏本体2009年上期のサポートを受け
  藤川によって開発されている
• Hudson上でジョブを記述/実行が可能
package org.apache.hadoop.examples;            Javaの場合
import java.io.IOException;
import java.util.StringTokenizer;
                                                                                同様な処理がJavaでは70行必要だが、
import org.apache.hadoop.conf.Configuration;
                                                                                Hadoop Papyrusだと10行に!
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper; IntSumReducer extends
                              public static class
import org.apache.hadoop.mapreduce.Reducer;
                              Reducer<Text, IntWritable, Text, IntWritable> {
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
                              private IntWritable result = new IntWritable();
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
                               public void reduce(Text key, Iterable<IntWritable> values,
                               Context context) throws IOException, InterruptedException {
public class WordCount {       int sum = 0;
                               for (IntWritable val : values) {
                               sum += val.get();
public static class TokenizerMapper extends
                               }
Mapper<Object, Text, Text, IntWritable> {
                               result.set(sum);
                                                                                                                   Hadoop Papyrus
                                 context.write(key, result);
                                 }                                                             dsl 'LogAnalysis‘
private final static IntWritable one = new IntWritable(1);
                                 }
private Text word = new Text();

                                public static void main(String[] args) throws Exception {
public void map(Object key, Text value, Context context) Configuration();
                                Configuration conf = new
                                                                                               from ‘test/in‘
throws IOException, InterruptedException {
                                String[] otherArgs = new GenericOptionsParser(conf, args)
StringTokenizer itr = new StringTokenizer(value.toString());
                                .getRemainingArgs();
                                                                                               to ‘test/out’
while (itr.hasMoreTokens()) { if (otherArgs.length != 2) {
word.set(itr.nextToken());      System.err.println("Usage: wordcount <in> <out>");
context.write(word, one);       System.exit(2);
}
}
                                }                                                              pattern /¥[¥[([^|¥]:]+)[^¥]:]*¥]¥]/
                                Job job = new Job(conf, "word count");
}                               job.setJarByClass(WordCount.class);
                                job.setMapperClass(TokenizerMapper.class);
                                                                                               column_name :link
                                job.setCombinerClass(IntSumReducer.class);
                                job.setReducerClass(IntSumReducer.class);
                                job.setOutputKeyClass(Text.class);
                                job.setOutputValueClass(IntWritable.class);                    topic "link num", :label => 'n' do
                                FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
                                FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));      count_uniq column[:link]
                                System.exit(job.waitForCompletion(true) ? 0 : 1);
                                }
                                }
                                                                                               end
今回のチャレンジ
1. Hudsonのスレーブを自動起動するスクリプト
   を準備
2. Hudsonのスレーブを起動するだけでHadoop
   クラスタに自動追加されるデモ
3. 100台Hadoopクラスタ ZERO-CONF起動!
4. そのクラスタでHadoop Papyrusにて
   Wikipedia全データのリンクをカウントする
   ジョブ実行
5. 100台以上何台いけるかチャレンジ!
ありがとうございました




Twitter ID: @fujibee / @tomoya55 / @hapyrus

Cloud computing competition by Hapyrus

  • 1.
    INTEROP クラウドコンピューティング コンペティション2010 「HadoopクラスタをZERO-CONFで 100+台まで拡張チャレンジ」 チーム ハピルス 藤川幸一 @fujibee 平野智也 @tomoya55 株式会社シリウステクノロジーズ
  • 2.
    Hadoopとは? • 大規模データ並列分散処理フレームワーク • GoogleMapReduceのオープンソースクローン • テラバイトレベルのデータ処理に必要 – 標準的なHDDがRead 50MB/sとして400TB(Webス ケール)のReadだけで2000時間 – 分散ファイルシステムと分散処理フレームワーク が必要
  • 3.
    Hadoopクラスタ拡張の現状 • マスタの設定ファイルにスレーブの場所を記 述 • すべてのスレーブにHadoopパッケージをイン ストール • それぞれのスレーブにタスク用の設定ファイ ルを配置 などなど ⇒ スレーブが大量にあると手間がかかる!
  • 4.
    HudsonでZERO-CONF Hadoopクラスタ拡張 • Hadoopスレーブ配布フレームワークとして Hudsonを利用する • Hudsonはビルドツールとして知られているが実 は分散フレームワークとして利用できる – HudsonはZERO-CONFでスレーブを簡単にアタッチす ることが可能 – さらにHudsonのマスタとスレーブはそれぞれ、 Hadoopのマスタとスレーブを立ち上げることが可能 よってHudsonのスレーブ追加ツールを開発すれ ば、HadoopのZERO-CONFクラスタ拡張が可能!
  • 5.
    構成図 同ノード 同ノード Hudson Hudson スレーブ Hudson マスタ スレーブ Hudson スレーブ 起動 起動 起動 起動 Hadoop スレーブ ジョブ実行 Hadoop Hadoop スレーブ マスタ Hadoop スレーブ ×100
  • 6.
    Hadoop Papyrus • HadoopジョブをRubyのDSLで実行できるオー プンソースフレームワーク – 本来HadoopジョブはJavaで記述する – Javaだと複雑な記述がほんの数行で書ける! • IPA未踏本体2009年上期のサポートを受け 藤川によって開発されている • Hudson上でジョブを記述/実行が可能
  • 7.
    package org.apache.hadoop.examples; Javaの場合 import java.io.IOException; import java.util.StringTokenizer; 同様な処理がJavaでは70行必要だが、 import org.apache.hadoop.conf.Configuration; Hadoop Papyrusだと10行に! import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; IntSumReducer extends public static class import org.apache.hadoop.mapreduce.Reducer; Reducer<Text, IntWritable, Text, IntWritable> { import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; private IntWritable result = new IntWritable(); import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.GenericOptionsParser; public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { public class WordCount { int sum = 0; for (IntWritable val : values) { sum += val.get(); public static class TokenizerMapper extends } Mapper<Object, Text, Text, IntWritable> { result.set(sum); Hadoop Papyrus context.write(key, result); } dsl 'LogAnalysis‘ private final static IntWritable one = new IntWritable(1); } private Text word = new Text(); public static void main(String[] args) throws Exception { public void map(Object key, Text value, Context context) Configuration(); Configuration conf = new from ‘test/in‘ throws IOException, InterruptedException { String[] otherArgs = new GenericOptionsParser(conf, args) StringTokenizer itr = new StringTokenizer(value.toString()); .getRemainingArgs(); to ‘test/out’ while (itr.hasMoreTokens()) { if (otherArgs.length != 2) { word.set(itr.nextToken()); System.err.println("Usage: wordcount <in> <out>"); context.write(word, one); System.exit(2); } } } pattern /¥[¥[([^|¥]:]+)[^¥]:]*¥]¥]/ Job job = new Job(conf, "word count"); } job.setJarByClass(WordCount.class); job.setMapperClass(TokenizerMapper.class); column_name :link job.setCombinerClass(IntSumReducer.class); job.setReducerClass(IntSumReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); topic "link num", :label => 'n' do FileInputFormat.addInputPath(job, new Path(otherArgs[0])); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); count_uniq column[:link] System.exit(job.waitForCompletion(true) ? 0 : 1); } } end
  • 8.
    今回のチャレンジ 1. Hudsonのスレーブを自動起動するスクリプト を準備 2. Hudsonのスレーブを起動するだけでHadoop クラスタに自動追加されるデモ 3. 100台Hadoopクラスタ ZERO-CONF起動! 4. そのクラスタでHadoop Papyrusにて Wikipedia全データのリンクをカウントする ジョブ実行 5. 100台以上何台いけるかチャレンジ!
  • 9.