SlideShare uma empresa Scribd logo
1 de 20
Baixar para ler offline
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

Mais conteúdo relacionado

Mais procurados

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
 

Mais procurados (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超入門編
 

Destaque

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
 

Destaque (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の紹介: モジュール・システムを中心に
 

Semelhante a 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
 

Semelhante a 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
 

Mais de 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
 

Mais de 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
 

Último

AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 

Último (8)

AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 

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