Статьи

Большие данные на Heroku — Hadoop данных сокровищ

Вступление 

         

Существует несколько вариантов обработки больших данных в облаке — от Amazon Elastic MapReduce до IBM SmartCloud Enterprise, до Heroku, и это лишь некоторые из них. На этот раз я буду обсуждать способность Heroku в качестве платформы для больших данных. Вы увидите, как решение Treasure Data Hadoop работает на Heroku и как вы можете управлять и анализировать данные с помощью стандартных HiveQL-подобных запросов.

Heroku — облачная платформа как услуга (PaaS), принадлежащая Salesforce.com. Первоначально он начинался с поддержки Ruby в качестве основного языка программирования, но он также был распространен на Java, Scala, Node.js, Python и Clojure. Он также поддерживает длинный список дополнений,  включая возможности NoSQL и хранилище данных на основе Hadoop, разработанное Treasure Data.

Архитектура Hadoop данных сокровищ

Архитектура решения Treasure Data Hadoop выглядит следующим образом:

Heroku Toolbelt

Heroku toolbelt — это инструмент командной строки, который состоит из пакетов Heroku, foreman и git. Как описано на веб-сайте инструментов Heroku , это «все, что вам нужно для начала работы с Heroku». (Heroku CLI основан на ruby, поэтому вам также нужен рубин под капотом). После того, как вы зарегистрировались в Heroku (вам нужно подтвержденный аккаунт, т. е. вы указали свои банковские реквизиты для покрытия возможных расходов на обслуживание) и установили инструментальный пояс Heroku, и вы можете начать прямо сейчас.

В зависимости от вашей среды (я использую Ubuntu 12.04 LTS), вы можете использовать альтернативные методы установки, такие как:

$ sudo apt-get install git
$ gem install heroku
$ gem install foreman

Heroku и дополнение Treasure Data

Если вы хотите использовать Treasure Data на Heroku, вам нужно добавить дополнение Treasure Data Hadoop. Вам необходимо войти в систему, создать приложение (Heroku сгенерирует причудливое имя, например, «boiling-tundra»), а затем вам нужно добавить свое конкретное дополнение к только что созданному приложению:

$ heroku login
Enter your Heroku credentials.
Email: [email protected]
Password (typing will be hidden): 
Found existing public key: /home/istvan/.ssh/id_dsa.pub
Uploading SSH public key /home/istvan/.ssh/id_dsa.pub... done
Authentication successful.

$ heroku create
Creating boiling-tundra-1234... done, stack is cedar
http://boiling-tundra-1234.herokuapp.com/ | [email protected]:boiling-tundra-1234.git

$ heroku addons:add treasure-data:nano --app boiling-tundra-1234
Adding treasure-data:nano on boiling-tundra-1234... done, v2 (free)
Use `heroku addons:docs treasure-data:nano` to view documentation.

Мне просто нравится схема окраски и графика, используемая в консоли Heroku — она ​​просто великолепна.

Инструментальный инструмент Treasure Data

Для управления Treaure Data Hadoop на Heroku вам необходимо установить инструментальный пояс Treasure Data — он очень хорошо подходит для интерфейса Heroku CLI и также основан на ruby:

$ gem install td

Затем вам нужно установить плагин Heroku для поддержки команд Heroku:

$ heroku plugins:install https://github.com/treasure-data/heroku-td.git
Installing heroku-td... done

Чтобы убедиться, что все в порядке, просто запустите:

$ heroku plugins
=== Installed Plugins
heroku-td

 И:

$ heroku td
usage: heroku td [options] COMMAND [args]

options:
  -c, --config PATH                path to config file (~/.td/td.conf)
  -k, --apikey KEY                 use this API key instead of reading the config file
  -v, --verbose                    verbose mode
  -h, --help                       show help
...

Hadoop данных сокровищ — команды td

Теперь мы готовы выполнить команды td от Heroku. Команды td используются для создания базы данных и таблиц, импорта данных, выполнения запросов, удаления таблиц и т. д. Под капотом команды td в основном представляют собой запросы HiveQL. (Согласно их веб-сайту, Treasure Data планирует и в будущем поддерживать Pig.)

