SlideShare ist ein Scribd-Unternehmen logo
1 von 20
Downloaden Sie, um offline zu lesen
Hadoop Job Builder
型安全なジョブ設定
     2011-02-22
  Hadoop Conference
   @miyakawa_taku
要旨

• Hadoop MapReduce のジョブ設定って面倒です
• 中間データ (map の出力 = reduce の入力) の型を
  一致させる事がとりわけ面倒です
⇒ 簡潔かつ型安全にジョブを設定する Hadoop Job
  Builder というライブラリを作りました




                2
文書中の単語を数える
    word-count ジョブの mapper と reducer
public class WordCountMapper ①
  extends Mapper<LongWritable, Text, Text, IntWritable> {
  ...
}

public class WordCountReducer ②
  extends Reducer<Text, IntWritable, Text, IntWritable> {
  ...
}

                             3
中間データの型は一致させる必要がある
      map の出力 = reduce の入力
public class WordCountMapper          ①        ②
  extends Mapper<LongWritable, Text, Text, IntWritable> {
  ...
}

public class WordCountReducer
  extends Reducer<Text, IntWritable, Text, IntWritable> {
  ...              ③        ④

}

                             4
word-count のジョブ設定
                    こんなに書く
Job job = new Job( getConf() );
job.setJobName( "word-count" );
job.setJarByClass( getClass() );
job.setMapperClass( WordCountMapper.class );
job.setMapOutputKeyClass( Text.class );
job.setMapOutputValueClass( IntWritable.class );
job.setReducerClass( WordCountReducer.class );
job.setOutputKeyClass( Text.class );
job.setOutputValueClass( IntWritable.class );
job.setInputFormatClass( TextInputFormat.class );
FileInputFormat.addInputPath( job , new Path( "wordcount/in" ) );
job.setOutputFormatClass( SequenceFileOutputFormat.class );
FileOutputFormat.setOutputPath( job , new Path( "wordcount/out" ) );

                                 5
やっかいな中間データの設定
Job job = new Job( getConf() );
job.setJobName( "word-count" );
job.setJarByClass( getClass() );
job.setMapperClass( WordCountMapper.class ); ①
job.setMapOutputKeyClass( Text.class );           ②
job.setMapOutputValueClass( IntWritable.class ); ③
job.setReducerClass( WordCountReducer.class ); ④
job.setOutputKeyClass( Text.class );
job.setOutputValueClass( IntWritable.class );
job.setInputFormatClass( TextInputFormat.class );
FileInputFormat.addInputPath( job , new Path( "wordcount/in" ) );
job.setOutputFormatClass( SequenceFileOutputFormat.class );
FileOutputFormat.setOutputPath( job , new Path( "wordcount/out" ) );

                                 6
combiner や partitioner を使うと
          これらの型も一致させる必要がある
Job job = new Job( getConf() );
job.setJobName( "word-count" );
job.setJarByClass( getClass() );
job.setMapperClass( WordCountMapper.class );                ①
job.setMapOutputKeyClass( Text.class );                     ②
job.setMapOutputValueClass( IntWritable.class );            ③
job.setReducerClass( WordCountReducer.class );              ④
job.setCombinerClass( WordCountCombiner.class );           ⑤
job.setPartitionerClass( WordCountPartitioner.class );     ⑥
job.setOutputKeyClass( Text.class );
job.setOutputValueClass( IntWritable.class );
job.setInputFormatClass( TextInputFormat.class );
FileInputFormat.addInputPath( job , new Path( "wordcount/in" ) );
job.setOutputFormatClass( SequenceFileOutputFormat.class );
FileOutputFormat.setOutputPath( job , new Path( "wordcount/out" ) );



                                        7
ちょっとしたパフォーマンスチューニングで

public class WordCountMapper                   ①
  extends Mapper<LongWritable, Text, Text, IntWritable> {
  ...
}

