ヘッダーをスキップ
Oracle® Big Data Applianceソフトウェア・ユーザーズ・ガイド
リリース2 (2.2.1)
E48217-02
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

4 Perfect Balanceを使用したMapReduceジョブの最適化

この章では、Perfect Balanceを使用して一部のMapReduceジョブの実行時間を短縮する方法について説明します。この章の内容は次のとおりです。

4.1 Perfect Balanceとは

Oracle Big Data ApplianceのPerfect Balance機能は、MapReduceアプリケーションのリデューサ・ロードを分散して、各リデュース・タスクで実行される処理がほぼ同じ量になるようにします。リデュース・ロードを分散するためのデフォルトのHadoopメソッドは、多くのジョブに対して適切ですが、データ・スキューが大きい場合にはジョブのロードを均等に分散できません。

データ・スキューとは、複数のリデュース・タスクに対する不均等なロード割当てのことです。ロードとは、次の要因がもたらす作用のことです。

  • 1つのリデューサに割り当てられたキーの数。

  • キー当たりの値に含まれるレコード数とバイト数。

ジョブの総実行時間は、最大ロードのリデューサの所要時間に応じて長くなります。ジョブのロードが不均衡な場合、リデューサによってジョブの所要時間にばらつきが生じます。Perfect Balanceを使用すると、ロードが均等に分散され、すべてのリデューサがほぼ同じ時間で処理を完了できるようになるため、総実行時間を大幅に短縮できます。

MapReduceジョブはmapredmapreduceのいずれかのAPIを使用して記述されますが、Perfect Balanceはこれら両方をサポートしています。

Perfect Balanceは、Oracle Big Data Appliance上のデフォルトのインストールである、MapReduce 1 (MRv1) CDHクラスタ上でテストされています。

4.1.1 マップおよびリデュース・タスク間でのジョブの均衡化について

典型的なHadoopジョブには、マップ・タスクとリデュース・タスクがあります。Hadoopは、マッパーのワークロードをHadoop Distributed File System (HDFS)全体と各マップ・タスク間にわたって均一に分散しながら、データのローカル性も維持します。これにより、マッパー間のスキューが減ります。

Hadoopはまた、マップ出力キーをすべてのリデューサに均一にハッシュします。この手法は、リデューサの数よりもキーの数のほうがかなり多く、各キーがワークロードのごく一部しか占めていない場合に効果的です。ただし、マッパー出力が少数のキーに集中している場合には効果的ではありません。これらのキーをハッシュするとスキューが発生し、並べ替えなど、レンジ・パーティショニングを必要とするアプリケーションではうまく機能しません。

Perfect Balanceは、最初にデータをサンプリングし、サイズの大きなキーを必要に応じて2つ以上のキーに分割し、ロード認識型のパーティショニング手法を使用してリデューサ・タスクにキーを割り当てることで、ロードを各リデューサに均等に分配します。

4.1.2 Perfect Balanceの実行方法

Perfect Balanceの実行方法は次の2つの中から選択できます。

  • Perfect Balance Driver: hadoopコマンドを使用して、アプリケーション・コードを変更することなく非常に簡単にジョブを実行できます。

  • Perfect Balance API: Perfect Balanceを実行するためのコードを追加して、アプリケーション設定コードの後に実行されるようにすることができます。

いずれの方法も、「Balanced MapReduceジョブの実行」で説明されています。

4.1.3 Perfect Balanceのコンポーネント

Perfect Balanceには次のコンポーネントがあります。

  • Job Analyzer: Perfect Balanceを使用するかどうかの判断材料として、MapReduceジョブに関する統計情報を収集し、レポートします。

  • Counting Reducer: Perfect Balanceの効果を測定するための、追加の統計情報を提供します。

  • Load Balancer: MapReduceジョブの前に実行して、静的パーティション・プランを生成し、プランを使用するジョブを再構成します。バランサには、良好なパーティショニング・プランが生成されしだいデータのサンプリングを停止する、ユーザー構成可能なプログレッシブ・サンプラが含まれます。

  • Driver: Perfect Balanceをhadoopコマンド内で実行できます。

4.2 Perfect Balanceの概要

Perfect Balanceは、次の基本手順に従って使用します。

  1. アプリケーションが次の要件を満たしていることを確認します。

    • ジョブは分散型で、リデュース・キーに関連付けられたレコードのグループを分割しても結果は変わりません。

      分散型でない場合でも、キー分割機能を無効にした後であればPerfect Balanceを実行できます。その場合、Perfect Balanceのメリットは一応は発揮されますが、キー分割が有効な場合ほど均等にはロードが分散されません。oracle.hadoop.balancer.keyLoad.minChopBytes構成プロパティを参照してください。

    • 今リリースでは、マッパー・タスクはHadoop分散キャッシュ内でシンボリック・リンクを使用できません。

      基本的な原則として、ローカル・ジョブ・ランナーを使用して正常に実行できないジョブは、Perfect Balanceで正常に実行できません。たとえば、CDH 4.3 MRv1クラスタ(Oracle Big Data Appliance 2.2上に構成されたものなど)内のローカル・ジョブ・ランナーは、マッパー内でのシンボリック・リンクをサポートしません。

      ローカル・ジョブ・ランナーでジョブを実行するには、次の構成プロパティを設定します。

      mapred.job.tracker=local
      
    • 今リリースでは、コンバイナはサポートされません。ロード・バランシングの見積りは、コンバイナが使用されている場合には不正確になることがあります。

  2. Oracle Big Data Applianceサーバーにログインします。HadoopクライアントからPerfect Balanceを実行することはできません。

  3. Perfect Balanceに付属している例を実行することにより、本製品について理解できます。この章で示しているすべての例は付属の例を基にしており、同じデータ・セットを使用します。「Perfect Balanceの例について」を参照してください。

  4. Bash exportコマンドを使用して次の変数を設定します。

    • HADOOP_CLASSPATH: ${BALANCER_HOME}/jlib/orabalancer.jarと${BALANCER_HOME}/jlib/commons-math-2.2.jarを既存の値に追加します(必要であれば)。アプリケーションのJARファイルも追加します。

    • HADOOP_USER_CLASSPATH_FIRST: trueに設定して、Hadoopがデフォルト・バージョンではなくPerfect Balanceバージョンのcommons-math.jarを使用するようにします。

    • BALANCER_HOME: Perfect Balanceのインストール・ディレクトリ(Oracle Big Data Applianceの/opt/oracle/orabalancer-1.0.0-h2)に設定します(オプション)。この章の例ではこの変数を使用しますが、変数を自分で定義することもできます。Perfect BalanceではBALANCER_HOMEを使用しません。

  5. バランサを使用せずにJob Analyzerを実行し、生成されたレポートを使用して、ジョブがPerfect Balanceの使用に適した候補であるかどうかを判断します。

    「不均衡なリデューサ・ロードに対するジョブの分析」を参照してください。

  6. Perfect Balanceの実行方法を選択します。

    「Perfect Balanceの実行方法」を参照してください。

  7. 設定する構成プロパティを決定します(必要な場合)。構成ファイルを作成するか、hadoopコマンドで設定を個別に入力します。

    「Perfect Balanceの構成について」を参照してください。

  8. Perfect Balanceを使用してジョブを実行します。

    「均衡のとれたMapReduceジョブの実行」を参照してください。

  9. Job Analyzerレポートを使用して、Perfect Balanceを使用する効果を評価します。「Job Analyzerレポートの分析」を参照してください。

  10. Perfect Balanceを使用してジョブを再実行する前に、必要に応じてジョブ構成プロパティを変更します。「Perfect Balanceの構成について」を参照してください。

