Как работает Spark при чтении файлов HDFS - PullRequest
0 голосов
/ 15 мая 2019

Скажем, у меня файл размером 256 КБ хранится в файловой системе HDFS одного узла (как два блока по 128 КБ каждый). Этот файл содержит два блока 128 КБ каждый. Предположим, у меня есть кластер из двух узлов каждого 1 ядра. Насколько я понимаю, искра во время преобразования будет читать полный файл на одном узле в памяти, а затем передать данные памяти одного файлового блока на другой узел, чтобы оба узла / ядра могли его параллельно выполнять? Это правильно?

Что если бы у обоих узлов было два ядра, а не одно ядро? В таком случае два ядра на одном узле могут выполнять вычисления? Это верно?

         val text = sc.textFile("mytextfile.txt") 
         val counts = text.flatMap(line => line.split(" ")).map(word => (word,1)).reduceByKey(_+_) 
         counts.collect

Ответы [ 2 ]

0 голосов
/ 18 мая 2019

Ваш вопрос немного гипотетичен, так как маловероятно, что у вас будет кластер Hadoop с HDFS, существующий только с одним узлом данных и двумя рабочими узлами, один из которых является рабочим и узлом данных.То есть, вся идея Spark (и MR) с HDFS состоит в том, чтобы перенести обработку данных.Рабочие узлы на самом деле являются узлами данных в стандартной настройке Hadoop.Это первоначальное намерение.

Некоторые варианты ответа на ваш вопрос:

  • При условии, как описано выше, каждый рабочий узел будет обрабатывать один раздел и последующие преобразования вновые сгенерированные RDD до завершения.Конечно, вы можете перераспределить данные, и то, что происходит, зависит от количества разделов и количества исполнителей на рабочий узел.

  • В двух словах: если у вас изначально N блоков / разделов и меньше, чем N, выделенных исполнителей - E - в кластере Hadoop с HDFS, то вы получите некоторую передачу блоков (нетасование, о котором говорится в другом месте) назначенным рабочим, от рабочих, где исполнителю Spark не назначен исполнитель, в противном случае блок назначается для обработки этому узлу данных / рабочего, очевидно.Каждый блок / раздел обрабатывается некоторым образом, перемешивается, и следующий набор разделов или разделов читается и обрабатывается, в зависимости от скорости обработки ваших преобразований.

  • Вслучай AWS S3 и эквивалентного облачного хранилища Mircosoft и gooogle, который оставляет в стороне принцип локальности данных, как в приведенном выше случае - т.е. вычислительная мощность отделена от хранилища, с предположением, что сеть не является узким местом - что было в точности классической Hadoopпричина довести обработку до данных, тогда она работает аналогично вышеупомянутому, то есть передача данных S3 рабочим.

Все это предполагает, что было вызвано действие.

Я оставляю в стороне принципы Rack Awareness и т. Д., Поскольку все становится довольно сложным, но Менеджеры ресурсов понимают эти вещи и принимают соответствующие решения.

0 голосов
/ 15 мая 2019

В первом случае Spark обычно загружает 1 раздел на первом узле, а затем, если ему не удается найти пустое ядро, он загружает 2-й раздел на 2-м узле после ожидания spark / locality.wait (по умолчанию 3 секунды).

Во 2-м случае оба раздела будут загружены на один и тот же узел, если только у него нет свободных ядер.

Многие обстоятельства могут привести к тому, что это изменится, если вы играете с конфигурациями по умолчанию.

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