public class WordCountReducer
  extends Reducer<Text, IntWritable, Text, IntWritable> {
  ...                       ②

}

                             8
型が一致しなくなると

public class WordCountMapper                   ①
  extends Mapper<LongWritable, Text, Text, IntWritable> {
  ...
}

public class WordCountReducer
  extends Reducer<Text, VIntWritable, Text, VIntWritable> {
  ...                       ②

}

                            9
コンパイルは通って
             タスクの処理中に実行時エラー
11/02/20 03:07:21 INFO mapred.JobClient: Task Id :
attempt_201102200304_0001_r_000000_2, Status : FAILED
java.lang.ClassCastException: org.apache.hadoop.io.IntWritable cannot be cast to
org.apache.hadoop.io.VIntWritable
  at org.example.WordCountReducer.reduce(WordCountReducer.java:76)
  at org.example.WordCountReducer.reduce(WordCountReducer.java:67)
  at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:176)
  at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:566)
  at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:408)
  at org.apache.hadoop.mapred.Child.main(Child.java:170)




                                       10
MapReduce API は気が利かない

• map, reduce のクラス定義に型情報が含まれてい
  るのに、別途わざわざ型を指定するのは冗長
• 型が一致していなかったらコンパイル時にエラーが
  出てほしい
⇒ 簡潔かつ型安全にジョブを設定したい




              11
簡潔かつ型安全にジョブが設定できる
        ライブラリを作りました
Job job = JobBuilder.of(
    new WordCountMapper() , new WordCountReducer() )
  .jobName( "word-count" )
  .detectJar()
  .detectKeyValue()
  .inputTextFrom( "wordcount/in" )
  .outputSequenceFileOn( "wordcount/out" )
  .buildJob( getConf() );




                         12
中間データの型をクラス定義から推論して設定
      ⇒ 型が省略できる
Job job = JobBuilder.of(
                         ①                ②
    new WordCountMapper() , new WordCountReducer() )
  .jobName( "word-count" )
  .detectJar()
  .detectKeyValue() ③
  .inputTextFrom( "wordcount/in" )
  .outputSequenceFileOn( "wordcount/out" )
  .buildJob( getConf() );




                        13
型が一致しないとコンパイルエラー
           ⇒ 型安全
Job job = JobBuilder.of(
                         ①                ②
    new WordCountMapper() , new WordCountReducer() )
  .jobName( "word-count" )
  .detectJar()
  .detectKeyValue()
  .inputTextFrom( "wordcount/in" )
  .outputSequenceFileOn( "wordcount/out" )
  .buildJob( getConf() );




                        14
combiner や partitioner も型安全に設定
Job job = JobBuilder.of(
                         ①                  ②
    new WordCountMapper() , new WordCountReducer() )
  .jobName( "word-count" )
  .detectJar()
  .detectKeyValue()                   ③
  .combiner( new WordCountCombiner() ) ④
  .partitioner( new WordCountPartitioner() )
  .inputTextFrom( "wordcount/in" )
  .outputSequenceFileOn( "wordcount/out" )
  .buildJob( getConf() );

                        15
他にも便利




  16
出力データの型をクラス定義から推論して設定

Job job = JobBuilder.of(
    new WordCountMapper() , new WordCountReducer() )
  .jobName( "word-count" )
  .detectJar()
  .detectKeyValue()
  .inputTextFrom( "wordcount/in" )
  .outputSequenceFileOn( "wordcount/out" )
  .buildJob( getConf() );




                         17
入力元・出力先を簡潔に設定
Job job = JobBuilder.of(
    new WordCountMapper() , new WordCountReducer() )
  .jobName( "word-count" )
  .detectJar()
  .detectKeyValue()
  .inputTextFrom( "wordcount/in" )
  .outputSequenceFileOn( "wordcount/out" )
  .buildJob( getConf() );




                         18