4.3 Perfect Balanceの例について

Perfect Balanceインストール・ファイルには、すぐに実行できる例の一式が含まれています。InvertedIndex例は、入力した一連のテキスト・ファイルについて転置インデックスを作成するMapReduceアプリケーションです。転置インデックスは、語をテキスト・ファイル内のその語の場所にマップします。入力データは含まれています。

4.3.1 この章の例について

InvertedIndex例は、この章のすべての例の基礎を提供します。これらは同じデータ・セットを使用して同じMapReduceアプリケーションを実行します。InvertedIndex例の変更は、自分のアプリケーションをPerfect Balanceで実行するときに行う必要があるステップをハイライトしているにすぎません。

この章の例を実行する場合、あるいはこれらの例を自分のジョブを実行する際の基礎として使用する場合は、次の変更を行ってください。

  • 自分のアプリケーションを実行するために例を変更している場合は、アプリケーションJARファイルをHADOOP_CLASSPATHおよび-libjarsに追加してください。

  • mapred.input.dirの値がデータの場所を示していることを確認してください。

    invindx/inputディレクトリには、InvertedIndex例のサンプル・データが含まれています。このデータを使用するには、最初に設定してください。「例データ・セットの抽出」を参照してください。

  • jdoeをHadoopユーザー名に置き換えます。

  • -confオプションを、既存の構成ファイルに設定します。

    jdoe_conf_invindx.xmlファイルは、InvertedIndex例の構成ファイルを変更したものです。変更したファイルには、パフォーマンス最適化設定がありません。例構成ファイルはそのまま使用することも、変更することもできます。/opt/oracle/orabalancer-1.0.0-h2/examples/invindx/conf_mapreduce.xml (またはconf_mapred.xml)を参照してください。

  • ファイル内とシェル・スクリプト内の構成設定を見直して、これらがジョブに適切であることを確認してください。

  • ブラウザをノートパソコンから実行することも、あるいはグラフィカル・インタフェースをサポートするクライアント(VNCなど)を使用してOracle Big Data Applianceに接続することもできます。

4.3.2 例データ・セットの抽出

InvertedIndex例を実行したりこの章のいずれかの例を実行するには、最初にデータ・ファイルを設定する必要があります。

InvertedIndexデータ・ファイルを抽出するには、次の手順を実行します。 

  1. Oracle Big Data Applianceサーバーにログインします。

  2. ディレクトリをexamples/invindxサブディレクトリに移動します。

    cd /opt/oracle/orabalancer-1.0.0-h2/examples/invindx
    
  3. データを解凍して、HDFS invindx/inputディレクトリにコピーします。

    ./invindx -setup
    

InvertedIndex例を実行する手順の詳細は、/opt/oracle/orabalancer-1.0.0-h2/examples/invindx/README.txtを参照してください。

4.4 不均衡なリデューサ・ロードに対するジョブの分析

Job Analyzerは、ロードの不均衡を特定するとともに、実際のジョブの実行時にPerfect Balanceによっていかに効果的に不均衡を解消できるかを評価するための、Perfect Balanceの1コンポーネントです。この項の内容は次のとおりです。

4.4.1 Job Analyzerについて

Job Analyzerは、MapReduceジョブの出力ログを使用して、各リデュース・タスクの経過時間やロードなどの統計情報を含んだシンプルなレポートを生成します。デフォルトでは、JobTrackerのユーザー・インタフェースによって表示される標準のHadoopカウンタが使用されますが、リデュース・タスクの相対パフォーマンスとロードを強調するためにデータが整理されるので、結果をより簡単に把握できます。

レポートで、リデューサの処理するロードや実行時間に大きな差が見られる場合、そのアプリケーションはPerfect Balanceの使用対象として適していると言えます。

4.4.1.1 Job Analyzerの実行方法

Job Analyzerの実行方法は次の2つの中から選択できます。

  • スタンドアロン・ユーティリティとして実行する: この場合、Job Analyzerは既存のジョブ出力ログに対して実行されます。この実行方法は、Perfect Balanceを使用せずに実行しているアプリケーションがOracle Big Data Appliance上にすでに存在する場合に適しています。

  • Perfect Balanceを使用して実行する: この場合Job Analyzerは、Perfect Balanceを使用するたびに、現在のジョブの出力ログに対して自動的に実行されます。ジョブがPerfect Balanceの適用対象として適切かどうかを判断するために、ジョブがバランサなしで実行されるように構成プロパティを設定することもできます。

4.4.2 Job Analyzerをスタンドアロン・ユーティリティとして実行する

Job Analyzerをスタンドアロン・ユーティリティとして実行すると、以前に実行されたジョブのリデュース・ロードをすばやく分析できます。

