2015-07-21 2 views
2

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

  1. Я создал один мастер и два подчиненных узла на AWS.
  2. Я использовал команду bash $ scp -r -i my-key-pair.pem my_dir [email protected]_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 - очень дорогостоящий инструмент для параллельных вычислений? Я очень ценю это, если кто-нибудь поможет мне по этим двум вопросам.

ответ

1

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

+0

Спасибо за ваш комментарий! Но, похоже, я все еще запутался в архитектуре всего процесса. Я знаю, что программа драйвера на главном узле загружает файлы csv, создает RDD и отправляет RDD на каждый из подчиненных узлов. Таким образом, подчиненные узлы просто получают RDD, сгенерированный с главного узла, а затем выполняют свою собственную задачу, но почему я должен отправлять свои файлы csv на каждый из подчиненных узлов? (Как они получили RDD) Кроме того, как я уже упоминал в своем вопросе, я также поместил каталог 'data', содержащий все файлы csv, в HDFS в моем шаге 4, почему мне нужно скопировать все мои данные в подчиненные узлы? –

+1

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

+0

Спасибо за отличный ответ! Похоже, что в Apache-Spark, обрабатываемый набор данных по-прежнему занимает много внешнего хранилища, независимо от того, мы используем файловую систему главного узла, HDFS или AWS S3.Но я не понимаю, почему мы называем память в памяти. –