分散キャッシュを簡潔に設定
Job job = JobBuilder.of(
    new WordCountMapper() , new WordCountReducer() )
  .jobName( "word-count" )
  .detectJar()
  .detectKeyValue()
  .inputTextFrom( "wordcount/in" )
  .outputSequenceFileOn( "wordcount/out" )
  .cacheFileWithSymlink( "/share/dict.txt" , "dict.txt" )
  .buildJob( getConf() );


                           19
総括

• Hadoop Job Builder は簡潔かつ型安全に Hadoop
  のジョブを設定するライブラリです
• BitBucket に公開しています
  – https://bitbucket.org/miyakawa_taku/hadoop-job-
    builder/wiki/Home.ja
• 感想ください
  ⇒ @miyakawa_taku
  ⇒ BitBucket の issue tracker



                          20

Weitere ähnliche Inhalte

Was ist angesagt?

EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトEWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトKiyoshi Sawada
 
Ruby on Rails on MySQL チューニング入門
Ruby on Rails on MySQL チューニング入門Ruby on Rails on MySQL チューニング入門
Ruby on Rails on MySQL チューニング入門だいすけ さとう
 
Wb osaka 20120623
Wb osaka 20120623Wb osaka 20120623
Wb osaka 20120623Miho Ishida
 
PerlとSQLのいろいろ
PerlとSQLのいろいろPerlとSQLのいろいろ
PerlとSQLのいろいろTakuya Tsuchida
 
Perl 6 Object-Oliented Programming
Perl 6 Object-Oliented ProgrammingPerl 6 Object-Oliented Programming
Perl 6 Object-Oliented Programmingrisou
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2Atsuo Yamasaki
 
Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎Kenji Otsuka
 
RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会Nao Minami
 
僕の鮮やかなるScala導入失敗事例
僕の鮮やかなるScala導入失敗事例僕の鮮やかなるScala導入失敗事例
僕の鮮やかなるScala導入失敗事例Yosuke Uchiyama
 
Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料)
Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料)Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料)
Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料)NTT DATA OSS Professional Services
 
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_cccPivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_cccMasatoshi Tada
 
HTMLの要素の選び方
HTMLの要素の選び方HTMLの要素の選び方
HTMLの要素の選び方TENTO_slide
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについてtako pons
 
D3.jsによるDOM操作
D3.jsによるDOM操作D3.jsによるDOM操作
D3.jsによるDOM操作清水 正行
 
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和schoowebcampus
 
Spring Data in a Nutshell
Spring Data in a NutshellSpring Data in a Nutshell
Spring Data in a NutshellTsuyoshi Miyake
 

Was ist angesagt? (20)

EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクトEWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
EWD 3トレーニングコース#20 GlobalストレージのJavaScript用抽象化-(a)DocumentNodeオブジェクト
 
Ruby on Rails on MySQL チューニング入門
Ruby on Rails on MySQL チューニング入門Ruby on Rails on MySQL チューニング入門
Ruby on Rails on MySQL チューニング入門
 
PandasとSQLとの比較
PandasとSQLとの比較PandasとSQLとの比較
PandasとSQLとの比較
 
Wb osaka 20120623
Wb osaka 20120623Wb osaka 20120623
Wb osaka 20120623
 
PerlとSQLのいろいろ
PerlとSQLのいろいろPerlとSQLのいろいろ
PerlとSQLのいろいろ
 
Perl 6 Object-Oliented Programming
Perl 6 Object-Oliented ProgrammingPerl 6 Object-Oliented Programming
Perl 6 Object-Oliented Programming
 
[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2[東京] JapanSharePointGroup 勉強会 #2
[東京] JapanSharePointGroup 勉強会 #2
 
Teclab3
Teclab3Teclab3
Teclab3
 
Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎Algorithm 速いアルゴリズムを書くための基礎
Algorithm 速いアルゴリズムを書くための基礎
 
RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会RailsエンジニアのためのSQLチューニング速習会
RailsエンジニアのためのSQLチューニング速習会
 
僕の鮮やかなるScala導入失敗事例
僕の鮮やかなるScala導入失敗事例僕の鮮やかなるScala導入失敗事例
僕の鮮やかなるScala導入失敗事例
 
Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料)
Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料)Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料)
Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料)
 
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_cccPivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
Pivotal認定講師によるSpring Framework 5.1 & Spring Boot 2.1ハンズオン! #jjug_ccc
 
