Как Presto собирает оперативную память? - PullRequest
0 голосов
/ 10 мая 2018

Я изучаю Presto, меня интересует управление ресурсами времени выполнения Presto.

Я узнал, что ClusterMemoryManager периодически проверяет память, но я запутался в сборе оперативной памяти.

for (QueryExecution query : queries) {
            long bytes = query.getUserMemoryReservation();
            DataSize sessionMaxQueryMemory = getQueryMaxMemory(query.getSession());
            long queryMemoryLimit = Math.min(maxQueryMemory.toBytes(), sessionMaxQueryMemory.toBytes());
            totalBytes += bytes;
            if (resourceOvercommit(query.getSession()) && outOfMemory) {
                // If a query has requested resource overcommit, only kill it if the cluster has run out of memory
                DataSize memory = succinctBytes(bytes);
                query.fail(new PrestoException(CLUSTER_OUT_OF_MEMORY,
                        format("The cluster is out of memory and %s=true, so this query was killed. It was using %s of memory", RESOURCE_OVERCOMMIT, memory)));
                queryKilled = true;
            }
            if (!resourceOvercommit(query.getSession()) && bytes > queryMemoryLimit) {
                DataSize maxMemory = succinctBytes(queryMemoryLimit);
                query.fail(exceededGlobalLimit(maxMemory));
                queryKilled = true;
            }
        }

Как Presto собирает использование памяти для текущего запроса?

Любая помощь будет оценена.

Спасибо!

1 Ответ

0 голосов
/ 11 мая 2018

Вы можете просмотреть Query в виде графика задачи. Эти задачи распределены по узлам в кластере и выполняются в нескольких потоках. Основным строительным блоком такой задачи является «Оператор». Операторы знают свое использование памяти и сообщают об этом через классы контекста памяти. Отчеты, поступающие от операторов, агрегируются на узле, а также отправляются обратно координатору, который агрегирует общее количество запросов.

...