Job Analyzerをスタンドアロン・ユーティリティとして実行するには、次の手順に従います。 

  1. Oracle Big Data Applianceサーバーにログインします。HadoopクライアントからJob Analyzerを実行することはできません。

  2. 分析するジョブからの出力ファイルを探します。mapred.output.dirをこのディレクトリに設定します。

  3. 「Job Analyzerユーティリティの構文」の説明に従って、Job Analyzerを実行します。

  4. Job Analyzerレポートをブラウザで参照します。

4.4.2.1 Job Analyzerユーティリティの例

例4-1では、必要な変数を設定し、jdoe_nobal_outdirに保存されたMapReduceジョブのログを使用して、デフォルトの場所にレポートを作成するスクリプトが実行されます。その後、HTMLバージョンのレポートがHDFSから/home/jdoeローカル・ディレクトリにコピーされ、ブラウザでレポートが開かれます。

この例を実行する場合は、jdoe_nobal_outdirを、前のジョブ実行の出力ログへのHDFSパスに置き換えます。InvertedIndex例を実行したときの出力ログを使用できます。デフォルトのHDFS出力ディレクトリはinvindx/outputにあります。「Perfect Balanceの例について」を参照してください。

例4-1 Job Analyzerユーティリティの実行

$ cat runja.sh

BALANCER_HOME=/opt/oracle/orabalancer-1.0.0-h2
export HADOOP_CLASSPATH=${BALANCER_HOME}/jlib/orabalancer.jar:${BALANCER_HOME}/jlib/commons-math-2.2.jar:$HADOOP_CLASSPATH
export HADOOP_USER_CLASSPATH_FIRST=true

hadoop jar ${BALANCER_HOME}/jlib/orabalancer.jar oracle.hadoop.balancer.tools.JobAnalyzer \
-D mapred.output.dir=jdoe_nobal_outdir

$ sh ./runja.sh
$
$ hadoop fs -get jdoe_nobal_outdir/_balancer/jobanalyzer-report.html /home/jdoe
$ cd /home/jdoe
$ firefox jobanalyzer-report.html

4.4.2.2 Job Analyzerユーティリティの構文

Job Analyzerユーティリティを実行するための構文を次に示します。

bin/hadoop jar ${BALANCER_HOME}/jlib/orabalancer.jar oracle.hadoop.balancer.tools.JobAnalyzer \
-D mapred.output.dir=job_output_dir \
[ja_report_path]
job_output_dir

以前のアプリケーション実行時にジョブ・ファイルが保存されたHDFSディレクトリ。

ja_report_path

Job Analyzerが自身のレポートを作成するHDFSディレクトリ(オプション)。デフォルトのディレクトリは、job_output_dir/_balancerです。

4.4.3 Job AnalyzerをPerfect Balance Driverとともに実行する

Job Analyzerは、Perfect Balanceを使用するたびに自動的に実行されます。アプリケーションをOracle Big Data Appliance上で初めて実行する場合、必要であれば、Perfect Balance内のジョブをバランサなしで実行するように設定することもできます。その場合、ジョブはデフォルトのHadoopパーティショニング手法を使用して実行されます。追加の統計情報を収集するようにJob Analyzerを構成することもできます。分析結果からロードのスキューが見受けられる場合は、バランサを再度有効にした後、後続の実行にPerfect Balance内の同じ基本設定を使用できます。

Job Analyzerをバランサなしで実行するには、次の手順に従います。 

  1. Oracle Big Data Applianceサーバーにログインします。HadoopクライアントからJob Analyzerを実行することはできません。

  2. バランサが実行されないようにするために、oracle.hadoop.balancer.driver.balance構成プロパティをfalseに設定します。

  3. 追加の統計情報を収集し、今後の実行の構成に関する推奨事項を取得するには、oracle.hadoop.balancer.tools.useCountingReducerおよびoracle.hadoop.balancer.tools.printRecommendation構成プロパティをtrueに設定します。

    「追加メトリックの収集」を参照してください。

  4. 設定する追加構成プロパティを決定します(必要な場合)。

    「Job Analyzerのプロパティ」を参照してください。

  5. Perfect Balanceドライバを使用してジョブを実行します。


注意:

Perfect Balance APIでは、oracle.hadoop.balancer.driver.balanceおよびoracle.hadoop.balancer.tools.useCountingReducerは使用されません。

ジョブのリデュース・タスクに、Hadoopのデフォルトのロード分散が使用されます。

4.4.3.1 Job Analyzerの例

例4-2では、必要な変数を設定し、Perfect Balanceドライバを使用してバランサなしでジョブを実行し、デフォルトの場所にレポートを作成するスクリプトが実行されます。その後、HTMLバージョンのレポートがHDFSから/home/jdoeローカル・ディレクトリにコピーされ、ブラウザでレポートが開かれます。

この例を実行する場合は、「この章の例について」を参照してください。出力には警告も含まれますが、無視してください。

例4-2 Perfect BalanceでのJob Analyzerの実行

$ cat ja_nobalance.sh

BALANCER_HOME=/opt/oracle/orabalancer-1.0.0-h2
export HADOOP_CLASSPATH=${BALANCER_HOME}/jlib/orabalancer.jar:${BALANCER_HOME}/jlib/commons-math-2.2.jar:$HADOOP_CLASSPATH
export HADOOP_USER_CLASSPATH_FIRST=true
 
hadoop jar ${BALANCER_HOME}/jlib/orabalancer.jar oracle.hadoop.balancer.BalancerDriver \
 -D mapred.input.dir=invindx/input \
 -D mapred.output.dir=jdoe_nobal_outdir \
 -D mapred.job.name=nobal \
 -D mapred.reduce.tasks=10 \
 -D oracle.hadoop.balancer.driver.balance=false \
 -D oracle.hadoop.balancer.tools.useCountingReducer=true \
 -D oracle.hadoop.balancer.tools.printRecommendation=true \
 -conf /home/jdoe/jdoe_conf_invindx.xml \
 -libjars ${BALANCER_HOME}/jlib/commons-math-2.2.jar,${BALANCER_HOME}/jlib/orabalancer.jar

]$ sh ja_nobalance.sh
13/06/26 16:07:12 INFO balancer.BalancerDriver: Submitting job
13/06/26 16:07:13 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
13/06/26 16:07:14 WARN mapred.JobClient: No job jar file set.  User classes may not be found. See JobConf(Class) or JobConf#setJar(String).
13/06/26 16:07:14 INFO input.FileInputFormat: Total input paths to process : 5
13/06/26 16:07:14 INFO mapred.JobClient: Running job: job_201305031125_0016
13/06/26 16:07:16 INFO mapred.JobClient:  map 0% reduce 0%
13/06/26 16:07:34 INFO mapred.JobClient:  map 5% reduce 0%
     .
     .
     .