HTMLの要素の選び方
HTMLの要素の選び方HTMLの要素の選び方
HTMLの要素の選び方
 
Apache Torqueについて
Apache TorqueについてApache Torqueについて
Apache Torqueについて
 
D3.jsによるDOM操作
D3.jsによるDOM操作D3.jsによるDOM操作
D3.jsによるDOM操作
 
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
ノンプログラマーでも明日から使えるJavaScript簡単プログラム 先生:柳井 政和
 
Gaej Jdo
Gaej JdoGaej Jdo
Gaej Jdo
 
Spring Data in a Nutshell
Spring Data in a NutshellSpring Data in a Nutshell
Spring Data in a Nutshell
 
jQuery超入門編
jQuery超入門編jQuery超入門編
jQuery超入門編
 

Andere mochten auch

Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageTaku Miyakawa
 
擬似乱数生成器の評価
擬似乱数生成器の評価擬似乱数生成器の評価
擬似乱数生成器の評価Taku Miyakawa
 
Summary of "Hacking", 0x351-0x354
Summary of "Hacking", 0x351-0x354Summary of "Hacking", 0x351-0x354
Summary of "Hacking", 0x351-0x354Taku Miyakawa
 
Kink: プロトタイプベースの俺々 JVM 言語
Kink: プロトタイプベースの俺々 JVM 言語Kink: プロトタイプベースの俺々 JVM 言語
Kink: プロトタイプベースの俺々 JVM 言語Taku Miyakawa
 
Matrix Multiplication in Strassen Algorithm
Matrix Multiplication in Strassen AlgorithmMatrix Multiplication in Strassen Algorithm
Matrix Multiplication in Strassen AlgorithmTaku Miyakawa
 
コルーチンの実装について
コルーチンの実装についてコルーチンの実装について
コルーチンの実装についてTaku Miyakawa
 
金勘定のためのBigDecimalそしてMoney and Currency API
金勘定のためのBigDecimalそしてMoney and Currency API金勘定のためのBigDecimalそしてMoney and Currency API
金勘定のためのBigDecimalそしてMoney and Currency APITaku Miyakawa
 
Quasar: Actor Model and Light Weight Threads on Java
Quasar: Actor Model and Light Weight Threads on JavaQuasar: Actor Model and Light Weight Threads on Java
Quasar: Actor Model and Light Weight Threads on JavaTaku Miyakawa
 
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6Yuji Kubota
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Taku Miyakawa
 
Prepare for Java 9 #jjug
Prepare for Java 9 #jjugPrepare for Java 9 #jjug
Prepare for Java 9 #jjugYuji Kubota
 
楽して JVM を学びたい #jjug
楽して JVM を学びたい #jjug楽して JVM を学びたい #jjug
楽して JVM を学びたい #jjugYuji Kubota
 
Graph Algorithms Part 1
Graph Algorithms Part 1Graph Algorithms Part 1
Graph Algorithms Part 1Taku Miyakawa
 
言語設計者が意味論を書くときに考えていたこと
言語設計者が意味論を書くときに考えていたこと言語設計者が意味論を書くときに考えていたこと
言語設計者が意味論を書くときに考えていたことTaku Miyakawa
 
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にTaku Miyakawa
 

Andere mochten auch (16)

Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
 
擬似乱数生成器の評価
擬似乱数生成器の評価擬似乱数生成器の評価
擬似乱数生成器の評価
 
Kink の宣伝
Kink の宣伝Kink の宣伝
Kink の宣伝
 
