Как Had oop HDFS решает, какие данные помещать в каждый блок? - PullRequest
0 голосов
/ 12 июля 2020

Я пытался погрузиться в то, как Had oop HDFS решает, какие данные следует поместить в один блок, и, похоже, не нашел ответа solid. Мы знаем, что Had oop автоматически распределяет данные в блоки в HDFS по кластеру, однако какие данные каждого файла следует объединить в блок? Просто произвольно поставит? И это то же самое для Spark RDD?

1 Ответ

0 голосов
/ 12 июля 2020
  1. Поведение блока HDFS

Я попытаюсь на примере выделить различия в разделении блоков в зависимости от размера файла. В HDFS у вас есть:

Splittable FileA size 1GB
dfs.block.size=67108864(~64MB)

задание MapRed для этого файла:

16 splits and in turn 16 mappers.

Давайте посмотрим на этот сценарий со сжатым (не разделяемым) файлом:

Non-Splittable FileA.gzip size 1GB
dfs.block.size=67108864(~64MB)

Задание MapRed для этого файла:

16 Blocks will converge on 1 mapper.

Лучше заранее избегать этой ситуации, поскольку это означает, что средство отслеживания задач должно будет получить 16 блоков данных, большинство из которых не будут локальными для средства отслеживания задач.

искровое чтение разделяемого файла HDFS:

sc.textFile не начинает никакого чтения. Он просто определяет резидентную структуру данных драйвера, которую можно использовать для дальнейшей обработки.

Только после вызова действия в RDD Spark создаст стратегию для выполнения всех необходимых преобразований (включая read), а затем вернуть результат.

Если есть действие, вызываемое для запуска последовательности, и ваше следующее преобразование после чтения должно отображаться, то Spark потребуется прочитать небольшой фрагмент строк файла (в соответствии со стратегией разделения, основанной на количестве ядер), а затем немедленно начните отображать его, пока он не вернет результат драйверу, или перемешайте перед следующей последовательностью преобразований.

Если ваша стратегия разделения (defaultMinPartitions), похоже, забивает рабочих, потому что представление java вашего раздела (InputSplit в терминах HDFS) больше, чем доступная память исполнителя, тогда вам нужно указать количество разделов для чтения в качестве второго параметр в textFile. Вы можете рассчитать идеальное количество разделов, разделив размер файла на размер целевого раздела (с учетом увеличения объема памяти). Простая проверка возможности чтения файла:

    sc.textFile(file, numPartitions)
      .count()  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...