ТЕХНИЧЕСКИЕ СОВЕТЫ

Как создать и запустить кластер EMR с помощью AWS CLI

Понятное и понятное руководство для начинающих.

Введение

Кратко об Apache Spark и кластере Spark на AWS EMR

« Apache Spark - единый аналитический движок для крупномасштабной обработки данных ». Spark считается королем джунглей больших данных с различными приложениями для анализа данных, машинного обучения, потоковой передачи и анализа графиков и т. Д. Существует 4 различных Режимы Spark: (1) Локальный режим: Spark на отдельном компьютере, например портативном компьютере, для изучения синтаксиса и создания прототипа проекта; остальные 3 режима - это режимы диспетчера кластера: (2) Автономный режим используется для работы в частном кластере; (3) YARN и (4) Режимы Mesos используются при совместном использовании кластера с командой. В автономном режиме Spark развертывается в частном кластере, таком как EC2 на Amazon Web Service AWS. Кластер Spark включает несколько компьютеров. Чтобы использовать код Spark на каждой машине, Spark и его зависимости необходимо загрузить и установить вручную. Благодаря сервису Elastic Map Reduce, EMR от AWS, все готово к использованию без какой-либо ручной установки. Поэтому вместо использования EC2 мы используем службу EMR для настройки кластеров Spark.

Мотивация для этого урока

Я потратил много часов на создание, настройку и запуск кластера Spark на EMR с помощью интерфейса командной строки AWS, AWS CLI. Хотя есть несколько руководств по этой задаче, которые я нашел или получил в ходе курсов, большинство из них очень неприятно следовать. Некоторые из них недостаточно ясны; некоторые пропускают важные шаги; или предположим, что учащиеся уже знакомы с некоторыми предварительными знаниями об AWS, конфигурациях интерфейса командной строки и т. д. После успешной настройки и запуска кластера я понял, что эта задача на самом деле не так уж и сложна; и мы должны сделать это с легкостью. Я не хочу больше видеть, как люди борются с этим. Поэтому я решил сделать этот учебник.

В этой статье предполагается, что вы уже имеете некоторые практические знания о Spark, PySpark, среде командной строки и AWS. В частности, эта статья предназначена для читателей, которые знают, зачем им нужно создавать кластер Spark :). Чтобы узнать больше о Spark, прочтите ссылку здесь.

Это длинное и подробное руководство. Вкратце, все шаги включают:

  1. Создать учетную запись AWS
  2. Создать пользователя IAM
  3. Настроить учетные данные в EC2
  4. Создать корзину S3 для хранения файлов журналов, созданных кластером
  5. Установить пакет AWS CLI awscli
  6. Настроить среду AWS CLI (создать учетные данные и файлы конфигурации)
  7. Создать кластер EMR
  8. Разрешить доступ по SSH
  9. Создать SSH-соединение с главным узлом кластера
  10. Начать использовать кластер EMR

Не стесняйтесь пропустить любой шаг, который вам уже известен. Версия этого руководства для записной книжки Jupyter вместе с другими учебниками по Spark и многими другими учебниками по науке о данных можно найти на моем Github. А теперь приступим!

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

Некоторые предостережения:

1. В этом руководстве вместо учетной записи AWS Educate следует использовать обычную учетную запись AWS. Обычная учетная запись AWS предоставляет пользователям полный доступ к ресурсам AWS и ролям IAM; в то время как образовательная учетная запись имеет ограниченный доступ.

2. Вы несете ответственность за мониторинг платы за использование используемой вами учетной записи AWS. Не забывайте отключать кластер и другие связанные ресурсы каждый раз, когда вы заканчиваете работу. Я реализовал кластер EMR много раз; и это руководство не должно стоить или стоить менее 0,5 доллара на AWS.

3. Консоль AWS и контент Udacity со временем могут изменяться / обновляться, поэтому я бы рекомендовал вам поискать на сайте AWS и в своих уроках Udacity любые обновленные руководства / руководства. Это руководство было создано в соответствии с консолью AWS в июле 2020 года.

4. Это руководство создано с использованием Chrome и Mac OS X. Оно не должно сильно отличаться на платформе Windows.

Ссылка

Конкретные шаги по созданию, настройке и запуску кластера EMR в AWS CLI

Шаг 1. Создайте учетную запись AWS

Шаг 2. Создайте пользователя IAM

В консоли AWS нажмитеService, введите «IAM», чтобы перейти в консоль IAM:

= ›Выберите User =› Add user = ›Введите имя пользователя, например emr_user, выберите Access type как Программный доступ, а затем Next: Permissions.

Щелкните страницу Attach existence policies directly, введите и установите разрешение как Administrator Access, а затем выберите Next: Tags.