Summary of "Hacking", 0x351-0x354
Summary of "Hacking", 0x351-0x354Summary of "Hacking", 0x351-0x354
Summary of "Hacking", 0x351-0x354
 
Kink: プロトタイプベースの俺々 JVM 言語
Kink: プロトタイプベースの俺々 JVM 言語Kink: プロトタイプベースの俺々 JVM 言語
Kink: プロトタイプベースの俺々 JVM 言語
 
Matrix Multiplication in Strassen Algorithm
Matrix Multiplication in Strassen AlgorithmMatrix Multiplication in Strassen Algorithm
Matrix Multiplication in Strassen Algorithm
 
コルーチンの実装について
コルーチンの実装についてコルーチンの実装について
コルーチンの実装について
 
金勘定のためのBigDecimalそしてMoney and Currency API
金勘定のためのBigDecimalそしてMoney and Currency API金勘定のためのBigDecimalそしてMoney and Currency API
金勘定のためのBigDecimalそしてMoney and Currency API
 
Quasar: Actor Model and Light Weight Threads on Java
Quasar: Actor Model and Light Weight Threads on JavaQuasar: Actor Model and Light Weight Threads on Java
Quasar: Actor Model and Light Weight Threads on Java
 
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
Garbage First Garbage Collection (G1 GC) #jjug_ccc #ccc_cd6
 
Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方Javaのログ出力: 道具と考え方
Javaのログ出力: 道具と考え方
 
Prepare for Java 9 #jjug
Prepare for Java 9 #jjugPrepare for Java 9 #jjug
Prepare for Java 9 #jjug
 
楽して JVM を学びたい #jjug
楽して JVM を学びたい #jjug楽して JVM を学びたい #jjug
楽して JVM を学びたい #jjug
 
Graph Algorithms Part 1
Graph Algorithms Part 1Graph Algorithms Part 1
Graph Algorithms Part 1
 
言語設計者が意味論を書くときに考えていたこと
言語設計者が意味論を書くときに考えていたこと言語設計者が意味論を書くときに考えていたこと
言語設計者が意味論を書くときに考えていたこと
 
Java SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心にJava SE 9の紹介: モジュール・システムを中心に
Java SE 9の紹介: モジュール・システムを中心に
 

Ähnlich wie Hadoop jobbuilder

クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術Koichi Fujikawa
 
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~Sotaro Kimura
 
実動するIot&hadoopから学ぶ会_資料
実動するIot&hadoopから学ぶ会_資料実動するIot&hadoopから学ぶ会_資料
実動するIot&hadoopから学ぶ会_資料FwardNetwork
 
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料codeal
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングTanUkkii
 
[Excel VBA] Convert a sheet to Markdown file.
[Excel VBA] Convert a sheet to Markdown file.[Excel VBA] Convert a sheet to Markdown file.
[Excel VBA] Convert a sheet to Markdown file.Sakai Memoru
 
文字コードの脆弱性はこの3年間でどの程度対策されたか?
文字コードの脆弱性はこの3年間でどの程度対策されたか?文字コードの脆弱性はこの3年間でどの程度対策されたか?
文字コードの脆弱性はこの3年間でどの程度対策されたか?Hiroshi Tokumaru
 
Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理土岐 孝平
 
Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用stomita
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略takezoe
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようAkira Shimosako
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~normalian
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用Yatabe Terumasa
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsShogo Sensui
 
Data api workshop at Co-Edo
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-EdoYuji Takayama
 
HBaseとSparkでセンサーデータを有効活用 #hbasejp
HBaseとSparkでセンサーデータを有効活用 #hbasejpHBaseとSparkでセンサーデータを有効活用 #hbasejp
HBaseとSparkでセンサーデータを有効活用 #hbasejpFwardNetwork
 

Ähnlich wie Hadoop jobbuilder (20)

クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術クラウド時代の並列分散処理技術
クラウド時代の並列分散処理技術
 
