HerokuからTreasure Dataに標準出力でデータインポートできるようになって多幸感がすごい
@fumito_ito 実は本日からですが、Heroku上のアプリに限り、stdoutからTDにデータを送れるようになりました。一度addonをremove -> addして頂くと使える様になります。 > bit.ly/U2sSWn
— Kazuki Ohtaさん (@kzk_mover) 1月 17, 2013
というわけで、実際に試してみました。
公式のページはこちら
How to ?
公式のページにある通り、Treasure Data Hadoopとheroku-td
CLIプラグインをインストールした後に以下の形式で標準出力すると指定したDBのテーブルにデータが挿入されます。
@[database.table] JSON-In-ONE-LINE
データの挿入は5分毎に行われるようです。
Node.jsでやってみた
やってみました。
- ひな形を作る。
$ express td-sample $ cd td-sample $ npm install
git init
からのアプリ作成&アドオン登録
$ git init $ git add . $ git commit -m "initail commit" $ heroku create $ heroku addons:add treasure-data:nano $ heroku plugins:install https://github.com/treasure-data/heroku-td.git
heroku td
でtdコマンドが使えるか確認
$ heroku td (show usage)
- NodeでRequest Headerを標準出力するように変更
// app.js // ...略 var tdLogger = function() { return function(req, res, next) { var end = res.end; res.end = function (chunk, encoding) { res.end = end; res.end(chunk, encoding); var line = { headers: req.headers }; var td = '@[' + process.env.TD_DATABASE + '.' + process.env.TD_TABLE + '] '; process.stdout.stream(td + JSON.stringify(line)); }; next(); }; }; // app.configure の一部を変更 app.configure(function(){ app.set('port', process.env.PORT || 3000); app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(express.favicon()); // app.use(express.logger()); app.use(tdLogger()); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); app.use(express.static(path.join(__dirname, 'public'))); }); // ...略
package.json
とProcfile
を適当に作る
# package.json { "name": "application-name", "version": "0.0.1", "private": true, "scripts": { "start": "node app" }, "engines": { "node": "0.8.x", "npm": "1.1.x" }, "dependencies": { "express": "3.0.5", "jade": "*" } }
# Procfile web: node app.js
- Herokuの設定を追加
$ heroku config:add TD_DATABASE=heroku $ heroku config:add TD_TABLE=headers
- commit & push
$ git commit -am "change for td-log test" $ git push heroku master $ heroku open
しばらくして以下のコマンドを実行するとTableのカウントが増えて、データが挿入されていることがわかります。
$ heroku td tables
これらのデータはもちろんHiveでぶん回すことができます。
素敵ですね :)