主キー一覧ファイルは、Hadoop入力データファイルに含まれる主キーが定義されたファイルです。このファイルを作成することで、キー分布を考慮し自動的に最適な条件に振り分けたり、キーごとに異なるタスクに振り分けたりすることができます。
主キー一覧ファイルの作成方法には、以下の2つがあります。
主キー一覧ファイル作成コマンドの実行
テキストエディタを使用した主キー一覧ファイルの作成
参考
主キー一覧ファイルはジョブ実行時に自動的にサイドデータとして各スレーブサーバに配布されます。このため、利用者がサイドデータとして指定したり、各スレーブサーバにコピーしたりする必要はありません。
主キー一覧ファイルに定義されていない主キーは、自動的にスペアReduceタスクに振り分けられます。
主キー一覧ファイル作成コマンド(bdpp_mkmlist)は、主キー一覧ファイルを作成するHadoopジョブを実行するコマンドです。
本コマンドには、MapReduce設定ファイルをパラメタに指定して実行します。
$ /opt/FJSVbdpp/bin/bdpp_mkmlist -conf MapReduce設定ファイル
戻り値としてジョブが成功すると「0」を、失敗すると「0以外」を返します。
ジョブが成功すると、主キー一覧ファイルの指定で指定したパスに主キー一覧ファイルが作成され、振り分け機能によって性能が改善できる見込みが表示されます。
振り分け機能が有効な場合の表示例
入力ファイルのキー分布を分析した結果、自動的に最適な条件に振り分けることで性能が改善できる見込みは「80%」です。
振り分け機能が有効ではない場合の表示例
$ 入力ファイルのキー分布を分析した結果、自動的に最適な条件に振り分けを行う効果は見込めません。
なお、ここに表示されるのはキーの分布のみを考慮した理論値であり、改善できる見込みが「100%」と表示された場合でも、実際にはHadoopジョブのオーバヘッドなどによってジョブ時間が短縮できない場合があります。
MapReduce設定ファイルで定義する情報は以下のとおりです。各設定の詳細は「11.5 MapReduce設定ファイル」を参照してください。
カテゴリ | 設定名 | 意味 | 指定 |
---|---|---|---|
extjoiner.input.nn.filename | Hadoop入力データファイル名 (*1)(*2) | 必須 | |
mapred.output.dir | Hadoop出力データファイル格納基準ディレクトリ名(*1)(*3) | 必須 | |
extjoiner.sortkey.nn.main | Shuffle&sortで使用する主キーの情報 | 必須 | |
extjoiner.sortkey.nn.sub | Shuffle&sortで使用する副キーの情報 | 任意 | |
extjoiner.mainkeylist | 主キー一覧ファイルのファイル名 | 必須 | |
extjoiner.map.streamprocessor.nn | Mapタスクとして実行する外部プログラム(*4) | 任意 | |
extjoiner.command.retryexitstatus | 外部プログラムから返される復帰値について、再実行を行うかどうかのしきい値を指定します | 任意 | |
extjoiner.map.environment | Mapタスクから実行する外部プログラムの環境変数を指定します | 任意 | |
extjoiner.csv.separator | CSVデータのセパレータを指定します | 任意 | |
extjoiner.partitioner.csv.padding | CSVデータの振り分け処理における主キーの空白の扱いを指定します | 任意 | |
extjoiner.csv.floatfield | 浮動フィールドを指定します | 任意 |
(*1):DFS上のパス名を指定します。
(*2):ディレクトリ名を指定することもできます。ディレクトリを指定した場合、そのディレクトリ内のファイルすべてが入力ファイルとして扱われます。
(*3):本コマンドから実行されるHadoopジョブが一時的に作業用ディレクトリとして使用します。本コマンドの終了後、ディレクトリ内の作業ファイルは自動的に削除されます。
(*4):Mapタスクとして実行する外部プログラムを指定します。
表中の「nn」は、Hadoop入力データファイルの個数(ファイルの種類の数)に対応します。「nn」には、それぞれ01~64の数値を指定します。
ポイント
extjoiner.input.nn.filename、extjoiner.map.streamprocessor.nn には、本コマンドより作成された主キー一覧ファイルを指定して実行するHadoopジョブと同じものを指定します。extjoiner.map.streamprocessor.nn の指定は必須ではありませんが、指定することによりMapタスクから出力される主キーのみが対象となるため、作成される主キー一覧ファイルの精度を向上させることができます。
参考
本コマンドを実行中に「Ctrl+C」キーを入力することにより、タスクを中断させることができます。
本コマンドの引数には、汎用Hadoopコマンドラインオプションを指定することができます。詳細は「11.6.3 外部プログラムの並列実行」を参照してください。
主キー一覧ファイルはCSV形式のテキストファイルです。テキストエディタなどを使用して新規作成、編集が可能です。主キー一覧ファイルには主キーの値と主キーの割合を指定します。
主キーにABCDEと、主キーの割合に50を指定した主キー一覧ファイルの例:
"ABCDE",50
主キーの値を指定します。主キーを複数指定している場合は、カンマで切って指定します。
主キー一覧ファイルに指定する主キーの値は、桁数を含めキー値と一致させる必要があります。
値はダブルクォーテーションで囲んで指定します。
全体のうち当該行の主キーの値が占める割合を整数で指定します。指定された値は他の主キーとの比率として扱われますので、値の意味としては件数であってもパーセントであってもかまいません。
割合は、最適なタスクの実行をスケジュールするために利用されます。
参考
例:主キーの値に文字と数値を、主キーの割合に件数を指定した場合の主キー一覧ファイル
; この行はコメントです "CCCCC","1234",62000 "AAAAA","0000",40000 "BBBBB","1234",98000
例:上記の例と同じ意味を持つパーセントで主キーの割合を指定した場合の主キー一覧ファイル
; この行はコメントです "CCCCC","1234",31 "AAAAA","0000",20 "BBBBB","1234",49
注意
主キー一覧ファイルを作成する際には、以下の点に注意してください。
文字コードは、Unicode(UTF-8)で作成する必要があります。
改行文字は、1バイトの改行コード(0x0A)で作成する必要があります。
BOM(Byte Order Mark)付きUnicode(UTF-8)、BOMなしUnicode(UTF-8)のどちらも使用できます。
行の先頭1バイトがセミコロン(;)のとき、その行の先頭から改行までの間はコメントとして認識されます。
主キーの値と主キーの割合のみを指定できます。コメント行以外には、空白などの文字を含めることはできません。
主キーの値にダブルクォーテーションを含む場合には、キーの値のダブルクォーテーションを二重にする必要があります。
キー一覧ファイルに含まれないキーが振り分けられるタスクのことを、スペアReduceタスクと呼びます。スペアReduceタスクは、「キー分布を考慮し自動的に最適な条件に振り分ける」場合、および「キーごとに異なるタスクに振り分ける」際に自動的に起動されます。すべての主キーが主キー一覧ファイルに定義されている場合は、スペアReduceタスクにキーは振り分けられません。
注意
主キー一覧ファイルに含まれないキーは、すべてスペアReduceタスクに振り分けられます。このため、そのようなキーがたくさんある場合、スペアReduceタスクがボトルネックになります。この場合、主キー一覧ファイルを見直すことをおすすめします。