я выполнить следующий код PySpark:Почему Spark работает в Google Dataproc хранит временные файлы на внешнем хранилище (GCS) вместо локального диска или HDFS при использовании saveAsTextFile?
from pyspark import SparkContext
sc = SparkContext()
data = sc.textFile('gs://bucket-name/input_blob_path')
sorted_data = data.sortBy(lambda x: sort_criteria(x))
sorted_data.saveAsTextFile(
'gs://bucket-name/output_blob_path',
compressionCodecClass="org.apache.hadoop.io.compress.GzipCodec"
)
Работа выполнена успешно. Однако во время выполнения задания Spark создал много временных капель по следующему пути gs://bucket-name/output_blob_path/_temporary/0/
. Я понял, что удаление всех этих временных блоков в конце заняло половину времени выполнения задания, а загрузка процессора на 1% за это время (огромная трата ресурсов).
Есть ли способ хранить временные файлы на локальном диске (или HDFS) вместо GCP? Я все равно хотел бы сохранить окончательные результаты (отсортированный набор данных) для GCP.
Мы использовали Dataproc Spark cluster (VM type 16cores, 60GM) с 10 рабочими узлами. Объем входных данных составлял 10 ТБ.
Спасибо за объяснение. Я немного удивлен, что будет слишком много файлов, так как мы сортируем данные, которые были экспортированы из BigQuery в GCS. Мое предположение заключалось в том, что функция экспорта BiqQuery уже оптимизирует количество разделов (оптимальное количество файлов для хранения набора данных в GCS). – user2548047
В зависимости от применяемых видов RDD количество разделов после преобразования может не совпадать с количеством входных разделов, а также в этом случае FileInputFormat будет по умолчанию разбивать входные файлы на более мелкие разделы независимо от количество входных файлов. Вы можете настроить это с помощью '--properties spark.hadoop.fs.gs.block.size = 536870912', чтобы увеличить до 512 Мбайт, например, вместо значения по умолчанию 64 МБ. –
Вы также можете настроить это значение по умолчанию во время развертывания кластера. 'gcloud dataproc кластеры создают кластер my-cluster --properties: fs.gs.block.size = 536870912' будет разумным, если ваши задания обычно находятся в диапазоне 10 ТБ. Это было бы слишком высоко, если бы ваши рабочие места были, скажем, 10 ГБ. В большинстве случаев лучше ориентироваться на более чем 1000 и меньше, чем, возможно, 50000 разделов, но также, как правило, не хотят идти на меньший размер блока, чем 64 МБ даже для небольших заданий. –