Статьи

Использование AWS ElasticMapReduce с интерфейсом командной строки

В этой статье я собираюсь использовать   сервис AWS  MapReduce (называемый ElasticMapReduce ), используя  CLI  для EMR.

Процесс использования EMR можно разделить на три этапа на высоком уровне:

  • установить и заполнить  ведра S3
  • создать и запустить работу EMR
  • получить результаты из ведра S3

Прежде чем вы сможете начать с этих трех шагов высокого уровня, необходимо выполнить некоторые другие действия:

  • вам нужно будет иметь  учетную запись AWS
  • вам нужно будет установить клиент S3 на свой компьютер
  • вам нужно будет установить EMR CLI на вашем компьютере

Что ж, для аккаунта AWS я просто предполагаю, что он есть, иначе самое время найти себе ;-)

В качестве клиента S3 я использую  s3cmd,  установку которого я описал  здесь .

Чтобы установить EMR CLI (на моем MacBook с Lion в моем случае), я следовал инструкциям, описанным  здесь . Как сказано в инструкции, CLI работает с версией Ruby 1.8.7. и не более поздние версии. Поскольку мой MacOS поставляется с Ruby 1.9.3 по умолчанию, он действительно не работает. Но не паникуйте, просто получите последнюю версию CLI  здесь  от GitHub (я предпочитаю это вместо понижения стандартной установки Ruby).

Когда EMR установлен, его необходимо настроить. Первым шагом является создание файла ‘credentials.json’ в корневом каталоге каталога EMR CLI.
Содержание моего credentials.json:

{
"access_id": "XXXXXXXXXXXXXXX",
"private_key": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"keypair": "4synergy_palma",
"key-pair-file": "/Users/pascal/4synergy_palma.pem",
"log_uri": "S3://map-reduce-intro/log",
"region": "eu-west-1"
}

Когда CLI установлены, мы можем начать с реальной работы. Я просто придерживаюсь примера в  Руководстве для разработчиков EMR .

1. Установить и заполнить ведра S3

Откройте окно терминала.

Создайте S3 bucket из командной строки:
s3cmd mb s3://map-reduce-intro

Создайте входной файл, который будет использоваться с тестовым заданием в качестве ввода:
nano input.txt
и поместите в него текст:

Снимок экрана 2013-05-06 в 20.34.52

Затем загрузите этот файл в корзину в новую папку в корзине:
s3cmd put input.txt s3://map-reduce-intro/input/

Затем создайте функцию отображения (скрипт Python) и загрузите ее в корзину S3:
nano wordsplitter.py
и поместите в нее пример сценария из руководства разработчика:
Снимок экрана 2013-05-06 в 22.33.29

Загрузите этот файл также в корзину S3 следующим образом:
s3cmd put wordsplitter.py s3://map-reduce-intro/job/

Как указано в руководстве для разработчиков, мы предоставляем только сценарий отображения, так как мы используем стандартную функцию сокращения Hadoop, «агрегат».

Теперь ввод готов, мы можем создать задание и выполнить его.

2. Создайте и запустите задание EMR

Мы делаем это, выполняя следующую команду из корня нашей установки EMR CLI:
./elastic-mapreduce --create --stream --mapper s3://map-reduce-intro/job/wordsplitter.py --input s3://map-reduce-intro/input --output s3://map-reduce-intro/results --reducer aggregate
вывод в терминале будет просто идентификатором задания, например:
Created job flow j-2MO24NGGNMC5N

Получите результаты из корзины S3
Если мы перейдем к корзине S3 и перечислим папку «результатов», мы увидим следующее (обратите внимание, что это может занять несколько минут, прежде чем кластер будет запущен, выполнен и завершен):

MacBook-Air-van-Pascal:~ pascal$ s3cmd ls s3://map-reduce-intro/results/
2013-05-06 20:03 0 s3://map-reduce-intro/results/_SUCCESS
2013-05-06 20:03 27 s3://map-reduce-intro/results/part-00000
MacBook-Air-van-Pascal:~ pascal$
The _SUCCESS file just tells us the job went fine. The file ‘part-00000′ contains the output of our ‘aggregate’ action we performed. To get it do:
s3cmd get s3://map-reduce-intro/results/part-00000

Now if we look at the expected contents:
Screen Shot 2013-05-07 at 20.58.41

I know this is a very basic example and there is really a lot more to show about EMR but at least this should give you a start to play with it yourself.

One thing to keep in mind is that costs are being charged per hour and that if you only are using a cluster for a few seconds you will be charged for the complete hour. An hour costs about 0.015 cents on top of the EC2 costs of the cluster.ghost o