2

Я буду использовать большое количество файлов, структурированных следующим образом:Спарк перегородки/кластер исполнение

/day/hour-min.txt.gz 

в общей сложности 14 дней. Я буду использовать кластер из 90 узлов/работников.

Я читаю все с wholeTextFiles(), так как это единственный способ, который позволяет мне разделить данные соответствующим образом. Все вычисления будут выполняться поминутно (так, в основном, для каждого файла) с несколькими сокращениями в конце. Есть около 20 000 файлов; Как эффективно их разделять? Разрешить ли я искриться?

В идеале, я думаю, что каждый узел должен получать целые файлы; разве искра делает это по умолчанию? Могу ли я его применять? Как?

+0

Где находятся ваши входные файлы? HDFS/S3/..? –

+0

HDFS Dimebag

ответ

2

Я думаю, что каждый узел должен получать целые файлы; разве искра делает это по умолчанию?

Да, учитывая, что WholeTextFileRDD (то, что вы получите после sc.wholeTextFiles) имеет свой собственный WholeTextFileInputFormat читать файлы целиком в качестве одной записи, вы охвачены. Если ваши Spark-исполнители и datanodes находятся в совместном размещении, вы также можете ожидать локальную локальную локальность данных. (Вы можете проверить это в Спарк UI когда ваше приложение работает.)

слово предостережения из записки жгутов документации искрой sc.wholeTextFiles:

Небольшие файлы являются предпочтительными, большой файл также допустимо, но может привести к плохой работе .

+0

Чтобы быть ясным, вы имеете в виду, что я должен реализовать свой собственный 'wholeTextFileInputFormat'? Или реализация по умолчанию хорошая? – Dimebag

+1

Нет, для этого вам не нужно вводить свой собственный формат ввода. Это уже предусмотрено. Просто имейте в виду, что если ваш файл большой, то он, вероятно, будет разбит на многие блоки hdfs, и вашему RDD придется прочитать эти блоки (возможно, из не локальных узлов данных), чтобы построить одну запись для файла.Также для больших файлов память, необходимая для обработки одного файла, будет большой. Это основная идея предостережения против использования wholeTextFiles для больших RDD. Кроме того, вы в значительной степени охвачены. –

1

Вы можете использовать эмпирическое правило для разделов:

data = data.coalesce(total_cores * 3) 

В идеале, я думаю, что каждый узел должен получить целые файлы; разве искра делает это по умолчанию? Могу ли я его применять? Как?

Все зависит от вашего RDD, а не от ваших файлов. Если вы создаете RDD, который содержит все содержимое файлов, например, Spark будет распространять этот RDD, а на весь файл лежит на узле, влияет множество параметров (#partitions, размер каждого файла и т. Д.).

Я не думаю, что вы можете применить что-то подобное, поэтому сосредоточьтесь на количестве разделов; что является критическим.


Что касается количества файлов, я написал в моем pseudosite, что слишком мало файлов, приведут к огромным файлам и могут быть просто слишком большими, слишком много файлов, и вы будете иметь HDFS поддерживать огромное количество метаданных, тем самым накладывая на него большое давление.