Обработка нескольких небольших файлов общим объемом 100 ГБ в HDFS - PullRequest
0 голосов
/ 21 октября 2018

В моем проекте есть требование обрабатывать несколько файлов сообщений .txt с использованием PySpark.Файлы перемещаются из локального каталога в путь HDFS (hdfs: // messageDir / ..) с использованием пакетов, и для каждого пакета я мог видеть несколько тысяч файлов .txt, а их общий размер составляет около 100 ГБ.Почти все файлы имеют размер менее 1 МБ.

Могу ли я узнать, как HDFS хранит эти файлы и выполняет разбиение?Поскольку каждый файл имеет размер менее 1 МБ (меньше, чем размер блока HDFS 64/128 МБ), я не думаю, что произойдет какое-либо разделение, но файлы будут реплицированы и сохранены в 3 разных узлах данных.

Когда я используюSpark для чтения всех файлов в каталоге HDFS (hdfs: // messageDir / ..) с использованием подстановочных знаков, таких как * .txt, как показано ниже: -

rdd = sc.textFile('hdfs://messageDir/*.txt')

Как Spark читает файлы и выполняет разделениепотому что HDFS не имеет разделов для этих маленьких файлов.

Что если размер моего файла увеличится за определенный промежуток времени, и для каждого пакета будет получен объем небольших файлов по 1 ТБ?Может кто-нибудь сказать мне, как это можно сделать?

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Вы можете читать из спарка, даже если файлы маленькие.Проблема в HDFS.Обычно размер блока HDFS действительно велик (64 МБ, 128 МБ или больше), поэтому много маленьких файлов приводят к издержкам на имя узла.

Если вы хотите сделать файл большего размера, вам нужно оптимизировать редуктор.Количество файлов записи определяется тем, сколько редуктор будет писать.Вы можете использовать метод объединения или перераспределения для управления им.

Другой способ - сделать еще один шаг, объединяющий файлы.Я написал код приложения искры, который объединяется.Я ставлю целевой размер записи каждого файла, и приложение получает общее количество записей, а затем, какое количество слияний можно оценить.

Вы можете использовать Hive или иначе.

0 голосов
/ 21 октября 2018

Я думаю, вы немного все перепутали.

  1. У вас есть файлы, хранящиеся в HDFS.Здесь Blocksize является важным фактором.В зависимости от вашей конфигурации блок обычно имеет 64 МБ или 128 МБ.Таким образом, каждый из ваших файлов размером 1 МБ занимает 64 МБ в HDFS.Это очень много неиспользуемого пространства.Можете ли вы объединить эти TXT-файлы вместе?В противном случае вы быстро исчерпаете блоки HDFS.HDFS не предназначена для хранения большого количества маленьких файлов.

  2. Spark может читать файлы из HDFS, Local, MySQL.Он не может контролировать принципы хранения, используемые там.Поскольку Spark использует RDD, они разбиваются на части для передачи части данных работникам.Количество разделов можно проверить и контролировать (используя перераспределение).Для чтения HDFS это число определяется количеством файлов и блоков.

Вот хорошее объяснение того, как SparkContext.textFile () обрабатывает разбиение и разбиение в HDFS: Как раздел Spark (ING) работает с файлами в HDFS?

...