Dataproc действительно обеспечивает интеллектуальные значения по умолчанию, основанные на типах машин (даже нестандартных типах машин) и форме кластера, которые предназначены для лучшей настройки "один размер подходит всем", которая балансирует между эффективностью большего количества потоков на JVM с ограничениями наобщие пулы ресурсов на JVM;грубо говоря, машины разделены таким образом, чтобы соответствовать 2 исполнителям на машину, и каждому исполнителю предоставляется половина потоков машины (так что можно ожидать, что 2 исполнителя, каждый из которых способен выполнять 4 задачи параллельно на n1-standard-8, например,).
Имейте в виду, что YARN, как известно, неправильно сообщает vcores для многопоточных исполнителей Spark , поэтому вы можете видеть только два занятых YARN "vcores" при выполнении большого задания Spark в Dataproc,но вы можете убедиться, что все ядра действительно используются, посмотрев страницы Spark AppMaster, запустив ps
на рабочем месте или посмотрев использование ЦП на странице облачной консоли Dataproc.
Однако эти типы настроекне всегда универсальны на 100% «оптимальны», и Dataproc еще не может автоматически предсказать настройки на основе фактической рабочей нагрузки или исторических рабочих нагрузок, которые вы выполняли.Таким образом, любые настройки, основанные исключительно на форме кластера, не могут быть на 100% оптимальными для всех рабочих нагрузок, которые выполняются в этом кластере.
Короче говоря, в Dataproc вам не нужно беспокоиться об явной оптимизации в большинстве случаев.если вы не пытаетесь действительно выжать каждую унцию эффективности, но в то же время вы всегда можете свободно изменять настройки Dataproc своими собственными свойствами либо при создании кластера, либо при отправке задания, если это необходимо.Несколько моментов, которые следует учитывать:
- Если у вас более высокая нагрузка на процессор по сравнению с нагрузкой на память, рассмотрите возможность использования типов машин типа «highcpu», и Dataproc автоматически назначит каждому исполнителю меньше памяти для каждого процессора.
- Если у вас более высокая нагрузка на память, рассмотрите типы highmem
- Если ваши входные данные не разделяемы и / или сильно сжаты (например, файлы .csv.gz), вы можете с большей вероятностью запуститьв проблемы с памятью, так как обычные вычисления параллелизма не будут знать, взорвется ли входные данные, чтобы быть больше, чем ожидалось.В этих случаях вам может потребоваться переопределить память исполнителя, чтобы она была больше
- Если вы используете подпроцессы или собственные библиотеки, такие как вызов ffmpeg из рабочих задач, тогда задачи будут использовать физическую память за пределами знаний YARN / Spark;вам также может понадобиться настроить ограничения памяти в этих случаях, либо уменьшив количество ядер на исполнителя, либо увеличивая накладные расходы памяти исполнителя.
- Если у вас есть что-то очень ограниченное для ввода-вывода или блокирующее другие асинхронные функции (например, вызов медленноговнешняя веб-конечная точка из ваших задач), тогда вы могли бы извлечь выгоду из запуска ядер для каждого исполнителя;тогда Spark выполняет больше задач, чем процессоров, но если задачи просто ожидают ввода-вывода, это будет полезно для повышения эффективности.