Пропустите эту страницу тега и выберите Next: Review = ›Выберите Create user =› Сохраните имя пользователя, ключ доступа и секретный ключ доступа.

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

Шаг 3. Настройте учетные данные в EC2

В консоли AWS нажмите «Сервис», введите «EC2», чтобы перейти в консоль EC2.

Выберите Key Pairs в Сеть и безопасность на левой панели = ›Выберите Create key pair

Введите имя для пар ключей, например «emr-cluster». Формат файла: pem = ›Выберите Create key pair. После этого шага будет автоматически загружен файл .pem, в данном случае имя файла - emr_cluster.pem. Мы будем использовать этот файл на шаге 6.

Шаг 4 (необязательно): создайте корзину S3 для хранения файлов журналов, созданных кластером.

  • Это будет сегмент AWS для хранения файлов журналов, создаваемых кластером, который мы создадим и настроим. Если мы не укажем корзину S3, она будет автоматически создана для нас при создании и запуске кластера EMR.
  • В консоли AWS нажмите Service, введите «S3» и перейдите в консоль S3 = ›Выберите Create bucket =› Введите имя сегмента, например «s3-for-emr-cluster», выберите предпочтительный регион, например « Запад США (Орегон). Оставьте другие параметры по умолчанию, чтобы создать ведро.

  • Обратите внимание, что для наилучшей производительности и во избежание ошибок не забудьте использовать один и тот же регион / субрегион AWS для всей своей работы (на S3, EC2, EMR и т. Д.)

Шаг 5. Установите пакет awscli

  • На терминале установите awscli с помощью командыpip install awscli
  • Введите aws help, чтобы проверить правильность установки. Установка должна быть успешной, если вывод будет следующим:

Шаг 6. Настройте среду интерфейса командной строки AWS (создайте файлы учетных данных и конфигурации)

Этот шаг поможет нам автоматически получить доступ к AWS в среде awscli, используя учетные данные пользователя, полученные на шаге 2 выше.

Для этой настройки существует 2 подхода: создание файлов учетных данных и конфигурации вручную (подход 1) или создание этих файлов с помощью команды theaws (подход 2). Вы можете использовать любой из них.

Подход 1:

Создайте файл credentials в терминале, как показано ниже (вы можете использовать nano или любой другой текстовый редактор по вашему выбору):

  • На терминале перейдите в желаемую папку, обычно это корневой каталог, и создайте скрытый каталог, например aws:

$mkdir .aws (точка для обозначения скрытого каталога)

  • Перейдите в этот каталог $cd .aws
  • Создайте файл acredentials с помощью nano: $nano credentials Введите содержимое файла credentials, как показано ниже (замените ключ «EXAMPLE_ID» и секретный ключ «EXAMPle_Key» на те, которые были созданы для пользователя «emr-user» на шаге 2):

  • Используйте Ctrl + X, а затем Y, чтобы сохранить файл и выйти из nano.

Создайте файл конфигурации:

  • $nano config Введите содержимое файла config, как показано ниже (регион, который мы используем, будет таким же, как мы использовали для создания корзины S3 на шаге 4):
[default]
region=us-west-2
  • Используйте Ctrl + X, а затем Y, чтобы сохранить файл и выйти из nano.

Подход 2:

На терминале введите $aws configure и введите необходимую информацию, как показано ниже:

AWS Access Key ID [None]: (Enter your access key from the user 'emr-user' created in Step 2)
AWS Secret Access Key [None]: (Enter your secret key from the user 'emr-user' created in Step 2)
Default region name [None]: us-west-2 (The same region used in Step 4)
Default output format [None]:

Эти 2 файла будут автоматически созданы в скрытой папке .aws, обычно расположенной в корневом каталоге, как показано ниже:

  • $cd ~/.aws
  • Введите$ls , чтобы проверить наличие 2 файлов. Информация должна быть такой же, как в подходе 1, мы можем проверить содержимое, набрав:
  • $cat credentials
  • $cat config

Подготовьте файл .pem, созданный на шаге 3

Для подключения к кластеру нам понадобится файл .pem, созданный на шаге 3. Переместите файл .pem, который мы загрузили на шаге 3, в желаемое место, используемое для проекта. Для меня я помещаю его в то же место, что и учетные данные и файлы конфигурации в скрытой папке .aws, расположенной в корневом каталоге ~/.aws/emr-cluster.pem)

$ mv ~/Downloads/emr-cluster.pem .
  • При использовании этого файла .pem для настройки ssh возникнет ошибка, если файл .pem слишком открыт. Пример предупреждения: «Разрешения 0644 для‘ ~ / .aws / emr-cluster.pem ’слишком открыты. Требуется, чтобы ваши файлы закрытого ключа НЕ были доступны другим лицам. Этот закрытый ключ будет проигнорирован. »
  • В этом случае нам нужно изменить разрешение для этого файла .pem с помощью команды: sudo chmod 600 ~/.aws/emr-cluster.pem