13/06/26 16:11:06 INFO mapred.JobClient:     Reduce input records=20000000
13/06/26 16:11:06 INFO mapred.JobClient:     Reduce output records=13871794
13/06/26 16:11:06 INFO mapred.JobClient:     Spilled Records=60000000
13/06/26 16:11:06 INFO mapred.JobClient:     CPU time spent (ms)=184330
13/06/26 16:11:06 INFO mapred.JobClient:     Physical memory (bytes) snapshot=3421863936
13/06/26 16:11:06 INFO mapred.JobClient:     Virtual memory (bytes) snapshot=10147790848
13/06/26 16:11:06 INFO mapred.JobClient:     Total committed heap usage (bytes)=2158821376


$ hadoop fs -get jdoe_nobal_outdir/_balancer/jobanalyzer-report.html /home/jdoe
$ cd /home/jdoe
$ firefox jobanalyzer-report.html

4.4.3.2 追加メトリックの収集

oracle.hadoop.balancer.tools.useCountingReducer構成プロパティをtrueに設定すると、Job Analyzerレポートに各リデュース・キーのロード・メトリックが記載されます。この追加情報を使用すると、標準のHadoopカウンタでは使用できないメトリックを使用して、各リデューサのロードを詳細に把握できます。

Job Analyzerレポートではまた、レポートの予測ロードと、CountingReducerによって測定された実際のロードを比較することもできます。これらの値の違いに基づいて、Perfect Balanceがジョブの均衡化にどれほど効果を発揮しているか測定できます。

また、oracle.hadoop.balancer.tools.printRecommendationtrueに設定すると、Job Analyzerはキー・ロード・モデルに対する推奨のキー・ロード係数を提示します(可能な場合)。これらの推奨値は、次の構成プロパティを設定するために使用できます。

ジョブを再度実行すると、これらの係数によってジョブがさらに均衡化されます。

4.4.4 Job Analyzerレポートの分析

Job Analyzerは、レポートの内容を2つの形式で記述します。HTML (ユーザー用)とXML (Perfect Balance用)です。HTMLバージョンは、HDFSからローカル・ファイル・システムにコピーし、ブラウザで開きます(前出の例を参照)。

Job Analyzerレポートの内容を調べる際には、次のようなスキューの指標を探します。

  • 一部のリデューサの実行時間が他のものよりも長い。

  • 一部のリデューサが他のリデューサよりも多くのレコードやバイトを処理している。

  • 一部のマップ出力キーのレコード数が他のものよりも多い。

  • 一部のマップ出力レコードのバイト数が他のものよりも多い。

図4-1は、転置インデックス(invindx)の例に対するアナライザ・レポートの一部を示したものです。このジョブは適切な構成設定を使用して実行されたため、図にはキー・ロード係数の推奨値が表示されています。「追加メトリックの収集」を参照してください。

タスクIDは、特定のタスクの分析結果を示すテーブルへのリンクです。これにより、最初のサマリー・テーブルからより詳細なデータへとドリルダウンできます。

この例では極端に小さなデータ・セットが使用されていますが、タスク7と8の間の差に注目してください。入力レコードの差が3%と29%で大きく開いており、対応する経過時間の差も9秒と15秒で大きく開いています。この開きはスキューの発生を示しています。一方、タスク0と4は実行時間に大きな差異がありますが、処理したデータの量はほぼ同じです。この差異は、スキューではなく、他の要因によって生じたものです。

図4-1 不均衡な転置インデックス・ジョブのJob Analyzerレポート

図4-1の説明が続きます
「図4-1 不均衡な転置インデックス・ジョブのJob Analyzerレポート」の説明

4.5 均衡のとれたMapReduceジョブの実行

アプリケーションは、Perfect BalanceのドライバまたはAPIを使用して実行できます。「Perfect Balanceの実行方法」を参照してください。

4.5.1 Perfect Balanceドライバの使用

次に示すのは、Perfect Balanceを使用してジョブを実行するための構文です。

bin/hadoop jar ${BALANCER_HOME}/jlib/orabalancer.jar oracle.hadoop.balancer.BalancerDriver \
-D application_config_property \
-D perfect_balance_config_property \
-conf application_config_file.xml \
-conf perfect_balance_config_file.xml \
-libjars ${BALANCER_HOME}/jlib/commons-math-2.2.jar,${BALANCER_HOME}/jlib/orabalancer.jar,application_jar_path.jar...

コマンドには、任意の汎用hadoopコマンドライン・オプションを含めることができます。このドライバは、org.apache.hadoop.util.Toolインタフェースを実装し、MapReduceアプリケーションを構築する標準的なHadoopの方法に従います。Perfect BalanceのプロパティとMapReduceのプロパティは同じ構成ファイル内で組み合せて使用できます。「Perfect Balanceの構成について」を参照してください。

例4-3では、pb_balance.shというスクリプトが実行されます。このスクリプトは、Perfect Balanceドライバを使用してジョブを実行します。キー・ロード・メトリック・プロパティは、図4-1で示したJob Analyzerレポートの推奨値に設定されます。

例4-3 Perfect Balanceドライバを使用したジョブの実行

$ cat runinvindx.sh

BALANCER_HOME=/opt/oracle/orabalancer-1.0.0-h2
export HADOOP_CLASSPATH=${BALANCER_HOME}/jlib/orabalancer.jar:${BALANCER_HOME}/jlib/commons-math-2.2.jar:$HADOOP_CLASSPATH
export HADOOP_USER_CLASSPATH_FIRST=true
 
 
hadoop jar ${BALANCER_HOME}/jlib/orabalancer.jar oracle.hadoop.balancer.BalancerDriver \
 -D mapred.input.dir=invindx/input \
 -D mapred.output.dir=jdoe_outdir \
 -D mapred.job.name=jdoe_invindx \
 -D mapred.reduce.tasks=10 \
 -D oracle.hadoop.balancer.tools.useCountingReducer=true \
 -D oracle.hadoop.balancer.tools.printRecommendation=true \
 -D oracle.hadoop.balancer.linearKeyLoad.keyWeight=107.35396359 \
 -D oracle.hadoop.balancer.linearKeyLoad.rowWeight=0.00148810 \
 -D oracle.hadoop.balancer.linearKeyLoad.byteWeight=0.0 \
 -conf /home/jdoe/jdoe_conf_invindx.xml \
 -libjars ${BALANCER_HOME}/jlib/commons-math-2.2.jar,${BALANCER_HOME}/jlib/orabalancer.jar