По умолчанию td-агент Treasure Data предпочитает данные в формате json, хотя они могут обрабатывать различные другие форматы (журнал apache, системный журнал и т. Д.), И вы можете написать собственный анализатор для обработки загруженных данных.

Таким образом, я преобразовал свои данные о запасах AAPL (опять же, благодаря http://finance.yahoo.com) в формат json:

{"time":"2012-08-20", "open":"650.01", "high":"665.15", "low":"649.90", "close":"665.15", "volume":"21876300", "adjclose":"665.15"}
{"time":"2012-08-17", "open":"640.00", "high":"648.19", "low":"638.81", "close":"648.11", "volume":"15812900", "adjclose":"648.11"}
{"time":"2012-08-16", "open":"631.21", "high":"636.76", "low":"630.50", "close":"636.34", "volume":"9090500", "adjclose":"634.64"}
{"time":"2012-08-15", "open":"631.30", "high":"634.00", "low":"625.75", "close":"630.83", "volume":"9190800", "adjclose":"630.83"}
{"time":"2012-08-14", "open":"631.87", "high":"638.61", "low":"630.21", "close":"631.69", "volume":"12148900", "adjclose":"631.69"}
{"time":"2012-08-13", "open":"623.39", "high":"630.00", "low":"623.25", "close":"630.00", "volume":"9958300", "adjclose":"630.00"}
{"time":"2012-08-10", "open":"618.71", "high":"621.76", "low":"618.70", "close":"621.70", "volume":"6962100", "adjclose":"621.70"}
{"time":"2012-08-09", "open":"617.85", "high":"621.73", "low":"617.80", "close":"620.73", "volume":"7915800", "adjclose":"620.73"}
{"time":"2012-08-08", "open":"619.39", "high":"623.88", "low":"617.10", "close":"619.86", "volume":"8739500", "adjclose":"617.21"}
{"time":"2012-08-07", "open":"622.77", "high":"625.00", "low":"618.04", "close":"620.91", "volume":"10373100", "adjclose":"618.26"}

Первым шагом является создание базы данных с именем aapl:

$ heroku td db:create aapl --app boiling-tundra-1234
 !    DEPRECATED: Heroku::Client#deprecate is deprecated, please use the heroku-api gem.
 !    DEPRECATED: More information available at https://github.com/heroku/heroku.rb
 !    DEPRECATED: Deprecated method called from /usr/local/heroku/lib/heroku/client.rb:129.
Database 'aapl' is created.

Затем создайте таблицу с именем marketdata:

$ heroku td table:create aapl marketdata --app boiling-tundra-1234
 !    DEPRECATED: Heroku::Client#deprecate is deprecated, please use the heroku-api gem.
 !    DEPRECATED: More information available at https://github.com/heroku/heroku.rb
 !    DEPRECATED: Deprecated method called from /usr/local/heroku/lib/heroku/client.rb:129.
Table 'aapl.marketdata' is created.

Проверьте, были ли таблицы созданы успешно:

$ heroku td tables --app boiling-tundra-1234
! DEPRECATED: Heroku::Client#deprecate is deprecated, please use the heroku-api gem.
! DEPRECATED: More information available at https://github.com/heroku/heroku.rb
! DEPRECATED: Deprecated method called from /usr/local/heroku/lib/heroku/client.rb:129.
+----------+------------+------+-------+--------+
| Database | Table | Type | Count | Schema |
+----------+------------+------+-------+--------+
| aapl | marketdata | log | 0 | |
+----------+------------+------+-------+--------+
1 row in set

Импорт данных:

$ heroku td table:import aapl marketdata --format json --time-key time aapl.json --app boiling-tundra-1234
 !    DEPRECATED: Heroku::Client#deprecate is deprecated, please use the heroku-api gem.
 !    DEPRECATED: More information available at https://github.com/heroku/heroku.rb
 !    DEPRECATED: Deprecated method called from /home/istvan/.rvm/gems/ruby-1.9.2-p320/gems/heroku-2.30.3/lib/heroku/client.rb:129.
importing aapl.json...
  uploading 364 bytes...
  imported 10 entries from aapl.json.
done.

Проверьте, был ли импорт данных успешным — вы должны увидеть  столбец  count, показывающий количество строк, загруженных в таблицу:

$ heroku td tables --app boiling-tundra-1234
 !    DEPRECATED: Heroku::Client#deprecate is deprecated, please use the heroku-api gem.
 !    DEPRECATED: More information available at https://github.com/heroku/heroku.rb
 !    DEPRECATED: Deprecated method called from /home/istvan/.rvm/gems/ruby-1.9.2-p320/gems/heroku-2.30.3/lib/heroku/client.rb:129.
+----------+------------+------+-------+--------+
| Database | Table      | Type | Count | Schema |
+----------+------------+------+-------+--------+
| aapl     | marketdata | log  | 10    |        |
+----------+------------+------+-------+--------+
1 row in set

Теперь мы готовы запустить HiveQL (запрос td) для набора данных — этот конкретный запрос перечисляет самые высокие цены на акции AAPL сверху и показывает цены в порядке возрастания. (Значение времени основано на эпохе UNIX):

$ heroku td query -d aapl -w "SELECT v['time'] as time, v['high'] as high, v['low'] as low FROM marketdata ORDER BY high DESC" --app boiling-tundra-1234
 !    DEPRECATED: Heroku::Client#deprecate is deprecated, please use the heroku-api gem.
 !    DEPRECATED: More information available at https://github.com/heroku/heroku.rb
 !    DEPRECATED: Deprecated method called from /home/istvan/.rvm/gems/ruby-1.9.2-p320/gems/heroku-2.30.3/lib/heroku/client.rb:129.
Job 757853 is queued.
Use 'heroku td job:show 757853' to show the status.
queued...
  started at 2012-08-21T21:06:54Z
  Hive history file=/mnt/hive/tmp/617/hive_job_log_617_201208212106_269570447.txt
  Total MapReduce jobs = 1
  Launching Job 1 out of 1
  Number of reduce tasks determined at compile time: 1
  In order to change the average load for a reducer (in bytes):
    set hive.exec.reducers.bytes.per.reducer=
  In order to limit the maximum number of reducers:
    set hive.exec.reducers.max=
  In order to set a constant number of reducers:
    set mapred.reduce.tasks=
  Starting Job = job_201207250829_556135, Tracking URL = http://domU-12-31-39-0A-56-11.compute-1.internal:50030/jobdetails.jsp?jobid=job_201207250829_556135
  Kill Command = /usr/lib/hadoop/bin/hadoop job  -Dmapred.job.tracker=10.211.85.219:8021 -kill job_201207250829_556135
  2012-08-21 21:07:21,455 Stage-1 map = 0%,  reduce = 0%
  2012-08-21 21:07:28,480 Stage-1 map = 100%,  reduce = 0%
  2012-08-21 21:07:37,965 Stage-1 map = 100%,  reduce = 100%
  Ended Job = job_201207250829_556135
  OK
  MapReduce time taken: 42.536 seconds
  finished at 2012-08-21T21:07:53Z
  Time taken: 53.781 seconds
Status     : success
Result     :
+------------+--------+--------+
| time        | high   | low   |
+------------+--------+--------+
| 1345417200 | 665.15 | 649.90 |
| 1345158000 | 648.19 | 638.81 |
| 1344898800 | 638.61 | 630.21 |
| 1345071600 | 636.76 | 630.50 |
| 1344985200 | 634.00 | 625.75 |
| 1344812400 | 630.00 | 623.25 |
| 1344294000 | 625.00 | 618.04 |
| 1344380400 | 623.88 | 617.10 |
| 1344553200 | 621.76 | 618.70 |
| 1344466800 | 621.73 | 617.80 |
+------------+--------+--------+
10 rows in set

 Наконец, вы можете удалить таблицу marketdata:

$ heroku td table:delete aapl marketdata --app boiling-tundra-1234
 !    DEPRECATED: Heroku::Client#deprecate is deprecated, please use the heroku-api gem.
 !    DEPRECATED: More information available at https://github.com/heroku/heroku.rb
 !    DEPRECATED: Deprecated method called from /home/istvan/.rvm/gems/ruby-1.9.2-p320/gems/heroku-2.30.3/lib/heroku/client.rb:129.
Do you really delete 'marketdata' in 'aapl'? [y/N]: y
Table 'aapl.marketdata' is deleted.

Более подробную информацию о том, как использовать Treasure Data Hadoop, можно найти по адресу  http://docs.treasure-data.com/articles/quickstart.