Убедитесь, что мы успешно установили пакет awscli и настроили учетные данные

Чтобы проверить, успешно ли мы установили awscli и настроили учетные данные, введите некоторые команды aws, такие как

  • Список всех пользователей IAM: $aws iam list-users
  • Список всех сегментов в s3: $aws s3 ls Эта команда выведет список всех сегментов s3, имеющихся в AWS:

Шаг 7. Создайте кластер EMR

Теперь мы готовы создать наш EMR-кластер на терминале. В терминале набираем команду:

aws emr create-cluster --name test-emr-cluster --use-default-roles --release-label emr-5.28.0 --instance-count 3 --instance-type m5.xlarge --applications Name=JupyterHub Name=Spark Name=Hadoop --ec2-attributes KeyName=emr-cluster  --log-uri s3://s3-for-emr-cluster/

Объяснение компонентов сценария EMR:

  • --name: имя кластера в данном случае - test-emr-cluster
  • --use-default-roles: используйте роль службы по умолчанию (EMR_DefaultRole) и профиль экземпляра (EMR_EC2_DefaultRole) для разрешений на доступ к другим сервисам AWS.
  • --release-label emr-5.28.0: построить кластер с EMR версии 5.28.0
  • --instance-count 3 и--instance-type m5.xlarge: построить 1 главный узел и 2 основных узла типа m5.xlarge
  • --applications Name=JupyterHub Name=Spark Name=Hadoop: установите JupyterHub, Spark и Hadoop в этом кластере
  • --ec2-attributes KeyName=emr-cluster: настраивает конфигурации инстансов Amazon EC2, KeyName - это имя инстанса EC2, которое мы установили на шаге 3 (Set up credentials in EC2 и получаем файл .pem). В данном случае имя emr-cluster.
  • --log-uri s3://s3-for-emr-cluster/: укажите корзину S3, в которой вы хотите хранить файлы журнала. В этом случае корзиной S3 является «s3-for-emr-cluster». Это поле является необязательным (как описано в шаге 4).
  • Поскольку кластеры EMR являются дорогостоящими, мы можем включить опцию --auto-terminate для автоматического завершения кластера, когда все действия в кластере выполнены. Чтобы это работало, нам также необходимо указать действие начальной загрузки в команде, используя --bootstrap-actions Path="s3://bootstrap.sh". Когда вы используете автоматическое завершение, кластер запускается, выполняет любые указанные вами действия начальной загрузки, а затем выполняет шаги, которые обычно вводят данные, обрабатывают данные, а затем создают и сохраняют выходные данные. По завершении этапов Amazon EMR автоматически завершает работу инстансов Amazon EC2 в кластере. Если мы не выполняем никаких действий начальной загрузки, мы должны удалить это поле. Подробную информацию о начальной загрузке можно найти на сайте AWS.

Желаемый результат после создания кластера EMR:

Использование ClusterId для проверки статуса и информации о кластере (j- EXAMPLECLUSTERID) с помощью команды:

aws emr describe-cluster --cluster-id j-EXAMPLECLUSTERID

Мы должны подождать несколько минут, пока кластер станет доступным (статус изменится на «доступен»), прежде чем перейти к следующему шагу.

*** Обновление 1: если вы столкнетесь с проблемой "EMR_DefaultRole is invalid" or "EMR_EC2_DefaultRole is invalid" error при создании кластера Amazon EMR, возможно, вам придется удалить роли и профиль экземпляра; затем воссоздайте роли как эту инструкцию. Поблагодарите Тревора С. за обсуждение этого вопроса.

*** Обновление 2: чтобы сделать кластер доступным для записной книжки на EMR, нам может потребоваться включить SubnetIds в - ec2-attributes:

aws emr create-cluster --name test-emr-cluster --use-default-roles --release-label emr-5.28.0 --instance-count 3 --instance-type m5.xlarge --applications Name=JupyterHub Name=Spark Name=Hadoop --ec2-attributes SubnetIds=subnet-YOURSUBNET,KeyName=emr-cluster  --log-uri s3://s3-for-emr-cluster/

(Спасибо Саверио Г. за то, что обсудил меня по этому поводу.)

Как найти идентификаторы подсети?

Щелкните вкладку VPCSubnets на консоли EMR, чтобы выбрать из списка.

Еще один безопасный способ для новичка: создать аналогичный кластер EMR с помощью консоли AWS. Затем просмотрите сеанс «Сеть и оборудование» на странице Сводка этого кластера, чтобы увидеть идентификатор подсети:

Вы можете получить доступ к подсетям через Панель управления VPC на AWS. Подробнее о подсети и VPC можно узнать на сайте AWS.

Шаг 8. Разрешите доступ по SSH

В консоли AWS щелкните Service, введите EMR и перейдите в консоль EMR.

= ›Выберите Clusters =› Выберите имя кластера в списке, в данном случае test-emr-cluster

На вкладке Summary прокрутите вниз, чтобы увидеть часть Security and access, выберите ссылку Security groups for Master

Выберите Security group ID для ElasticMapReduce-master

Прокрутите вниз до Inbound rules, Edit inbound rules = ›В целях безопасности удалите все правила SSH, если они есть, затем выберите Add Rule =› Выберите тип: SSH, TCP для протокола и 22 для диапазона портов = ›Для источника выберите My IP =› Выберите Save.

Шаг 9. Создайте SSH-соединение с главным узлом кластера

Подход 1:

  • На терминале проверьте id кластера с помощью команды

aws emr list-clusters

  • Используйте эту команду для подключения к кластеру. Не забудьте указать правильный путь к файлу .pem:

aws emr ssh --cluster-id j-EXAMPLECLUSTERID --key-pair-file ~/.aws/emr-cluster.pem

Если мы видим экран с буквой EMR, как показано ниже, поздравляем, вы успешно создали, настроили и подключились к кластеру EMR с помощью AWS CLI !!!!

Закройте соединение с кластером с помощью команды $logout.

Подход 2:

  • В консоли AWS щелкните Service, введите EMR и перейдите в консоль EMR.
  • Выберите Clusters = ›Нажмите на имя кластера в списке, в данном случае test-emr-cluster =› На вкладке «Сводка» нажмите ссылку Подключиться к главному узлу с помощью SSH.

  • Скопируйте команду, показанную во всплывающем окне, и вставьте ее в терминал.

  • Не забудьте заменить ~ / emr-cluster.pem на местоположение и имя файла с закрытым ключом (.pem), который мы создали. Например

ssh -i ~/.aws/emr-cluster.pem [email protected]

Если мы видим экран с буквой EMR, поздравляем, вы успешно создали, настроили и подключились к кластеру EMR с помощью AWS CLI !!!!

Теперь вы можете начать использовать кластер EMR

Создайте простую задачу Spark, например, создайте фрейм данных Spark, содержащий время в виде строки типа, а затем преобразуйте этот столбец в другой формат.

На кластерном терминале создайте файл test_emr.py

$nano test_emr.py

Скопируйте и вставьте этот скрипт в test_emr.py

### Content of the file 'test_emr.py'
from pyspark.sql import SparkSession, functions as F
if __name__ == "__main__":
    """
        example of script submited to spark cluster
    """
    spark = SparkSession.builder.getOrCreate()
    
    df = spark.createDataFrame([('01/Jul/1995:00:00:01 -0400', ),('01/Jul/1995:00:00:11 -0400',),('26/Jul/1995:17$
                            ('19/Jul/1995:01:56:43 -0400',), ('11/Jul/1995:12:50:18 -0400',)], ['TIME'])
    df = df.withColumn("date", F.unix_timestamp(F.col('TIME'), 'dd/MMM/yyyy:HH:mm:ss Z').cast('timestamp'))
    # show the dataframe
    df.show()
    
    #### stop the spark, otherwise the program will be hanged 
    spark.stop()

Содержимое файла, как показано в nano текстовом редакторе:

Отправьте скрипт на кластерный терминал, используя команду:

$spark-submit --master yarn ./test_emr.py

Когда задача выполняется, она может перегружаться любой информацией на терминале, что нормально для Spark. Вывод можно найти в журнале информации:

Поздравляю! Ты сделал это!

Не забудьте завершить работу кластера, если он больше не используется.

Введите logout, чтобы выйти из кластера. Затем завершите кластер, используя эту команду:

$aws emr terminate-clusters --cluster-id j-EXAMPLECLUSTERID

Обратите внимание, что мы можем легко снова создать кластер с теми же конфигурациями с помощью команды AWS CLI, которую можно найти, щелкнув вкладку AWS CLI export, когда мы выберем завершенный кластер ` test-emr-cluster` на консоли EMR:

Я надеюсь, что никому больше не придется бороться за создание, настройку и запуск кластера Spark на EMR с помощью AWS CLI. Пожалуйста, дайте мне знать, если у вас возникнут проблемы или вы обнаружите что-то не так в этом руководстве.

Версия этого руководства для записной книжки Jupyter, а также другие руководства по Spark и многие другие руководства по науке о данных можно найти на моем Github. Пожалуйста, наслаждайтесь!