$ sh ./runinvindx.sh
13/06/27 09:01:53 INFO balancer.Balancer: Creating balancer
13/06/27 09:01:53 INFO input.FileInputFormat: Total input paths to process : 5
13/06/27 09:01:54 INFO balancer.Balancer: Starting Balancer
13/06/27 09:02:00 INFO balancer.Balancer: Balancer completed
13/06/27 09:02:00 INFO balancer.BalancerDriver: Submitting job
     .
     .
     .

4.5.2 Perfect Balance APIの使用

oracle.hadoop.balancer.Balancerクラスには、パーティショニング・プランを作成したり、プランをファイルに保存したり、プランを使用してMapReduceジョブを実行したりするためのメソッドが含まれています。コードをJavaクラスに追加するだけでよく、アプリケーションを再設計する必要はありません。シェル・スクリプトを実行してアプリケーションを実行する際には、Perfect Balanceの構成設定を含めることができます。

4.5.2.1 Perfect Balanceを使用するためのJavaコードの変更

Perfect Balanceのインストール・ディレクトリには、Perfect Balance APIを使用するJava MapReduceプログラムの完全な例(入力データを含む)が含まれています。

転置インデックスの例と実行方法については、orabalancer-1.0.0-h2/examples/invindx/README.txtを参照してください。

変更されたJavaコードを探すには、orabalancer-1.0.0-h2/examples/jsrc/oracle/hadoop/balancer/examples/invindx/InvertedIndexMapred.javaまたはInvertedIndexMapreduce.javaを参照してください。

Perfect Balanceを実行するための変更には、次のものが含まれます。

  • oracle.hadoop.balancer.useMapreduceApi構成プロパティは、mapredまたはmapreduce APIのアプリケーションの使用を識別します。

  • createBalancerメソッドは、構成プロパティを検証し、Balancerインスタンスを返します。

  • waitForCompletionメソッドは、データをサンプリングし、パーティショニング・プランを作成します。

  • addBalancingPlanメソッドは、パーティショニング・プランをジョブ構成設定に追加します。

  • configureCountingReducerメソッドは、リデューサ・ロードを分析するためのデータを収集するカウンティング・リデューサでアプリケーションを構成します(oracle.hadoop.balancer.tools.useCountingReducerプロパティがtrueに設定されている場合)。

  • saveメソッドは、パーティショニング・レポートを保存し、Job Analyzerレポートを生成します。

例4-4は、転置インデックスのJavaコードの一部を示したものです。

例4-4 MapReduceジョブでのPerfect Balanceの実行

     .
     .
     .
import oracle.hadoop.balancer.Balancer;
     .
     .
     .
///// BEGIN: CODE TO INVOKE BALANCER (PART-1, before job submission) //////
    Balancer balancer = null;
    
    // Specify the old mapred api
    job.setBoolean("oracle.hadoop.balancer.useMapreduceApi", false);
    
    boolean useBalancer = job.getBoolean(InvertedIndex.PROP_USE_BALANCER, 
        InvertedIndex.DEFAULT_USE_BALANCER);
    if(useBalancer)
    {
      balancer = Balancer.createBalancer(job);
      balancer.waitForCompletion();
      balancer.addBalancingPlan(job);
    }
    
    if(job.getBoolean("oracle.hadoop.balancer.tools.useCountingReducer", true))
    {
      Balancer.configureCountingReducer(job);
    }
    ////////////// END: CODE TO INVOKE BALANCER (PART-1) //////////////////////
    
    RunningJob rj = JobClient.runJob(job);
    
    ///////////////////////////////////////////////////////////////////////////
    // BEGIN: CODE TO INVOKE BALANCER (PART-2, after job completion, optional)
    // If balancer ran, this saves the partition file report into the _balancer
    // subdirectory of the job output directory. It also writes a JobAnalyzer
    // report.
    Balancer.save(rj, job);
    ////////////// END: CODE TO INVOKE BALANCER (PART-2) //////////////////////
     .
     .
     .
}

関連項目:

Oracle Big Data Appliance Perfect Balance Java APIリファレンス

4.5.2.2 変更したJavaコードとPerfect Balanceの実行

変更したJavaコードを実行する際には、標準のhadoopコマンド構文を使用してPerfect Balanceプロパティを設定できます。

bin/hadoop jar application_jarfile.jar ApplicationClass \
-conf application_config.xml \
-conf perfect_balance_config.xml \
-D application_config_property \
-D perfect_balance_config_property \
-libjars /opt/oracle/orabalancer-1.0.0-h2/jlib/commons-math-2.2.jar,/opt/oracle/orabalancer-1.0.0-h2/jlib/orabalancer.jar,application_jar_path.jar...

例4-5では、pb_balanceapi.shというスクリプトが実行されます。このスクリプトは、Perfect Balance JARファイルにパッケージされたInvertedIndexMapreduceクラスの例を実行します。キー・ロード・メトリック・プロパティは、図4-1で示したJob Analyzerレポートの推奨値に設定されます。

InvertedIndexMapreduceクラスの例を実行するには、「Perfect Balanceの例について」を参照してください。

例4-5 InvertedIndexMapreduceクラスの実行

$ cat pb_balanceapi.sh
BALANCER_HOME=/opt/oracle/orabalancer-1.0.0-h2
APP_JAR_FILE=/opt/oracle/orabalancer-1.0.0-h2/jlib/orabalancer.jar
export HADOOP_CLASSPATH=${BALANCER_HOME}/jlib/orabalancer.jar:${BALANCER_HOME}/jlib/commons-math-2.2.jar:$HADOOP_CLASSPATH
export HADOOP_USER_CLASSPATH_FIRST=true

