Я написал код python sum.py
о суммировании всех номеров для каждого файла csv в каталоге data
. Теперь я собираюсь использовать Apache-Spark на веб-сервисе Amazon (AWS), чтобы распараллелить процесс суммирования для каждого файла csv. Я уже сделал следующие шаги:Spark RDD Внешнее хранилище
- Я создал один мастер и два подчиненных узла на AWS.
- Я использовал команду bash
$ scp -r -i my-key-pair.pem my_dir [email protected]_name
, чтобы загрузить каталогmy_dir
на главный узел AWS-кластера. Папкаmy_dir
содержит два подкаталога:code
иdata
, в которыхcode
содержит код pythonsum.py
иdata
содержит все файлы csv. - Я зарегистрировал свой главный узел AWS, а оттуда использовал команду bash
$ ./spark/copy-dir /my_dir/code/
для отправки моего кодового каталогаcode
, который содержитsum.py
для всех подчиненных узлов. - На главном узле 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 - очень дорогостоящий инструмент для параллельных вычислений? Я очень ценю это, если кто-нибудь поможет мне по этим двум вопросам.
Спасибо за ваш комментарий! Но, похоже, я все еще запутался в архитектуре всего процесса. Я знаю, что программа драйвера на главном узле загружает файлы csv, создает RDD и отправляет RDD на каждый из подчиненных узлов. Таким образом, подчиненные узлы просто получают RDD, сгенерированный с главного узла, а затем выполняют свою собственную задачу, но почему я должен отправлять свои файлы csv на каждый из подчиненных узлов? (Как они получили RDD) Кроме того, как я уже упоминал в своем вопросе, я также поместил каталог 'data', содержащий все файлы csv, в HDFS в моем шаге 4, почему мне нужно скопировать все мои данные в подчиненные узлы? –
Для простоты в обращении водитель создает RDD, но RDD - это не данные, которые вы вложили в свою коллекцию, а только метаданные о том, как получить к ней доступ. Поскольку средства для доступа к этим данным, видимые из вашего драйвера, - это посмотреть на локальную файловую систему, это то, что сделают исполнители, управляемые одними и теми же метаданными. – huitseeker
Спасибо за отличный ответ! Похоже, что в Apache-Spark, обрабатываемый набор данных по-прежнему занимает много внешнего хранилища, независимо от того, мы используем файловую систему главного узла, HDFS или AWS S3.Но я не понимаю, почему мы называем память в памяти. –