MapReduce入門
MapReduce入門MapReduce入門
MapReduce入門
 
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
Hadoop基盤上のETL構築実践例 ~多様なデータをどう扱う?~
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
実動するIot&hadoopから学ぶ会_資料
実動するIot&hadoopから学ぶ会_資料実動するIot&hadoopから学ぶ会_資料
実動するIot&hadoopから学ぶ会_資料
 
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
20150207コデアルエンジニア学生向けハッカソン就活イベント発表資料
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
 
[Excel VBA] Convert a sheet to Markdown file.
[Excel VBA] Convert a sheet to Markdown file.[Excel VBA] Convert a sheet to Markdown file.
[Excel VBA] Convert a sheet to Markdown file.
 
文字コードの脆弱性はこの3年間でどの程度対策されたか?
文字コードの脆弱性はこの3年間でどの程度対策されたか?文字コードの脆弱性はこの3年間でどの程度対策されたか?
文字コードの脆弱性はこの3年間でどの程度対策されたか?
 
Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理
 
Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用Apexコアデベロッパーセミナー070726 配布用
Apexコアデベロッパーセミナー070726 配布用
 
Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略Seasarプロジェクト徹底攻略
Seasarプロジェクト徹底攻略
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
 
Try Jetpack
Try JetpackTry Jetpack
Try Jetpack
 
Functional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.jsFunctional JavaScript with Lo-Dash.js
Functional JavaScript with Lo-Dash.js
 
Java EE8 Report
Java EE8 ReportJava EE8 Report
Java EE8 Report
 
Data api workshop at Co-Edo
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-Edo
 
HBaseとSparkでセンサーデータを有効活用 #hbasejp
HBaseとSparkでセンサーデータを有効活用 #hbasejpHBaseとSparkでセンサーデータを有効活用 #hbasejp
HBaseとSparkでセンサーデータを有効活用 #hbasejp
 

Mehr von Taku Miyakawa

ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月Taku Miyakawa
 
Processing LTSV by Apache Pig
Processing LTSV by Apache PigProcessing LTSV by Apache Pig
Processing LTSV by Apache PigTaku Miyakawa
 
Java 7 invokedynamic の概要
Java 7 invokedynamic の概要Java 7 invokedynamic の概要
Java 7 invokedynamic の概要Taku Miyakawa
 
Java オブジェクトの内部構造
Java オブジェクトの内部構造Java オブジェクトの内部構造
Java オブジェクトの内部構造Taku Miyakawa
 
Kink: developing a programming language on the JVM
Kink: developing a programming language on the JVMKink: developing a programming language on the JVM
Kink: developing a programming language on the JVMTaku Miyakawa
 

Mehr von Taku Miyakawa (6)

ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月ラムダと invokedynamic の蜜月
ラムダと invokedynamic の蜜月
 
Java Quine Golf
Java Quine GolfJava Quine Golf
Java Quine Golf
 
Processing LTSV by Apache Pig
Processing LTSV by Apache PigProcessing LTSV by Apache Pig
Processing LTSV by Apache Pig
 
Java 7 invokedynamic の概要
Java 7 invokedynamic の概要Java 7 invokedynamic の概要
Java 7 invokedynamic の概要
 
Java オブジェクトの内部構造
Java オブジェクトの内部構造Java オブジェクトの内部構造
Java オブジェクトの内部構造
 
Kink: developing a programming language on the JVM
Kink: developing a programming language on the JVMKink: developing a programming language on the JVM
Kink: developing a programming language on the JVM
 

Kürzlich hochgeladen

TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 

Kürzlich hochgeladen (10)

TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 