hadoop jar ${APP_JAR_FILE} oracle.hadoop.balancer.examples.invindx.InvertedIndexMapreduce \
 -D mapred.input.dir=invindx/input \
 -D mapred.output.dir=jdoe_outdir_api \
 -D mapred.job.name=jdoe_invindx_api \
 -D mapred.reduce.tasks=10 \
 -D oracle.hadoop.balancer.tools.useCountingReducer=true \
 -D oracle.hadoop.balancer.tools.printRecommendation=true \
 -D oracle.hadoop.balancer.linearKeyLoad.keyWeight=107.35396359 \
 -D oracle.hadoop.balancer.linearKeyLoad.rowWeight=0.00148810 \
 -D oracle.hadoop.balancer.linearKeyLoad.byteWeight=0.0 \
-libjars ${BALANCER_HOME}/jlib/commons-math-2.2.jar,${BALANCER_HOME}/jlib/orabalancer.jar

$ sh ./balanceapi.sh
13/06/24 17:21:47 INFO balancer.Balancer: Creating balancer
13/06/24 17:21:48 INFO input.FileInputFormat: Total input paths to process : 5
13/06/24 17:21:48 INFO balancer.Balancer: Starting Balancer
13/06/24 17:21:54 INFO balancer.Balancer: Balancer completed
     .
     .
     .

4.6 Perfect Balanceレポートについて

Perfect Balanceは、ジョブの実行時に次のレポートを生成します。

  • ジョブ内のロードの分散に関する様々な指標を含んだJob Analyzerレポート。このレポートは、ユーザー用のHTML形式と、Perfect Balanceで使用するためのXML形式で保存されます。このレポートには常に、jobanalyzer-report.htmlおよび-.xmlという名前が付けられます。「Job Analyzerレポートの分析」を参照してください。

  • 様々なマッパーに割り当てられたキーを識別するパーティション・レポート。このレポートは、Perfect Balanceで使用するためのXML形式で保存されます。ユーザーが使用するための情報は含まれません。このレポートには、${mapred_output_dir}/_balancer/orabalancer_report.xmlという名前が付けられます。

  • 適切な構成プロパティが設定されている場合に、各ファイル・パーティションに対してPerfect Balanceが生成するリデュース・キー・メトリック・レポート。これらのレポートは、Perfect Balanceで使用するためのXML形式で保存されます。ユーザーが使用するための情報は含まれません。これらのレポートには、${mapred_output_dir}/_balancer/ReduceKeyMetricList-attempt_jobid_taskid_task_attemptid.xmlという名前が付けられます。

    「追加メトリックの収集」を参照してください。

これらのレポートは、デフォルトではジョブの出力ディレクトリ(${mapred.output.dir})に保存されます。次に示すのは、このディレクトリの構造です。

job_output_directory
   /_SUCCESS
   /_balancer
      ReduceKeyMetricList-attempt_201305031125_0016_r_000000_0.xml
      ReduceKeyMetricList-attempt_201305031125_0016_r_000001_0.xml
        .
        .
        .
     jobanalyzer-report.html
     jobanalyzer-report.xml
   /_logs
      /history
         job_201305031125_0016_1372277234720_jdoe_invindx_nobal
         localhost.localdomain_1367594758596_job_201305031125_0016_conf.xml
   /part-r-00000
   /part-r-00001
     .
     .
     .

4.7 Perfect Balanceの構成について

Perfect Balanceでは、コマンドラインでの構成プロパティの指定に、標準のHadoopメソッドが使用されます。ユーザーは、-confオプションを使用して構成ファイルを特定できます。または、-Dオプションを使用して個別のプロパティを指定できます。Perfect Balanceのすべての構成プロパティにはデフォルト値があるため、各プロパティの設定は任意です。

『Perfect Balance構成プロパティ・リファレンス』には、構成プロパティがアルファベット順でリストされており、それらの詳しい説明が記載されています。次に示すのは、プロパティの機能グループです。

BalancerDriverプロパティ 

Job Analyzerプロパティ 

キー分割プロパティ 

ロード・バランシング・プロパティ 

ロード・モデル・プロパティ 

MapReduce関連プロパティ 

パーティション・レポート・プロパティ 

サンプラ・プロパティ 

4.8 Perfect Balance構成プロパティ・リファレンス

このセクションでは、Perfect Balanceの構成プロパティと、Perfect Balanceがジョブ構成から読み取るいくつかの汎用Hadoop MapReduceプロパティについて説明します。

MapReduce構成プロパティ 

mapred.input.dir

型: String

デフォルト値: 定義されていません。

説明: コンマで区切られた、入力ディレクトリのリスト。

mapred.input.format.class

型: String

デフォルト値: org.apache.hadoop.mapred.TextInputFormat

説明: InputFormatクラスのフル・ネーム。

mapred.mapper.class

型: String

デフォルト値: org.apache.hadoop.mapred.lib.IdentityMapper

説明: マッパー・クラスのフル・ネーム。

mapred.output.dir

型: String

デフォルト値: 定義されていません。

説明: ジョブの出力ディレクトリ。

mapred.ouput.format.class

型: String

デフォルト値: org.apache.hadoop.mapred.TextOutputFormat

説明: OutputFormatクラスのフル・ネーム。

mapred.partitioner.class

型: String

デフォルト値: org.apache.hadoop.mapred.lib.HashPartitioner

説明: パーティショナ・クラスのフル・ネーム。

mapred.reducer.class

型: String

デフォルト値: org.apache.hadoop.mapred.lib.IdentityReducer

説明: リデューサ・クラスのフル・ネーム。

mapreduce.inputformat.class

型: String

デフォルト値: org.apache.hadoop.mapreduce.lib.input.TextInputFormat

説明: InputFormatクラスのフル・ネーム。

mapreduce.map.class

型: String

デフォルト値: org.apache.hadoop.mapreduce.Mapper

説明: マッパー・クラスのフル・ネーム。

mapreduce.outputformat.class

型: String

デフォルト値: org.apache.hadoop.mapreduce.lib.output.TextOutputFormat

説明: OutputFormatクラスのフル・ネーム。

mapreduce.partitioner.class

型: String

デフォルト値: org.apache.hadoop.mapreduce.lib.partition.HashPartitioner

説明: パーティショナ・クラスのフル・ネーム。

