Hadoop本 7章 MapReduceの型とフォーマット の疑問点や気になる点について記述してください。
※記入者、該当ページ・該当行は忘れずに書いて下さい。

mapper, combiner, reducerの入出力の型を明示的に指定しなければならない

  • [記入者] terurou
  • [該当箇所] 191〜193ページ(7.1 MapReduceの型)
  • Javaのジェネリクスの制約上、Hadoopには型の推論ができない
  • 実行するまで型の衝突はわからない
  • 名古屋人にはDISられても仕方がない

説明もなしに「パーティション関数」とか出てきたけど…

  • [記入者] terurou
  • [該当箇所] 192ページ(7.1 MapReduceの型)
  • 続きのページを読み始めたら、パーティション=recuderの入力単位と書いてあった
  • reducerが1つ=パーティションも1つ
  • patitionerによって各レコードがどのパーティションに属するか(パーティションのインデックス)を確定させる
  • map→???→reduce 中間の流れ(partitionerとcombinerのどっちが先?)がいまいちわからないので要調査

デフォルトのMapReduceジョブ

  • [記入者] terurou
  • [該当箇所] 193〜200ページ(7.1.1 デフォルトのMapReduceジョブ)
  • この節はMapReduceプログラムを書く際のスケルトンコードとしては非常に有用そう

入力スプリットには実データは含まれない

  • [記入者] terurou
  • [該当箇所] 200〜201ページ(7.2.1 入力スプリットとレコード)
  • スプリットにはデータ参照(ストレージ上の位置=ホスト名を表す文字列、データサイズ)しか持たない

map関数に入力されるKey/Valueは外部で書き換えられる可能性がある

  • [記入者] terurou
  • [該当箇所] 202ページ(7.2.1 入力スプリットとレコード)
  • map関数の外側で値が書き換えてしまう可能性がある
  • もしmap関数の外側でKey/Valueの値が必要な場合、かならずコピーを作成すること
  • 名古屋人にはDISられても仕方がない

InputFormatの種類

  • [記入者] terurou
  • [該当箇所] 202〜219ページ(7.2 入力フォーマット)
  • FileInputFormat:ファイルをデータソースとして使用するためのベースクラス。
    • CombineFileInputFormat:(HDFSのブロックサイズより)小さなファイルが大量にある場合に利用する。
    • TextInputFormat:デフォルトのInputFormat。Valueはテキスト1行、Keyはその行のバイトオフセットになる。
    • KeyValueTextInputFormat:テキストの各行が"Key[\t]Value"のようにデリミタで区切られたKeyValuePairになっている場合に利用。
      • StreamInputFormat:Hadoop Streamingで利用される。
    • NLineInputFormat:レコードの作り方はTextInputFormatと同じだが、必ず指定したN行だけで入力スプリットを生成する。通常利用するには非効率だが、Hadoopをシミュレーションなどの並列コンピューティング環境として使う場合に利用できる
    • SequenceFileInputFormat:Hadoop上のバイナリファイル SequenceFile(4.1.1 113ページ〜で解説)を読み込みたい場合に使用。
    • SequenceFileAsTextInputFormat:SequenceFileInputFormatの変種。SequenceFileのレコードをTextに変換して入力スプリットにする。
    • SequenceFileAsBinaryInputFormat:SequenceFileInputFormatの変種。バイナリデータをそのまま扱う。
  • DBInputFormat:JDBC経由でRDBMSのデータを読み込む。大量のmapperから処理を行うとDB側の負荷が大きくなる危険性がある。
  • EmptyInputFormat

独自のInputFormatを作りたい

  • [記入者] terurou
  • [該当箇所] 202〜219ページ(7.2 入力フォーマット)
  • InputFormatインタフェースおよびその派生クラスを継承する
  • RecordReaderクラスを継承し、レコードの読み出し方法をカスタマイズする

InputFormatで1つのファイルを複数のスプリットに分割させたくない

  • [記入者] terurou
  • [該当箇所] 207〜212ページ(7.2.1.5 分割の回避、7.2.1.7 ファイル全体をレコードとみなして処理)
  • isSplitable()をoverrideし、falseを返すようにする。
  • さらにファイル全体を1レコードとしてみなしたい場合、getRecordReader()をoverrideし、1回のnext()でファイル全体を取得するRecordReaderを返すようにする。