Hadoop jobbuilder

  • 1. Hadoop Job Builder 型安全なジョブ設定 2011-02-22 Hadoop Conference @miyakawa_taku
  • 2. 要旨 • Hadoop MapReduce のジョブ設定って面倒です • 中間データ (map の出力 = reduce の入力) の型を 一致させる事がとりわけ面倒です ⇒ 簡潔かつ型安全にジョブを設定する Hadoop Job Builder というライブラリを作りました 2
  • 3. 文書中の単語を数える word-count ジョブの mapper と reducer public class WordCountMapper ① extends Mapper<LongWritable, Text, Text, IntWritable> { ... } public class WordCountReducer ② extends Reducer<Text, IntWritable, Text, IntWritable> { ... } 3
  • 4. 中間データの型は一致させる必要がある map の出力 = reduce の入力 public class WordCountMapper ① ② extends Mapper<LongWritable, Text, Text, IntWritable> { ... } public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { ... ③ ④ } 4
  • 5. word-count のジョブ設定 こんなに書く Job job = new Job( getConf() ); job.setJobName( "word-count" ); job.setJarByClass( getClass() ); job.setMapperClass( WordCountMapper.class ); job.setMapOutputKeyClass( Text.class ); job.setMapOutputValueClass( IntWritable.class ); job.setReducerClass( WordCountReducer.class ); job.setOutputKeyClass( Text.class ); job.setOutputValueClass( IntWritable.class ); job.setInputFormatClass( TextInputFormat.class ); FileInputFormat.addInputPath( job , new Path( "wordcount/in" ) ); job.setOutputFormatClass( SequenceFileOutputFormat.class ); FileOutputFormat.setOutputPath( job , new Path( "wordcount/out" ) ); 5
  • 6. やっかいな中間データの設定 Job job = new Job( getConf() ); job.setJobName( "word-count" ); job.setJarByClass( getClass() ); job.setMapperClass( WordCountMapper.class ); ① job.setMapOutputKeyClass( Text.class ); ② job.setMapOutputValueClass( IntWritable.class ); ③ job.setReducerClass( WordCountReducer.class ); ④ job.setOutputKeyClass( Text.class ); job.setOutputValueClass( IntWritable.class ); job.setInputFormatClass( TextInputFormat.class ); FileInputFormat.addInputPath( job , new Path( "wordcount/in" ) ); job.setOutputFormatClass( SequenceFileOutputFormat.class ); FileOutputFormat.setOutputPath( job , new Path( "wordcount/out" ) ); 6
  • 7. combiner や partitioner を使うと これらの型も一致させる必要がある Job job = new Job( getConf() ); job.setJobName( "word-count" ); job.setJarByClass( getClass() ); job.setMapperClass( WordCountMapper.class ); ① job.setMapOutputKeyClass( Text.class ); ② job.setMapOutputValueClass( IntWritable.class ); ③ job.setReducerClass( WordCountReducer.class ); ④ job.setCombinerClass( WordCountCombiner.class ); ⑤ job.setPartitionerClass( WordCountPartitioner.class ); ⑥ job.setOutputKeyClass( Text.class ); job.setOutputValueClass( IntWritable.class ); job.setInputFormatClass( TextInputFormat.class ); FileInputFormat.addInputPath( job , new Path( "wordcount/in" ) ); job.setOutputFormatClass( SequenceFileOutputFormat.class ); FileOutputFormat.setOutputPath( job , new Path( "wordcount/out" ) ); 7
  • 8. ちょっとしたパフォーマンスチューニングで public class WordCountMapper ① extends Mapper<LongWritable, Text, Text, IntWritable> { ... } public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable> { ... ② } 8
  • 9. 型が一致しなくなると public class WordCountMapper ① extends Mapper<LongWritable, Text, Text, IntWritable> { ... } public class WordCountReducer extends Reducer<Text, VIntWritable, Text, VIntWritable> { ... ② } 9
  • 10. コンパイルは通って タスクの処理中に実行時エラー 11/02/20 03:07:21 INFO mapred.JobClient: Task Id : attempt_201102200304_0001_r_000000_2, Status : FAILED java.lang.ClassCastException: org.apache.hadoop.io.IntWritable cannot be cast to org.apache.hadoop.io.VIntWritable at org.example.WordCountReducer.reduce(WordCountReducer.java:76) at org.example.WordCountReducer.reduce(WordCountReducer.java:67) at org.apache.hadoop.mapreduce.Reducer.run(Reducer.java:176) at org.apache.hadoop.mapred.ReduceTask.runNewReducer(ReduceTask.java:566) at org.apache.hadoop.mapred.ReduceTask.run(ReduceTask.java:408) at org.apache.hadoop.mapred.Child.main(Child.java:170) 10
  • 11. MapReduce API は気が利かない • map, reduce のクラス定義に型情報が含まれてい るのに、別途わざわざ型を指定するのは冗長 • 型が一致していなかったらコンパイル時にエラーが 出てほしい ⇒ 簡潔かつ型安全にジョブを設定したい 11
  • 12. 簡潔かつ型安全にジョブが設定できる ライブラリを作りました Job job = JobBuilder.of( new WordCountMapper() , new WordCountReducer() ) .jobName( "word-count" ) .detectJar() .detectKeyValue() .inputTextFrom( "wordcount/in" ) .outputSequenceFileOn( "wordcount/out" ) .buildJob( getConf() ); 12
  • 13. 中間データの型をクラス定義から推論して設定 ⇒ 型が省略できる Job job = JobBuilder.of( ① ② new WordCountMapper() , new WordCountReducer() ) .jobName( "word-count" ) .detectJar() .detectKeyValue() ③ .inputTextFrom( "wordcount/in" ) .outputSequenceFileOn( "wordcount/out" ) .buildJob( getConf() ); 13
  • 14. 型が一致しないとコンパイルエラー ⇒ 型安全 Job job = JobBuilder.of( ① ② new WordCountMapper() , new WordCountReducer() ) .jobName( "word-count" ) .detectJar() .detectKeyValue() .inputTextFrom( "wordcount/in" ) .outputSequenceFileOn( "wordcount/out" ) .buildJob( getConf() ); 14
  • 15. combiner や partitioner も型安全に設定 Job job = JobBuilder.of( ① ② new WordCountMapper() , new WordCountReducer() ) .jobName( "word-count" ) .detectJar() .detectKeyValue() ③ .combiner( new WordCountCombiner() ) ④ .partitioner( new WordCountPartitioner() ) .inputTextFrom( "wordcount/in" ) .outputSequenceFileOn( "wordcount/out" ) .buildJob( getConf() ); 15
  • 17. 出力データの型をクラス定義から推論して設定 Job job = JobBuilder.of( new WordCountMapper() , new WordCountReducer() ) .jobName( "word-count" ) .detectJar() .detectKeyValue() .inputTextFrom( "wordcount/in" ) .outputSequenceFileOn( "wordcount/out" ) .buildJob( getConf() ); 17
  • 18. 入力元・出力先を簡潔に設定 Job job = JobBuilder.of( new WordCountMapper() , new WordCountReducer() ) .jobName( "word-count" ) .detectJar() .detectKeyValue() .inputTextFrom( "wordcount/in" ) .outputSequenceFileOn( "wordcount/out" ) .buildJob( getConf() ); 18
  • 19. 分散キャッシュを簡潔に設定 Job job = JobBuilder.of( new WordCountMapper() , new WordCountReducer() ) .jobName( "word-count" ) .detectJar() .detectKeyValue() .inputTextFrom( "wordcount/in" ) .outputSequenceFileOn( "wordcount/out" ) .cacheFileWithSymlink( "/share/dict.txt" , "dict.txt" ) .buildJob( getConf() ); 19
  • 20. 総括 • Hadoop Job Builder は簡潔かつ型安全に Hadoop のジョブを設定するライブラリです • BitBucket に公開しています – https://bitbucket.org/miyakawa_taku/hadoop-job- builder/wiki/Home.ja • 感想ください ⇒ @miyakawa_taku ⇒ BitBucket の issue tracker 20