Статьи

Знакомство с Amazon Elastic MapReduce

Amazon Elastic MapReduce — это сервис из портфеля AWS, который можно использовать для обработки данных и анализа огромных объемов данных. Он основан на Hadoop (на момент написания этой статьи он использует Hadoop 0.20.205) и использует другие сервисы AWS, такие как EC2 и S3.

Приложения для обработки данных могут быть реализованы с использованием различных технологий, таких как Hive, Pig, Java (Custom Jar) и Streaming (например, python или ruby). В этом посте будет продемонстрировано, как использовать Hive в Amazon Elastic MapReduce — образец приложения будет рассчитывать среднюю цену акций Apple в каждом году с 1984 по 2012 год. На момент написания статьи версия Hive составляла 0.7.1. (Примечание: как будет показано, AAPL начиналась со средней цены около 25 долларов США в 1984 году, в 1997 году ее удалось снизить до 18 долларов США, а сейчас она составляет около 500 — 496,32138, если быть более точным, — некоторые цифры для компании, которая десятилетиями находится в Infinite Loop…)

Как создать Elastic MapReduce Jobs?

Есть три шага для управления потоком работ EMR:

1. / Загрузите скрипт (т.е. файл hive.q) и данные для обработки на S3. Если вы не знакомы с AWS, это хорошее место, чтобы начать понимать его структуру и способы ее использования.

Тестовые данные, использованные в посте, загружаются с Yahoo! Финансовый сайт (Исторические данные по акциям AAPL). Перейдите по  адресу http://finance.yahoo.com/q/hp?s=AAPL+Historical+Prices   и затем прокрутите вниз до ссылки «Загрузить в электронную таблицу». Это создаст CSV-файл (~ 6950 строк) со следующими столбцами: Дата, Открыть, Высокий, Низкий, Закрыть, Объем, Адж Закрыть. Удалите заголовок (первую строку), чтобы оставить только соответствующие данные в файле CSV.

Шаги для загрузки входных файлов:

Перейдите к консоли AWS S3 и создайте корзину «stockprice»:

б. / создавать папки в корзине цен: apple / input, apple / output и hive-scripts.

c. / загрузить apple.q hive-script в папку // stockprice / hive-scripts

d. / загрузите входной файл csv, содержащий цены на акции AAPL, в папку // stockprice / apple / input

2. / Создайте рабочий процесс Elastic MapReduce:

Natigate к https://console.aws.amazon.com/elasticmapreduce/home

б. / выберите «Создать новый поток работ»

c. / настроить параметры задания:

d. / настроить экземпляры EC2:

д. / определить пару ключей EC2:

е. / если хотите, вы можете настроить отладку, указав путь к журналу S3 и выбрав «Включить отладку» (необязательно). Я настоятельно рекомендую сделать это, если вы находитесь на этапе разработки:

г. / не задавать загрузочных действий:

ч. / просмотреть конфигурацию, прежде чем нажать кнопку запуска:

я. / создать поток работ:

к. / вы можете проверить статус потока работ от ЗАПУСКА до РАБОТЫ до ВЫКЛЮЧЕНИЯ.

В случае возникновения каких-либо проблем вы можете проверить stderr, stdout, syslog из меню «Debug».

3. / Проверьте результат:

После нескольких минут обработки номера выходные данные будут сгенерированы в папке // stokcprice / apple / output (например, файл 000000). Файл будет иметь текстовый формат с указанием даты и цены акций (разделено SOH — начало заголовка — ascii 001), см.

1984 25.578625
1985 20.193676
1986 32.46103
1987 53.889683
1988 41.54008
1989 41.659763
1990 37.562687
1991 52.495533
1992 54.803387
1993 41.02672 ……

2010 259,84247
2011 364,00433
2012 496,32138

аппендикс

Код улья для обработки данных (apple.q) выглядит так:

CREATE EXTERNAL TABLE stockprice (
yyyymmdd STRING, open_price FLOAT, high_price FLOAT, low_price FLOAT, close_price FLOAT, stock_volume INT, adjclose_price FLOAT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘,’
LINES TERMINATED BY ‘\n’
LOCATION ‘s3://stockprice/apple/input/’;
CREATE TABLE tmp_stockprice (
year INT, close_price FLOAT
)
STORED AS SEQUENCEFILE;

INSERT OVERWRITE TABLE tmp_stockprice
SELECT YEAR(sp.yyyymmdd), sp.close_price
FROM stockprice sp;

CREATE TABLE avg_yearly_stockprice (
year INT, avg_price FLOAT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ‘\t’
LINES TERMINATED BY ‘\n’
STORED AS TEXTFILE;

INSERT OVERWRITE TABLE avg_yearly_stockprice
SELECT tmp_sp.year, avg(tmp_sp.close_price)
FROM tmp_stockprice tmp_sp
GROUP BY tmp_sp.year;

INSERT OVERWRITE DIRECTORY ‘s3://stockprice/apple/output/’
SELECT * from avg_yearly_stockprice;

В качестве альтернативы вы можете определить LOCATION для avg_yearly_stockprice аналогичным образом (внешняя таблица), как это делается для таблицы stockprice вместо INSERT OVERWRITE DIRECTORY.