GridMixは、Hadoopクラスタのベンチマークツールです。本番環境の負荷からマイニングされたプロファイルをモデル化し、合成ジョブの組み合わせを送信します。このバージョンのツールは、ボトルネックを特定し、開発をガイドするために、本番ジョブリソースのプロファイルをモデル化しようとします。
GridMixを実行するには、特定のクラスタのジョブミックスを記述したMapReduceジョブトレースが必要です。このようなトレースは、通常Rumenによって生成されます。GridMixは、合成ジョブがバイトを読み取る入力データも必要とします。合成ジョブは現在バイナリリーダーであるため、入力データは特定の形式である必要はありません。新しいクラスタで実行している場合は、入力データを生成するオプションの手順が実行の前に実行される場合があります。特定のクラスタの本番ジョブの負荷を同じまたは別のクラスタでエミュレートするには、次の手順に従います。
本番クラスタでジョブ履歴ファイルを見つけます。この場所は、クラスタの`mapreduce.jobhistory.done-dir`または`mapreduce.jobhistory.intermediate-done-dir`設定プロパティで指定されます。(MapReduce historyserverは、ジョブ履歴ファイルを`mapreduce.jobhistory.done-dir`から`mapreduce.jobhistory.intermediate-done-dir`に移動します。)
すべてまたは選択したジョブのJSON形式のジョブトレースを構築するために、Rumenを実行します。
ベンチマーククラスタでジョブトレースを使用してGridMixを使用します。
GridMixによって送信されたジョブの名前は、「`GRIDMIXnnnnnn`」の形式です。ここで、「`nnnnnn`」は先行ゼロで埋められたシーケンス番号です。
Gridmixは、hadoopサブコマンドとして提供されます。設定パラメータなしの基本的なコマンドラインの使い方
$ hadoop gridmix [-generate <size>] [-users <users-list>] <iopath> <trace>
設定パラメータを使用した基本的なコマンドラインの使い方
$ hadoop gridmix \ -Dgridmix.client.submit.threads=10 -Dgridmix.output.directory=foo \ [-generate <size>] [-users <users-list>] <iopath> <trace>
上記のように、`-Dgridmix.client.submit.threads=10`や`-Dgridmix.output.directory=foo`のような設定パラメータは、他のGridMixパラメータの*前*に使用する必要があります。
`<iopath>`パラメータは、GridMixの作業ディレクトリです。これは、ローカルファイルシステムまたはHDFSのいずれかになりますが、GridMixがローカルファイルシステムとHDFSにそれぞれ同じ負荷をかけるように、元のジョブミックスと同じにすることを強くお勧めします。
`-generate`オプションは、合成ジョブの入力データと分散キャッシュファイルを生成するために使用されます。標準のサイズ接尾辞(例:`100g`は入力データとして100 * 2 ^ 30バイトを生成します)を受け入れます。圧縮形式の入力データの最小サイズ(デフォルトでは128MB)は、`gridmix.min.file.size`で定義されます。`<iopath>/input`は、生成された入力データの保存先ディレクトリ、または入力データの読み取り元ディレクトリです。HDFSベースの分散キャッシュファイルは、分散キャッシュディレクトリ`<iopath>/distributedCache`の下に生成されます。必要な分散キャッシュファイルの一部がすでに分散キャッシュディレクトリに存在する場合、`-generate`オプションが指定されていると、残りの存在しない分散キャッシュファイルのみが生成されます。
`-users`オプションは、ユーザーリストファイルを指すために使用されます(ユーザーとキューのエミュレーションを参照)。
`<trace>`パラメータは、Rumenによって生成されたジョブトレースへのパスです。このトレースは圧縮(クラスタでサポートされている圧縮コーデックのいずれかを使用して読み取り可能である必要があります)または非圧縮にすることができます。GridMixの標準入力ストリームを介して*非圧縮*トレースを渡す場合は、このパラメータの値として「-」を使用します。
サポートされている設定パラメータについては、以下のセクションで説明します。
パラメータ | 説明 |
---|---|
gridmix.output.directory
|
出力が書き込まれるディレクトリ。指定されている場合、`iopath`はこのパラメータを基準にします。送信ユーザーはこのディレクトリへの読み取り/書き込みアクセス権を持っている必要があります。また、ユーザーは実行中に発生する可能性のあるクォータの問題にも注意する必要があります。デフォルトは「`gridmix`」です。 |
gridmix.client.submit.threads
|
クラスタにジョブを送信するスレッドの数。これは、トレースの送信時間まで、一度にメモリにロードされる分割数も制御します。分割は送信期限に間に合うように事前に生成されるため、特に密度の高いトレースでは、より多くの送信スレッドが必要になる場合があります。ただし、分割をメモリに格納するのはかなり費用がかかるため、慎重に増やす必要があります。デフォルトは、SERIALジョブ送信ポリシーの場合は1(ジョブ送信ポリシーを参照)、他のポリシーの場合はクライアントマシンのプロセッサ数より1つ多くなります。 |
gridmix.submit.multiplier
|
ジョブの送信を加速または減速するための乗数。 2つのジョブを区切る時間は、この係数で乗算されます。デフォルト値は1.0です。これは、ジョブトレースをクラスタにサイズ変更するための粗いメカニズムです。 |
gridmix.client.pending.queue.depth
|
分割生成を待っているジョブ記述のキューの深さ。トレースから読み取られたジョブは、送信スレッドによって処理される前に、この深さのキューを占有します。これを設定することはまれです。デフォルトは5です。 |
gridmix.gen.blocksize
|
生成されたデータのブロックサイズ。デフォルト値は256 MiBです。 |
gridmix.gen.bytes.per.file
|
ファイルあたりに書き込まれる最大バイト数。デフォルト値は1 GiBです。 |
gridmix.min.file.size
|
入力ファイルの最小サイズ。デフォルトの制限は128 MiBです。比較的小さな入力データセットでGridMixをテストしているときに「満足のいくファイルが見つかりません」のようなエラーメッセージが表示された場合は、このパラメータを調整してください。 |
gridmix.max.total.scan
|
入力ファイルの最大サイズ。デフォルトの制限は100 TiBです。 |
gridmix.task.jvm-options.enable
|
Gridmixが、元のタスクから取得した値(つまり、トレース経由)を使用して、シミュレートされたタスクの最大ヒープオプションを設定できるようにします。 |
GridMixは、基本的にJSONエンコードされたジョブ記述のストリームであるジョブトレースを入力として受け取ります。ジョブ記述ごとに、送信クライアントは元のジョブ送信時間と、そのジョブの各タスクのバイト数とレコード数の読み取りと書き込みを取得します。このデータがあれば、トレースに記録されているのと同じバイトパターンとレコードパターンを持つ合成ジョブを構築します。 2種類のジョブを構築します
ジョブタイプ | 説明 |
---|---|
LOADJOB
|
Rumenトレースに記載されているワークロードをエミュレートする合成ジョブ。現在のバージョンでは、I/Oをサポートしています。ベンチマーククラスタでI/Oワークロードを再現します。これを行うために、読み書きされたバイト数やレコード数など、すべてのマップタスクとリデュースタスクの詳細なI/O情報を各ジョブの入力分割に埋め込みます。マップタスクは、中間マップ出力データを介してリデュースタスクのI/Oパターンをさらにリレーします。 |
SLEEPJOB
|
本番トレースで観測されたように、各タスクが一定時間スリープするだけの合成ジョブです。ResourceManagerのスケーラビリティは、毎秒処理できるハートビートの数によって制限されることがよくあります。(ハートビートは、NodeManagerから定期的に送信されるメッセージで、ステータスを更新し、ResourceManagerから新しいタスクを取得します。)ベンチマーククラスタは通常、本番クラスタのサイズよりも小さいため、スレーブノードによって生成されるハートビートトラフィックは、本番クラスタのレベルをはるかに下回ります。考えられる解決策の1つは、各スレーブノードで複数のNodeManagerを実行することです。これは、合成ジョブによって生成されるI/Oワークロードがスレーブノードにスラッシングを引き起こすという明らかな問題につながります。そのため、このようなジョブが必要になります。 |
以下の設定パラメータは、ジョブタイプに影響します
パラメータ | 説明 |
---|---|
gridmix.job.type
|
このキーの値は、LOADJOBまたはSLEEPJOBのいずれかです。デフォルト値はLOADJOBです。 |
gridmix.key.fraction
|
LOADJOBタイプのジョブの場合、キーのデータに使用されるレコードの割合です。デフォルト値は0.1です。 |
gridmix.sleep.maptask-only
|
SLEEPJOBタイプのジョブの場合、ジョブのreduceタスクを無視するかどうかを指定します。デフォルトはfalse です。 |
gridmix.sleep.fake-locations
|
SLEEPJOBタイプのジョブの場合、ジョブのmapタスクの偽の場所の数を指定します。デフォルトは0です。 |
gridmix.sleep.max-map-time
|
SLEEPJOBタイプのジョブの場合、ジョブのmapタスクの最大実行時間をミリ秒単位で指定します。デフォルトは無制限です。 |
gridmix.sleep.max-reduce-time
|
SLEEPJOBタイプのジョブの場合、ジョブのreduceタスクの最大実行時間をミリ秒単位で指定します。デフォルトは無制限です。 |
GridMixは、ジョブの送信レートを制御します。この制御は、トレース情報に基づくことも、ResourceManagerから収集した統計に基づくこともできます。ユーザーが定義した送信ポリシーに基づいて、GridMixはそれぞれのアルゴリズムを使用してジョブ送信を制御します。現在、3種類のポリシーがあります
ジョブ送信ポリシー | 説明 |
---|---|
STRESS
|
クラスタに負荷がかかり続けるように、ジョブを送信し続けます。このモードでは、クラスタのリアルタイム負荷を監視することにより、ジョブの送信レートを制御し、クラスタのワークロードの安定したストレスレベルを維持できるようにします。収集した統計に基づいて、クラスタが*アンダーロード*なのか*オーバーロード*なのかを定義します。次の3つの条件がすべて真の場合にのみ、クラスタは*アンダーロード*と見なされます
|
REPLAY
|
このモードでは、ジョブトレースを忠実に再現します。このモードは、実際のジョブトレースで指定された時間間隔に正確に従います。 |
SERIAL
|
このモードでは、先に送信されたジョブが完了した後にのみ、次のジョブを送信します。 |
以下の設定パラメータは、ジョブ送信ポリシーに影響します
パラメータ | 説明 |
---|---|
gridmix.job-submission.policy
|
このキーの値は、STRESS、REPLAY、またはSERIALのいずれかです。ほとんどの場合、キーの値はSTRESSまたはREPLAYになります。デフォルト値はSTRESSです。 |
gridmix.throttle.jobs-to-tracker-ratio
|
STRESSモードでは、クラスタが*オーバーロード*と見なされるために必要な、クラスタ内の実行中のジョブとNodeManagerの最小比率です。これは、前述のしきい値TJです。デフォルトは1.0です。 |
gridmix.throttle.maps.task-to-slot-ratio
|
STRESSモードでは、クラスタが*オーバーロード*と見なされるために必要な、保留中および実行中のmapタスク(つまり、未完了のmapタスク)とmapスロット数の最小比率です。これは、前述のしきい値TMです。実行中のmapタスクは部分的にカウントされます。たとえば、40%完了したmapタスクは、0.6 mapタスクとしてカウントされます。デフォルトは2.0です。 |
gridmix.throttle.reduces.task-to-slot-ratio
|
STRESSモードでは、クラスタが*オーバーロード*と見なされるために必要な、保留中および実行中のreduceタスク(つまり、未完了のreduceタスク)とreduceスロット数の最小比率です。これは、前述のしきい値TRです。実行中のreduceタスクは部分的にカウントされます。たとえば、30%完了したreduceタスクは、0.7 reduceタスクとしてカウントされます。デフォルトは2.5です。 |
gridmix.throttle.maps.max-slot-share-per-job
|
STRESSモードでは、過負荷計算でジョブの未完了のmapタスクにカウントできる、クラスタのmapスロット容量の最大シェアです。デフォルトは0.1です。 |
gridmix.throttle.reducess.max-slot-share-per-job
|
STRESSモードでは、過負荷計算でジョブの未完了のreduceタスクにカウントできる、クラスタのreduceスロット容量の最大シェアです。デフォルトは0.1です。 |
典型的な本番クラスタは、多くの場合、異なるユーザーと共有され、クラスタ容量はジョブキューを介して異なる部門に分割されます。すべてのユーザーのジョブ間の公平性を確保し、キュー容量割り当てポリシーを尊重し、動作不良のジョブがクラスタを乗っ取るのを回避することは、Hadoopソフトウェアに大きな複雑さを追加します。これらの分野で十分にテストしてバグを発見するには、GridMixは、異なるユーザーからのジョブまたは異なるキューに送信されたジョブの競合をエミュレートする必要があります。
複数のキューのエミュレートは簡単です。本番クラスタと同じキュー構成でベンチマーククラスタを設定し、トレースに記録されているのと同じキューに送信されるように合成ジョブを構成するだけです。ただし、トレースに表示されているすべてのユーザーがベンチマーククラスタにアカウントを持っているわけではありません。代わりに、いくつかのテストユーザーアカウントを設定し、トレース内の各一意のユーザーをラウンドロビン方式でテストユーザーに関連付けます。
以下の設定パラメータは、ユーザーとキューのエミュレーションに影響します
パラメータ | 説明 |
---|---|
gridmix.job-submission.use-queue-in-trace
|
true に設定すると、トレースに記載されているのと同じキューセットが使用されます。デフォルト値はfalse です。 |
gridmix.job-submission.default-queue
|
すべてのジョブが送信されるデフォルトのキューを指定します。このパラメータが指定されていない場合、GridMixはクラスタで送信ユーザーに定義されているデフォルトのキューを使用します。 |
gridmix.user.resolve.class
|
使用するUserResolver 実装を指定します。現在、3つの実装があります
org.apache.hadoop.mapred.gridmix.SubmitterUserResolver です。 |
パラメータgridmix.user.resolve.class
がorg.apache.hadoop.mapred.gridmix.RoundRobinUserResolver
に設定されている場合、テストユーザーのリストを含むユーザーリストファイルを定義する必要があります。これは、GridMixに-users
オプションを使用して指定します。
ラウンドロビンユーザーリゾルバーを使用する場合、-users
オプションを使用してユーザーリストファイルを指定することは必須です。他のユーザーリゾルバーはこのオプションを無視します。
ユーザーリストファイルには、1行に1人のユーザーが記載されており、各行は次の形式です
<username>
たとえば、
user1 user2 user3
上記の例では、3人のユーザーuser1
、user2
、およびuser3
を定義しました。ここで、トレース内の各一意のユーザーを、ラウンドロビン方式で定義された上記のユーザーに関連付けます。たとえば、トレースのユーザーがtuser1
、tuser2
、tuser3
、tuser4
、およびtuser5
の場合、マッピングは次のようになります。
tuser1 -> user1 tuser2 -> user2 tuser3 -> user3 tuser4 -> user1 tuser5 -> user2
下位互換性のために、ユーザーリストファイルの各行には、username[,group]*の形式でユーザー名とグループ名を続けることができます。グループ名はGridmixによって無視されます。
Gridmixは、LOADJOBタイプのジョブのデフォルトで分散キャッシュ負荷をエミュレートします。これは、別のMapReduceジョブの一部として、すべてのシミュレートされたジョブに必要な分散キャッシュファイルを事前に作成することによって行われます。
gridmixシミュレートジョブにおける分散キャッシュ負荷のエミュレーションは、プロパティgridmix.distributed-cache-emulation.enable
をfalse
に設定することで無効にすることができます。ただし、gridmixによる分散キャッシュデータの生成は-generate
オプションによって駆動され、この構成プロパティとは無関係です。
分散キャッシュファイルの生成と分散キャッシュ負荷のエミュレーションの両方が無効になるのは、次の場合です。
<iopath>
がローカルファイルシステム上にある場合、または<iopath>/distributedCache
(分散キャッシュディレクトリを含む)の上位ディレクトリのいずれかに、他のユーザーの実行権限がない場合。Gridmix3は、送信されたシミュレートされたジョブにいくつかの構成プロパティを設定して、入力ジョブトレースの対応するジョブにマップバックできるようにします。これらの設定パラメータには、次のものが含まれます。
パラメータ | 説明 |
---|---|
gridmix.job.original-job-id
|
このシミュレートされたジョブに対応する元のクラスタのジョブのジョブID。 |
gridmix.job.original-job-name
|
このシミュレートされたジョブに対応する元のクラスタのジョブのジョブ名。 |
MapReduceは、データの圧縮と解凍をサポートしています。MapReduceジョブへの入力は圧縮できます。同様に、MapタスクとReduceタスクの出力も圧縮できます。GridMixでの圧縮/解凍エミュレーションは重要です。圧縮/解凍をエミュレートすると、タスクのCPUとメモリ使用量に影響を与えるためです。圧縮/解凍をエミュレートするタスクは、同じノードで実行されている他のタスクとデーモンに影響を与えます。
gridmix.compression-emulation.enable
が true
に設定されている場合、圧縮エミュレーションが有効になります。デフォルトでは、圧縮エミュレーションはタイプ LOADJOB のジョブに対して有効になっています。圧縮エミュレーションが有効になっている場合、GridMix は一定の圧縮率で圧縮されたテキストデータを生成します。そのため、シミュレートされた GridMix ジョブは、実際のジョブで観測された圧縮率に関係なく、圧縮可能なテキストデータ(一定の圧縮率を持つ)を使用して圧縮/解凍をエミュレートします。
典型的な MapReduce ジョブは、以下のフェーズでデータの圧縮/解凍を処理します。
ジョブ入力データの解凍:
圧縮エミュレーションが有効になっている場合、GridMix は圧縮可能な入力データを生成します。元のジョブの構成に基づいて、シミュレートされた GridMix ジョブは、解凍ツールを使用して圧縮された入力データを読み取ります。現在、GridMix は mapreduce.input.fileinputformat.inputdir
を使用して、元のジョブが圧縮された入力データを使用したかどうかを判断します。元のジョブの入力ファイルが圧縮されていない場合、シミュレートされたジョブは解凍ツールを使用せずに圧縮された入力ファイルを読み取ります。
中間データの圧縮と解凍:
元のジョブでマップ出力の圧縮が有効になっている場合、GridMix もシミュレートされたジョブでマップ出力の圧縮を有効にします。したがって、リデューサーは解凍ツールを使用してマップ出力データを読み取ります。
ジョブ出力データの圧縮:
元のジョブの出力が圧縮されている場合、GridMix もシミュレートされたジョブでジョブ出力の圧縮を有効にします。
以下の設定パラメータは、圧縮エミュレーションに影響します。
パラメータ | 説明 |
---|---|
gridmix.compression-emulation.enable | シミュレートされた GridMix ジョブで圧縮エミュレーションを有効にします。デフォルトは true です。 |
圧縮エミュレーションが有効になっていると、GridMix は圧縮された入力データを生成します。そのため、入力データの合計サイズは、予想されるサイズよりも小さくなります。GridMix が圧縮を正しくエミュレートできるように、gridmix.min.file.size
を小さい値(gridmix.gen.bytes.per.file
の約 10%)に設定します。
MapReduce では、ユーザーはジョブを High-Ram ジョブとして定義できます。High-Ram ジョブのタスクは、タスクプロセスでより大きなメモリを占有できます。この動作をエミュレートすることは、以下の理由により重要です。
スケジューラへの影響: High-Ram ジョブのタスクのスケジューリングは、リソースの予約と使用率に影響を与える可能性があるため、スケジューリング動作に影響を与えます。
ノードへの影響: High-Ram タスクはより大きなメモリを占有するため、NodeManager はこれらのタスクに追加のリソースを割り当てるためのブックキーピングを行います。そのため、これはメモリ エミュレーションの前兆となり、高いメモリ要件を持つタスクは High-Ram タスクとして考慮する必要があります。
High-Ram 機能のエミュレーションは、以下を設定することで無効にできます。
gridmix.highram-emulation.enable
を false
に設定します。
CPU、物理メモリ、仮想メモリ、JVM ヒープなどのリソースの使用量は、MapReduce によってタスクカウンターを使用して記録されます。この情報は、GridMix がシミュレートされたタスクのリソース使用量をエミュレートするために使用されます。リソース使用量の emulate は、GridMix が実際のクラスタで見られるのと同様の負荷をテストクラスタに与えるのに役立ちます。
MapReduce タスクは、そのライフタイム全体にわたってリソースを使用します。GridMix も、シミュレートされたタスクのライフタイム全体にわたってリソース使用量のエミュレーションを実行することで、この動作を模倣しようとします。エミュレートされる各リソースには、それに関連付けられた *エミュレータ* が必要です。そのような各 *エミュレータ* は、org.apache.hadoop.mapred.gridmix.emulators.resourceusage.ResourceUsageEmulatorPlugin
インターフェースを実装する必要があります。GridMix のリソース *エミュレータ* は、実行前に設定(プラグインまたはプラグアウト)できる *プラグイン* です。GridMix ユーザーは、gridmix.emulators.resource-usage.plugins
パラメータの値として、カンマ区切りの *エミュレータ* リストを渡すことで、複数のエミュレータ *プラグイン* を設定できます。
GridMix に付属の *エミュレータ* のリスト
累積 CPU 使用量 *エミュレータ*: GridMix は、Rumen によって公開された累積 CPU 使用量の値を使用し、シミュレートされたタスクの累積 CPU 使用量の合計が Rumen によって公開された値に近くなるようにします。GridMix は、org.apache.hadoop.mapred.gridmix.emulators.resourceusage.CumulativeCpuUsageEmulatorPlugin
を gridmix.emulators.resource-usage.plugins
パラメータに設定されたエミュレータ *プラグイン* のリストに追加することで、累積 CPU 使用量をエミュレートするように設定できます。CPU 使用量エミュレータは、タスクの特定の進捗境界でのみエミュレートするように設計されています。この間隔は、gridmix.emulators.resource-usage.cpu.emulation-interval
を使用して設定できます。このパラメータのデフォルト値は 0.1
つまり 10%
です。
合計ヒープ使用量 *エミュレータ*: GridMix は、Rumen によって公開された合計ヒープ使用量の値を使用し、シミュレートされたタスクの合計ヒープ使用量が Rumen によって公開された値に近くなるようにします。GridMix は、org.apache.hadoop.mapred.gridmix.emulators.resourceusage.TotalHeapUsageEmulatorPlugin
を gridmix.emulators.resource-usage.plugins
パラメータに設定されたエミュレータ *プラグイン* のリストに追加することで、合計ヒープ使用量をエミュレートするように設定できます。ヒープ使用量エミュレータは、タスクの特定の進捗境界でのみエミュレートするように設計されています。この間隔は、gridmix.emulators.resource-usage.heap.emulation-interval
を使用して設定できます。このパラメータのデフォルト値は 0.1
つまり 10%
の進捗間隔です。
GridMix は、タイプ LOADJOB のジョブに対してのみリソース使用量をエミュレートすることに注意してください。
GridMix は、コミュニティからのフィードバックとパッチを取り入れながら、段階的に開発されます。現在、その目的は MapReduce と HDFS のパフォーマンスを評価することであり、その上のレイヤー(つまり、広範な lib とサブプロジェクトスペース)を評価することではありません。これらの 2 つの制限を考えると、ジョブロードの以下の特性は現在ジョブトレースにキャプチャされておらず、GridMix で正確に再現できません。
ファイルシステムのプロパティ - ブロックサイズ、名前空間階層、または特定のタスクで消費および出力されるバイト/レコード以外の入力、中間、または出力データのプロパティを一致させる試みは行われません。これは、システムの最も頻繁に使用される部分(テキスト処理、ストリーミングなど)の一部は、現在の実装では有意義にテストできないことを意味します。
I/O レート - レコードが消費/出力されるレートは、リーダー/ライターの速度によってのみ制限され、タスク全体で一定であると想定されます。
メモリプロファイル - 最大ヒープサイズは保持されますが、タスクのメモリ使用量に関するデータは時間経過とともに利用できません。
スキュー - 特定のタスクで消費および出力されるレコードは、観測された平均に従うと想定されます。つまり、レコードは実際よりも規則的になります。各マップはまた、各リデュースに対して比例配分されたデータパーセンテージを生成するため、入力のバランスが取れていないジョブはフラット化されます。
ジョブの失敗 - ユーザーコードは正しいと想定されます。
ジョブの独立性 - あるジョブの出力または結果は、後続のジョブがいつ、または実行されるかどうかに影響を与えません。
GridMix ツールの古いバージョンが存在します。GridMix1、GridMix2、および GridMix3 の元の実装を追跡する問題は、Apache Hadoop MapReduce JIRA にあります。GridMix の現在の開発を追跡するその他の問題は、Apache Hadoop MapReduce JIRA を検索することで見つけることができます。