XMLを読み込むInputFormatを使いたい

  • [記入者] terurou
  • [該当箇所] 216ページ(7.2.2.4 XML)
  • StreamInputFormatとStreamXmlRecordReaderを使えばよい(StreamInputFormatはHadoop Streaming以外でも利用できる)
  • パラメータ指定方法
    • conf.setInputFormat(StreamInputFormat.class);
    • StreamInputFormat.setInputPaths(conf, new Path("xml"));
    • conf.set("stream.recordreader.class", "org.apache.hadoop.streaming.StreamXmlRecordReader");
    • conf.set("stream.recordreader.begin", "<page>");
    • conf.set("stream.recordreader.begin", "<page>");
    • conf.set("stream.recordreader.end", "</page>");
  • Hadoop StreamingでXMLを読み込む例もみつけた

1つのジョブで複数の入力データフォーマットに対応する

  • [記入者] terurou
  • [該当箇所] 217〜218ページ(7.2.4 複数の入力)
  • システムを運用していくうちにデータフォーマットが変更されることはよくある
  • MultipleInputs#addInputPath()を使えば複数の入力データフォーマットに対応できる

OutputFormatの種類

  • [記入者] terurou
  • [該当箇所] 218〜228ページ(7.2.5 データベースからの入力(と出力)、7.3 出力フォーマット)
  • NullOutputFormat:何も出力しない。
  • TextOutputFormat:テキストファイルへ出力する。Key/Valueはセパレータ(デフォルトはタブ)に区切られて出力される。Key/Valueのどちらかにnull/NullWritableがセットされている場合、区切り文字なしでnull/NullWritableではない方の値が出力される。共にnull/NullWritableの場合、そのレコード自体が出力されない。
  • SequenceFileOutputFormat:SequenceFileを出力する。
  • SequenceFileAsBinaryOutputFormat:Key/Valueをraw binaryのまま出力するようにしたSequenceFileOutputFormat。https://issues.apache.org/jira/browse/HADOOP-3460を読んだ方がわかりやすいかも。
  • MapFileOutputFormat:MapFileを出力する。MapFileが「キーでソートされている」という性質上、reducerの出力が必ずキーでソートされている必要がある。
  • DBOutputFormat

複数のファイルを出力する1(KeyとValueの値から出力先ファイル名を決める)

  • [記入者] terurou
  • [該当箇所] 222〜225ページ(7.3.3.2 MultipleOutputFormat)
  • MultipleOutputFormat<TKey, TValue>を継承すると実現できる
    • protected String generateFileNameForKeyValue(TKey key, TValue value)
    • このメソッドが返す文字列がファイル名(相対パス)になる。相対パスなのでサブディレクトリも作れる。

複数のファイルを出力する2(データ種別毎に出力先を変える)

MapReduceジョブは出力内容が空でも空ファイルを作成する

  • [記入者] terurou
  • [該当箇所] 228ページ(7.3.4 遅延出力)
  • とのことです。

ファイルの遅延出力

  • [記入者] terurou
  • [該当箇所] 228ページ(7.3.4 遅延出力)
  • LazyOutputFormatを使うと最初のレコード出力時にファイルを作成するようになる
  • Java APIの場合、LazyOutputFormat.setOutputFormatClass(job, OutputFormat.class)のように書けばよい
  • Hadoop Streaming, Pipeの場合は -lazyOutput オプションを使えばよい

このページへのコメント

tfQGZ5 <a href="http://reoumlfnwamk.com/">reoumlfnwamk</a>, [url=http://qnhqlldezhfe.com/]qnhqlldezhfe[/url], [link=http://ngibtwpbswzt.com/]ngibtwpbswzt[/link], http://onamgufsqoac.com/

0
Posted by oeuigjjqpmd 2013年11月21日(木) 02:49:09 返信

7E2xKZ <a href="http://pjczfboliyfc.com/">pjczfboliyfc</a>, [url=http://rrgqcsvkswse.com/]rrgqcsvkswse[/url], [link=http://kqghiopjffil.com/]kqghiopjffil[/link], http://vhqkjxcmhfqt.com/

0
Posted by zwfvtjafnt 2013年11月14日(木) 10:46:01 返信

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

どなたでも編集できます