ワーカー、CPU、およびメモリ¶
values.yaml
の以下のプロパティは、Kubernetes クラスタノードの特性を定義します。
presto:
# The cluster has numNodes = numWorkers + 2
numWorkers: 4
cpusPerNode: 16
memoryPerNode: 64
numWorkers: Kubernetes クラスタの MPP ワーカーの数。
Denodo 組み込み MPP を実行する場合、以下の構成でノード数
N + 2
個の Kubernetes クラスタを作成し、それらのノードでは他のアプリケーションを実行しないことを推奨します。コーディネーター用ノード 1 個
組み込み Hive メタストアおよび組み込み PostgreSQL 用ノード 1 個
ワーカー用ノード
N
個
この場合、
numWorkers
をN
に設定する必要があります。「 Denodo 組み込み MPP のサイズ設定の推奨 」も参照してください。
cpusPerNode: Kubernetes クラスタの各ノードのコア数。
Denodo 組み込み MPP でクエリのデータを処理するには、一定量の CPU が必要です。 少なくとも 16 ~ 32 コアのノード から開始することをお勧めします。たとえば、Amazon Elastic Kubernetes Service では、
m6a.8xlarge
またはr6a.4xlarge
ノードで開始できます。一般に、クラスタのメモリはそのままで CPU を 2 倍にする場合、クエリの実行にかかる時間は半分になります。CPU を増やすと、クエリの実行時間は短くなります 。
memoryPerNode: Kubernetes クラスタの各ノードの合計メモリ量 (GB 単位)。この設定は、MPP コーディネーターおよび各 MPP ワーカーが使用可能なメモリを決定し、クラスタノードの合計メモリ量の 80% になります。
Denodo 組み込み MPP で、
JOIN
、GROUP BY
、およびORDER BY
の各操作を含むクエリを処理するには、一定量のメモリが必要です。 少なくとも 64 ~ 128 GB のノード から開始することをお勧めします。たとえば、Amazon Elastic Kubernetes Service では、m6a.8xlarge
またはr6a.4xlarge
ノードで開始できます。使用可能なメモリによって、Denodo 組み込み MPP で同時実行できるクエリの最大数が決まります。
クエリのメモリ設定¶
クエリのパフォーマンスを考慮して Denodo 組み込み MPP の メモリ設定 を調整し、クエリあたりの最大メモリと Denodo 組み込み MPP で同時実行できるクエリの最大数の間でバランスを取ることが重要です。
MPP ワーカーでクエリが使用できる最大ユーザーメモリ量は、デフォルトで query.max-memory-per-node= JVM max memory * 0.1
です。JVM の最大メモリは、クラスタノードの合計メモリ量の 80% です。したがって、MPP ワーカーでクエリを実行するのに使用できるメモリ量は、 memoryPerNode * 0.8 * 0.1
です。
大規模なクエリが実行されると、組み込み MPP が Query exceeded per-node user memory limit of xGB
をスローする可能性があります。これは、クエリを処理するためにメモリを増やす必要があることを意味します。この場合、 values.yaml
のメモリ設定を以下のように構成し、デフォルト値をオーバーライドできます。
presto:
coordinator:
additionalConfig: [
query.max-memory-per-node=xGB,
query.max-total-memory-per-node=yGB,
query.max-memory=zGB
]
…
presto:
worker:
additionalConfig: [
query.max-memory-per-node=xGB,
query.max-total-memory-per-node=yGB,
query.max-memory=zGB
]
最も重要なメモリプロパティを以下に示します。
query.max-memory-per-node
: MPP ワーカー上でクエリが使用できる ユーザーメモリ の最大量。デフォルト値はJVM max memory * 0.1
です。これが十分ではない場合、
query.max-memory-per-node = JVM max memory * 0.5
に設定することから始めることをお勧めします。query.max-memory-per-node
のデフォルト値を増やすと、大規模なクエリのパフォーマンスが向上する可能性がありますが、同時実行されるクエリが非常に多いシナリオでは他のクエリが使用できるメモリ量が減る可能性もあります。query.max-total-memory-per-node
: MPP ワーカー上でクエリが使用できる ユーザーメモリとシステムメモリ の最大量。デフォルト値はquery.max-memory-per-node * 2
です。これが十分ではない場合、
query.max-total-memory-per-node = JVM max memory * 0.6
に設定することから始めることをお勧めします。query.max-total-memory-per-node
のデフォルト値を増やすと、大規模なクエリのパフォーマンスが向上する可能性がありますが、同時実行されるクエリが非常に多いシナリオでは他のクエリが使用できるメモリ量が減る可能性もあります。query.max-memory
: クラスタ内のすべての MPP ワーカーでクエリが使用できるユーザーメモリの最大量。デフォルト値は20GB
です。クラスタで処理する必要があるクエリの規模がさらに大きくなる場合、
query.max-memory
を増やす必要があります。推奨値はquery.max-memory = query.max-memory-per-node * numWorkers
です。使用しているシナリオではこの推奨値が機能しない場合、問題となる大規模なクエリに対して EXPLAIN ANALYZE を実行し、クエリプランを調べて最大メモリピークを確認できます。
大規模なクエリを処理する場合、メモリ設定の調整以外の解決策は、メモリの多いクラスタノードを使用するか、クラスタのノード数を増やすことしかない場合があります。
Kubernetes の CPU とメモリの管理¶
Kubernetes は、CPU とメモリに対する リソースの要求と制限事項 に基づいて、ノード間でポッドをスケジュールします。コンテナーポッドが requests で特定の値の CPU やメモリを要求した場合、Kubernetes は、それらのリソースを保証できるノードにのみ、そのポッドをスケジュールします。一方、limits は、コンテナーポッドが使用するリソースが決して一定値を超えないことを保証します。
presto:
coordinator:
resources:
limits:
cpu: 12.8
memory: 56Gi
requests:
cpu: 12.8
memory: 56Gi
...
worker:
resources:
limits:
cpu: 12.8
memory: 56Gi
requests:
cpu: 12.8
memory: 56Gi
resources
は、Kubernetes クラスタ管理者が選択できるように、コメントアウトされています。