Вступление
Существует несколько вариантов обработки больших данных в облаке — от 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.