[Disclaimer: While this question is somewhat specific, I think it circles a very generic issue with Hadoop/Spark.]
Мне нужно обработать большой набор данных (~ 14 ТБ) в Spark. Не агрегирует, в основном фильтрует. Учитывая ~ 30 тыс. файлов (250 файлов частей в месяц в течение 10 лет, каждая часть ~ 200 МБ), я хотел бы загрузить их в RDD/DataFrame и отфильтровать элементы на основе некоторых произвольных фильтров.
Чтобы сделать список файлов эффективным (я нахожусь в google dataproc/cloud storage, поэтому драйвер, выполняющий подстановочные знаки, был очень последовательным и очень медленным), я предварительно вычисляю RDD имен файлов, а затем загружаю их в RDD ( Я использую avro, но тип файла не должен иметь значения), например.
#returns an array of files to load
files = sc.textFile('/list/of/files/').collect()
#load the files into a dataframe
documents = sqlContext.read.format('com.databricks.spark.avro').load(files)
Когда я это делаю, даже в кластере с 50 рабочими процессами кажется, что только один исполнитель выполняет работу по чтению файлов. Я экспериментировал с трансляцией списка файлов и прочитал дюжину разных подходов, но, похоже, не могу решить проблему.
Итак, есть ли эффективный способ создать очень большой фрейм данных из нескольких файлов? Как лучше всего использовать всю потенциальную вычислительную мощность при создании этого RDD?
Этот подход очень хорошо работает на небольших наборах, но при таком размере я вижу большое количество симптомов, таких как длительные процессы без обратной связи. Есть ли какой-то кладезь знаний — помимо @zero323 :-) — по оптимизации искры в таком масштабе?