Внешнее хранилище Spark RDD

Я написал код Python sum.py для суммирования всех чисел для каждого файла csv в каталоге data. Теперь я собираюсь использовать Apache-Spark на Amazon Web Service (AWS), чтобы распараллелить процесс суммирования для каждого файла csv. Я уже сделал следующие шаги:

  1. Я создал один главный и два подчиненных узла на AWS.
  2. Я использовал команду bash $ scp -r -i my-key-pair.pem my_dir root@host_name для загрузки каталога my_dir на главный узел кластера AWS. Папка my_dir содержит два подкаталога: code и data, в которых code содержит код Python sum.py, а data содержит все файлы CSV.
  3. Я вошел в свой главный узел AWS и оттуда использовал команду bash $ ./spark/copy-dir /my_dir/code/ для отправки моего каталога кода code, содержащего sum.py, на все подчиненные узлы.
  4. На главном узле AWS я также поместил каталог data, содержащий все файлы csv, в HDFS, используя $ ./ephemeral-hdfs/bin/hadoop fs -put /root/my_dir/data/.

Теперь, когда я отправляю свое приложение на главный узел AWS: $ ./spark-submit ~/my_dir/code/sum.py, появляется сообщение об ошибке, что рабочий узел не может найти файлы csv. Однако после того, как я отправлю свой каталог данных data на все подчиненные узлы с помощью команды copy-dir, все работает отлично.

Так что я очень запутался в этой проблеме. Насколько мне известно, программа драйвера на главном узле загружает файлы csv, создает RDD и отправляет отдельные задачи, а также RDD на каждый из подчиненных узлов. Это означает, что подчиненным узлам не нужно знать исходные файлы CSV, поскольку они просто получают RDD от главного узла. Если это правда, почему я должен отправлять все мои CSV-файлы на каждый подчиненный узел? Кроме того, если я отправлю все свои файлы csv на подчиненные узлы, будет использоваться много внешнего дискового хранилища на подчиненных узлах. Означает ли это, что Apache-Spark - очень дорогой инструмент для параллельных вычислений? Я очень признателен, если кто-нибудь поможет мне по этим двум вопросам.


person Ruofan Kong    schedule 21.07.2015    source источник


Ответы (1)


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

person Francois G    schedule 22.07.2015
comment
Спасибо за ваш комментарий! Но, похоже, я все еще не понимаю архитектуру всего процесса. Я знаю, что программа драйвера на главном узле загружает файлы csv, создает RDD и отправляет RDD каждому из подчиненных узлов. Таким образом, подчиненные узлы просто получают RDD, сгенерированный главным узлом, а затем выполняют свою собственную задачу, но почему я должен отправлять свои файлы csv на каждый из подчиненных узлов? (Поскольку они получили RDD) Кроме того, как я уже упоминал в своем вопросе, я также поместил каталог data, содержащий все файлы csv, в HDFS на моем шаге 4, почему мне нужно копировать все мои данные на подчиненное устройство узлы? - person Ruofan Kong; 22.07.2015
comment
Чтобы быть карикатурно простым, драйвер создает RDD, но RDD - это не данные, которые вы помещаете в свою коллекцию, а только метаданные о том, как получить к ним доступ. Поскольку средство доступа к этим данным, видимое вашим драйвером, заключается в просмотре локальной файловой системы, это то, что будут делать исполнители, управляемые одними и теми же метаданными. - person Francois G; 22.07.2015
comment
Спасибо за отличный ответ! Похоже, что в Apache-Spark набор данных, обрабатываемый позже, по-прежнему занимает много внешнего хранилища, независимо от того, используем ли мы файловую систему главного узла, HDFS или AWS S3. Но я не понимаю, почему мы называем это хранением в памяти. - person Ruofan Kong; 22.07.2015
comment
Если вы используете HDFS, или S3, или файловый сервер, или какой-либо способ обслуживания данных, доступных с любого узла с единой точкой доступа, нет необходимости реплицировать данные на каждом узле. - person Francois G; 22.07.2015
comment
Спасибо за отличный ответ! У меня также есть еще один вопрос по этому поводу. Каждый подчиненный узел загружает данные из своей локальной файловой системы или из HDFS? Если он загружает данные из своей локальной файловой системы, зачем нам помещать данные в HDFS, прежде чем мы отправим их на выполнение? Есть какие-то причины? - person Ruofan Kong; 23.07.2015
comment
Если у вас есть другой вопрос, возможно, вы захотите задать его как вопрос на этом сайте, чтобы он был полезен другим (и чтобы люди, читающие этот вопрос, не были единственными, кто мог бы ответить). Ничто не мешает вам тогда ответить на этот комментарий ссылкой на вновь созданный вопрос. - person Francois G; 23.07.2015
comment
Да, ты прав. Я разместил вопрос по этому поводу: stackoverflow.com/questions/31578986/ - person Ruofan Kong; 23.07.2015