mapreduce.reduce.class

型: String

デフォルト値: org.apache.hadoop.mapreduce.Reducer

説明: リデューサ・クラスのフル・ネーム。

Perfect Balance構成プロパティ 

oracle.hadoop.balancer.confidence

: Float

デフォルト値: 0.95

説明: oracle.hadoop.balancer.maxLoadFactorプロパティによって指定された負荷係数に対する統計的信頼指標。

このプロパティは、0.5以上、1.0未満(0.5 <= < 1.0)の値を受け入れます。値が0.5未満の場合、プロパティがデフォルト値に再設定されます。0.9以上の値をお薦めします。典型的な値は、0.95と0.99です。

oracle.hadoop.balancer.driver.balance

: Boolean

デフォルト値: true

説明: BalancerDriverクラスでバランサを実行するかどうかを制御します。falseに設定すると、バランシングがオフになります。このプロパティはPerfect Balanceドライバで使用され、APIでは使用されません。

oracle.hadoop.balancer.enableSorting

: Boolean

デフォルト値: false

説明: マップ出力キーをチョップ(分割)するかどうかを制御します。

  • false: ハッシュ関数を使用します。

  • true: マップ出力キーのソーティング・コンパレータをトータルオーダー・パーティショニング関数として使用します。バランサは、分割されたキーの値に対するトータル・オーダーを保存します。

oracle.hadoop.balancer.inputFormat.mapred.map.tasks

: Integer

デフォルト値: 100

説明: 入力形式のgetSplitsを呼び出す直前に、Hadoopのmapred.map.tasksプロパティをサンプリングの継続時間用に設定します。実際のジョブのmapred.map.tasksは変更しません。最適なマップ・タスク数は、良好なサンプルの取得(より大きい数)と限定されたメモリー・リソース(より小さい数)との間のトレードオフになります。

このプロパティは1以上の値に設定してください。1未満の値に設定すると、プロパティが無効になります。

一部の入力形式(DBInputFormatなど)では、このプロパティはgetSplitsによって返される分割数を決定するためのヒントとして使用されます。値が高いほど、より大きなデータ・チャンクがランダムにサンプリングされ、サンプルが改善されます。

値を高くすると、より大きいデータ・セットを取得できます(たとえば、行当たり約100バイトで数百行を取得するなど)。ただし、極端に大きな値を設定すると、入力形式のgetSplitsメソッドから返される分割が増えすぎて、メモリーが不足する可能性があります。

oracle.hadoop.balancer.inputFormat.mapred.max.split.size

: Long

デフォルト値: 1048576 (1 MB)

説明: 入力形式のgetSplitsを呼び出す直前に、Hadoopのmapred.max.split.sizeプロパティをサンプリングの継続時間用に設定します。実際のジョブのmapred.max.split.sizeは変更しません。

このプロパティは1以上の値に設定してください。1未満の値に設定すると、プロパティが無効になります。最適な分割サイズは、良好なサンプルの取得(より少ない分割数)と効率的なI/Oパフォーマンス(より多い分割数)との間のトレードオフになります。

一部の入力形式(FileInputFormatなど)では、最大分割サイズはgetSplitsによって返される分割数を決定するためのヒントとして使用されます。分割サイズが小さいほど、より大きなデータ・チャンクがランダムにサンプリングされ、サンプルが改善されます。良好なパフォーマンスでサンプリングできるよう、なるべく小さい値を設定しますが、あまり小さくしすぎないようにしてください。極端に小さな値を設定すると、I/Oパフォーマンスが非効率になり、サンプルが改善されません。

大きなデータ・セット(数十TB)を取得しようとして値を高くすると、入力形式のgetSplitsメソッドからメモリー不足エラーがスローされる場合があります。分割が大きいと、I/Oパフォーマンスは高まりますが、サンプリング品質は低下します。

oracle.hadoop.balancer.keyLoad.class

: Class

デフォルト値: oracle.hadoop.balancer.KeyLoadLinear

説明: oracle.hadoop.balancer.KeyLoadインタフェースを実装するクラスの名前。

oracle.hadoop.balancer.keyLoad.minChopBytes

: Long

デフォルト値: 0

説明: Perfect Balanceでマップ出力キーを中間キーに分割するかどうかを制御します。

  • -1: Perfect Balanceは大きなマップ出力キーを分割しません。

  • 0: Perfect Balanceは大きなマップ出力キーを分割し、各中間キーの最適なサイズを決定します。

  • 正の整数: Perfect Balanceは大きなマップ出力キーを指定された整数以上のサイズで中間キーに分割します。

oracle.hadoop.balancer.linearKeyLoad.byteWeight

: Float

デフォルト値: 0.05

説明: oracle.hadoop.balancer.KeyLoadLinearクラスによって指定された線形キー・ロード・モデル内の、キー当たりのバイト数を決定します。

oracle.hadoop.balancer.linearKeyLoad.keyWeight

: Float

デフォルト値: 50.0

説明: oracle.hadoop.balancer.KeyLoadLinearクラスによって指定された線形キー・ロード・モデル内の、大きなキー当たりの中間キー数を決定します。

oracle.hadoop.balancer.linearKeyLoad.rowWeight

: Float

デフォルト値: 0.05

説明: oracle.hadoop.balancer.KeyLoadLinearクラスによって指定された線形キー・ロード・モデル内のキー当たりの行数を決定します。

oracle.hadoop.balancer.maxLoadFactor

: Float

デフォルト値: 0.05

説明: バランサのパーティション・プランで達成するターゲット・リデューサ負荷係数。

負荷係数とは、見積り値からの相対偏差です。たとえば、maxLoadFactor=0.05かつconfidence=0.95の場合、信頼度が95%より高ければ、ジョブのリデューサ・ロードはパーティション・プランの値よりも(最大で)5%大きくなります。

これら2つのプロパティの値により、サンプラの停止条件が決定されます。バランサは、指定された負荷係数を指定された信頼度で保証するプランを生成できるかぎり、サンプリングを継続します。この保証では、他の停止条件(サンプル数がoracle.hadoop.balancer.maxSamplesPctを超えるなど)によってサンプラが早期に停止するケースは対象外とされる場合があります。停止条件はパーティション・レポートに記録されます。

