E-MapReduce(EMR)Prestoクラスターまたは EMR Trinoクラスターを購入しようとしていて、クラスターの仕様の選択方法やメモリの構成方法がわからない場合は、このトピックの推奨事項を参照できます。このトピックでは、ビジネス要件に基づいて EMR Trinoクラスターに適切な仕様とメモリ構成を選択する方法について説明します。
EMR Trinoクラスターの仕様選択に関する推奨事項
Trinoクラスターは、1つのコーディネーターと複数のワーカーで構成されます。詳細については、「Trinoの概要」をご参照ください。EMR Trinoクラスターでは、コーディネーターはマスターノードにデプロイされ、ワーカーはデフォルトでコアノードまたはタスクノードにデプロイされます。Trinoはネイティブでは高可用性をサポートしていません。購入した Trinoクラスターが高可用性クラスターであるかどうかに関係なく、Trinoコーディネーターは1つのマスターノードにデプロイされます。単一のコーディネーターノードは、最大数百のワーカーノードをスケジュールできます。
EMR Trinoクラスターを作成するには、Trinoエンジンと必要なデータレイクコンポーネントのみを選択する必要があります。EMR Trinoクラスターを作成する際の仕様選択に関する推奨事項を以下に示します。
マスターノードとコアノードに同じ仕様を選択する場合は、5~20個のワーカーノードを購入することをお勧めします。20個を超えるワーカーノードを構成することもできます。
少数のワーカーノードが必要な場合は、マスターノードの仕様をコアノードの仕様の半分にすることができます。マスターノードの仕様、特に vCPU の数は、コアノードの仕様よりもはるかに低くならないようにすることをお勧めします。そうしないと、サービスのパフォーマンスと安定性に影響します。
大規模なクラスターが必要な場合は、単一ノードの仕様を増やすのではなく、ワーカーノードの数を増やすことをお勧めします。
EMR Trinoクラスターでメモリ不足などの問題を防ぐために、クラスターの作成時にオートスケーリングを有効にしてスケールアウトを実行することをお勧めします。クラスターの負荷が減少した場合、オートスケーリングによりスケールインを実行することもできます。詳細については、「概要」をご参照ください。
Trinoコンポーネントのみがインストールされている EMR クラスターを作成する場合は、クラスターの作成時に HDFS や Hive などの不要なコンポーネントを選択しないことをお勧めします。使用する Trino コンポーネントとデータレイクコンポーネントのみを選択する必要があります。これにより、スケーラビリティが向上し、リソースの使用量が削減されます。
Trino を使用してデータのクエリを実行すると、vCPU リソースとメモリリソースの両方が消費されます。vCPU はクエリ速度を直接決定し、メモリ容量はクエリタスクを正常に実行できるかどうかを決定します。メモリ容量は、クエリ速度にもわずかな影響を与えます。SQL 要件とビジネス要件に基づいて EMR Trinoクラスターを購入できます。特別な要件がない場合は、汎用インスタンスで日常のニーズを満たすことができます。次の表に、EMR Trinoクラスターの一般的な仕様を示します。
ノードの種類と数量 | クラスターの vCPU の数 | クラスターのメモリサイズ |
マスター 1 個 | 16 vCPU | 64 GB |
コア 5 個 | 16 vCPU | 64 GB |
EMR Trinoクラスターのメモリ構成に関する推奨事項
メモリ不足は、EMR Trinoクラスターでのクエリタスクの失敗の主な原因です。次のパラメーターは、EMR Trinoクラスターのメモリに関連しています。パラメーターの単位は GB と MB です。
query.max-memory-per-node
query.max-memory
query.max-total-memory-per-node(このパラメーターは Trino リリース 369 で削除されました。DataLake クラスターにデプロイされた Trino コンポーネントには、このパラメーターは含まれていません。)
query.max-total-memory
memory.heap-headroom-per-node
上記のパラメーターを変更するには、次の手順を実行します。
Java 仮想マシン(JVM)パラメーターを変更します。
メモリパラメーターを構成する場合は、最初に JVM パラメーターを変更する必要があります。
EMR コンソールの Trino サービスページの [構成] タブで、[jvm.config] サブタブをクリックし、-Xmx の後に続く値を変更します。
スタンドアロンモードの Trino クラスター、または Trino サービスのみがデプロイされているクラスターの場合は、値をクラスターの物理メモリの約 70% に変更できます。このようにして、効率と安定性の両方を確保できます。
クラスターの構成が大きい場合(クラスターメモリが 128 GB を超える場合など)は、値を増やすことができます。ただし、このパラメーターを過度に大きな値に設定しないことをお勧めします。特に、多数のネイティブメソッドリクエストを受信する場合です。この場合は、実際の状況に基づいて値を減らす必要があります。値を減らさないと、メモリ不足のためにオペレーティングシステムによってプロセスが停止される可能性があります。その結果、ワーカーノードが再起動され、タスクが失敗します。
マスターノードとコアノードの構成が異なる場合は、各ノードグループまたはノードの構成を変更できます。
EMR Trinoクラスターの仕様選択に関する推奨事項に記載されている仕様のクラスターの場合、-Xmx の後に続く値を 45G から 50G の値に設定できます。
メモリパラメーターを構成します。
EMR コンソールの Trino サービスページの [構成] タブで、[config.properties] サブタブをクリックし、関連するパラメーター値を変更します。
パラメーター
説明
デフォルト値
推奨値
query.max-memory-per-node
単一のワーカーノードでクエリを実行するために必要なメモリサイズ。
2 GB
JVM メモリとmemory.heap-headroom-per-node の値の差以下の値にパラメーターを設定します。これにより、単一のワーカーノードのメモリが JVM メモリの 70% を超えないようにします。同時実行性が高い場合は、値を適切に減らすことをお勧めします。
query.max-memory
クラスター内のすべてのノードでクエリを実行するために必要なメモリの合計サイズ。
4 GB
次の式に基づいて計算された値にこのパラメーターを設定します。query.max-memory-per-node の値 × ワーカーノードの数。
query.max-total-memory
クラスターでクエリを実行するために消費されるメモリの合計サイズ。このパラメーターの値は、
query.max-memory
パラメーターの値以上である必要があります。6 GB
同時実行性が高くない場合は、このパラメーターをquery.max-memory パラメーターと同じ値に設定します。同時実行性が高い場合、query.max-total-memory パラメーターの値は、クラスターの最大メモリ容量(JVM メモリの 70% にワーカーノードの数を掛けた値)を超えることはできません。ビジネス要件に基づいて、query.max-memory とquery.max-memory-per-node の値を比例的に減らします。query.max-memory の値をquery.max-total-memory の半分に減らすことができます。この場合は、query.max-memory-per-node パラメーターをquery.max-memory の値をワーカーノードの数で割った値に設定する必要があります。
memory.heap-headroom-per-node
予約済みの JVM ヒープメモリ。
JVM メモリの 30%
特別な要件がない場合は、デフォルト値を保持します。
query.max-memory-per-node とmemory.heap-headroom-per-node はノードごとに構成できます。クラスター内のすべてのノードに対してquery.max-memory とquery.max-total-memory をグローバルに構成することをお勧めします。
EMR Trinoクラスターの仕様選択に関する推奨事項に記載されている仕様のクラスターの場合、query.max-memory-per-node を 30 GB から 35 GB の範囲の値に設定し、query.max-memory とquery.max-total-memory を 150 GB から 165 GB の範囲の値に設定できます。クエリ中にワーカーノードのサービスが頻繁に停止する場合は、query.max-memory-per-node の値を徐々に減らしてみてください。
構成を保存してデプロイした後、すべてのノードを再起動してメモリ構成を有効にします。
その他の関連構成
単一のクエリで使用されるリソースを制限する場合は、リソースグループ機能を使用できます。詳細については、「リソースグループ」をご参照ください。
クエリ速度が遅い場合は、task.concurrency パラメーターの値を変更して同時実行性を調整できます。その他のパラメーターについては、「タスクのプロパティ」をご参照ください。