oracle.hadoop.balancer.confidenceを参照してください。

oracle.hadoop.balancer.maxSamplesPct

: Float

デフォルト値: 0.01 (1%)

説明: Perfect Balanceが収集できるサンプル数を、総入力レコードのごく一部に制限します。ゼロより小さい値を設定すると、プロパティは無効(無制限)になります。

リデューサ・パーティションがきわめて不均一な場合や、マップ出力キーが高密度でクラスタ化されている場合には、Hadoopアプリケーションの値を高くすることが必要になることがあります。これらの場合、サンプラは良好なパーティショニング・プランを達成するためにより多くのデータをサンプリングする必要があります。

oracle.hadoop.balancer.useClusterStatsを参照してください。

oracle.hadoop.balancer.minSplits

: Integer

デフォルト値: 5

説明: サンプラが読み取る最小分割数を設定します。総分割数がこの値よりも少ない場合、サンプラはすべての分割を読み取ります。このプロパティは、1以上の値に設定してください。正の数以外を指定すると、プロパティは1に設定されます。

oracle.hadoop.balancer.numThreads

: Integer

デフォルト値: 5

説明: サンプラ・スレッドの数。この値は、ジョブが開始されるノードで使用可能なプロセッサとメモリー・リソースに基づいて設定します。サンプラ・スレッドの数を増やすほど、より多くのサンプリングが並行処理されます。このプロパティを(1)に設定すると、サンプラでのマルチスレッディングは無効になります。

oracle.hadoop.balancer.report.overwrite

: Boolean

デフォルト値: false

説明: Perfect Balanceがoracle.hadoop.balancer.reportPathプロパティによって指定された場所のファイルを上書きするかどうかを制御します。デフォルトでは、Perfect Balanceはファイルを上書きしません(例外をスローします)。このプロパティをtrueに設定すると、パーティション・レポートの上書きが許可されます。

oracle.hadoop.balancer.reportPath

型: String

デフォルト値: directory/orabalancer_report-random_unique_string.xml(HDFS用のディレクトリは、ジョブを送信するユーザーのホーム・ディレクトリ)。ローカル・ファイル・システム用のディレクトリは、ジョブが送信されるディレクトリです。

説明: Hadoopジョブ出力ディレクトリが使用可能になる前(つまり、MapReduceジョブが実行を完了する前)に、Perfect Balanceがパーティション・レポートを書き込む場所のパス。ジョブの最後に、Perfect Balanceはファイルをjob_output_dir/_balancer/orabalancer_report.xmlに移動します。APIでは、saveメソッドがこのタスクを実行します。

oracle.hadoop.balancer.submitJobを参照してください。

oracle.hadoop.balancer.submitJob

: Boolean

デフォルト値: true

説明: BalancerDriverクラスがHadoopジョブを実行用に送信するかどうかを制御します。falseに設定した場合、ジョブは実行されません。その場合、パーティション・レポートはoracle.hadoop.balancer.reportPathによって識別されたパスに保存されます。

oracle.hadoop.balancer.tmpDir

型: String

デフォルト値: /tmp/orabalancer-user_name

説明: ジョブ出力ディレクトリ(HDFSまたはローカル)のファイル・システム内にあるステージング・ディレクトリへのパス。Perfect Balanceは、ディレクトリが存在していなければディレクトリを作成し、パーティション・レポートをそこにコピーして、Hadoop分散キャッシュにロードできるようにします。

oracle.hadoop.balancer.tools.jobConfPath

型: String

デフォルト値: ${mapred.output.dir}/_logs/history

説明: Hadoopジョブ構成ファイルへのパス。Job Analyzerは、この設定を使用してファイル場所を特定します。

oracle.hadoop.balancer.tools.jobHistoryPath

型: String

デフォルト値: ${mapred.output.dir}/_logs/history

説明: Hadoopジョブ履歴ファイルへのパス。Job Analyzerは、この設定を使用してファイル場所を特定します。

oracle.hadoop.balancer.tools.printRecommendation

: Boolean

デフォルト値: false

説明: Job Analyzerが、各キーについて収集した経過時間、入力レコード、入力値のバイト統計に基づいて、キー・ロード・モデル・プロパティの推奨値を提示するかどうかを制御します。Job Analyzerは、信頼度の高い推奨値を提示できない場合、レポート内に推奨値を出力しません。ユーザーは、均衡のとれたジョブを実行するために、ロード・モデル・プロパティをこれらの推奨値に設定できます。「ロード・モデル・プロパティ」を参照してください。

oracle.hadoop.balancer.tools.useCountingReducer

: Boolean

デフォルト値: false

説明: Job Analyzerがジョブ内の各リデュース・タスクについてロード統計を収集できるかどうかを制御します。trueに設定すると、統計情報の収集が許可されます。このプロパティはPerfect Balanceドライバで使用され、APIでは使用されません。

oracle.hadoop.balancer.tools.writeKeyBytes

: Boolean

デフォルト値: false

説明: カウンティング・リデューサがJob Analyzer用のリデュース・キーのバイト表現を収集するかどうかを制御します。このプロパティをtrueに設定すると、レポート内で一意のキー値がbase64で表現されます。レポート内には、キーの文字列表現(key.toStringを使用して作成されたもの)も記載されます。この文字列値は各キーに対して一意でない場合があります。

oracle.hadoop.balancer.useClusterStats

: Boolean

デフォルト値: true

説明: サンプラがクラスタ・サンプリング統計情報を使用できるようにします。これらの統計情報は、マップ出力キーがすべての入力分割に対して個別に分散されているのではなく、各入力分割に対してクラスタ内で分散されている場合に、サンプリングされた見積り値(マップ出力キー内のレコード数など)の精度を改善します。

このプロパティは、マップ出力キーがクラスタ化されていないことが確実にわかっている場合にのみ、falseに設定してください。この設定は、クラスタリングが一切存在しない場合にのみ、サンプラの見積りを改善します。マップ出力キーの分散は通常確認されないので、このプロパティはtrueのままにしておくことをお薦めします。

oracle.hadoop.balancer.useMapreduceApi

: Boolean

デフォルト値: true

説明: Hadoopジョブで使用されるMapReduce APIを識別します。

  • true: ジョブはmapreduce APIを使用します。

  • false: ジョブはmapred APIを使用します。