前置きです。
IT界隈の人とHadoopの話をするとこういうギャップを感じます。
Hadoop使ってみたいところ >>> 実際に使っているところ
みんな
- どう使って、どう収益に結びつけるか
- 設計、サーバ購入、構築、運用などなどの技術的コスト
とか考え始めて止まっちゃいます。たぶん考えるよりTreasureData使ってみたほうが早いです。
そんなの使ってみないとよくわからんからです。
Hadoopガッツリ使ってました!なんて人そうそういないのです。
というわけで問答無用で構築して(そのあたりは前記事)、簡単な管理画面を作ってサービスチームに公開しています。
無料のトライアル版でもけっこう使えますし、気合入れればきっと数日で構築出来ます。
以下はその管理画面についてです。
ポイントはとにかく、『テキトウに作ってさっさと使ってみる』です。
(ちゃんとしたものはそのうちだれかが作ってくれるでしょう!)
管理画面の概要
まとめ
このぐらい作ればとりあえずの動作確認はできます。
サクッと作って、「どう使うか」はサービスチームの人に考えてもらいましょうw
↓は興味ある人だけ
構築手順
Rubyが一番早そうだったので、Sinatraで構築しました。
td-agentをインストールします。Ruby用のライブラリ、tdコマンドもついてきます。
# vi /etc/yum.repos.d/td.repo [treasuredata] name=TreasureData baseurl=http://packages.treasure-data.com/redhat/$basearch gpgcheck=0 # yum install td-agent
同梱のruby、gem、td使うためにPATH通しておきます。
# vi ~/.bash_profile ... PATH=/usr/lib64/fluent/ruby/bin/:$PATH ... ログインしなおし
sinatraとpassengerをインストール
# yum install httpd httpd-devel apr-devel apr-util-devel # gem install sinatra # gem install passenger # passenger-install-apache2-module Enterオラオラ→最後のほうに出てくるApacheコンフィグをメモ
テキトウに設定
# vi /etc/httpd/conf.d/passenger.conf
LoadModule passenger_module /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/passenger-3.0.13/ext/apache2/mod_passenger.so
PassengerRoot /usr/lib64/fluent/ruby/lib/ruby/gems/1.9.1/gems/passenger-3.0.13
PassengerRuby /usr/lib64/fluent/ruby/bin/ruby
RackBaseURI /sinatra
# vi /etc/httpd/conf.d/td.conf
<VirtualHost *:80>
ServerName td.mikeda.local
DocumentRoot /var/www/sinatra/public/
<Directory /var/www/sinatra/public/>
Order allow,deny
Allow from all
</Directory>
</VirtualHost>ソースコードは/var/www/sinatraの下に作っていきます
$ cd /var/www/sinatra/
$ tree
.
|-- app.rb
|-- cli_test.rb
|-- config.ru
|-- public
| |-- common.css
|-- tmp
| |-- always_restart.txt.bak
| `-- restart.txt.bak
`-- views
|-- index.erb
|-- job.erb
|-- jobs.erb
|-- layout.erb
|-- query.erb
`-- tables.erb一部を紹介
config.ru
app_dir = File.expand_path(File.dirname(__FILE__)) require app_dir + '/app' run Sinatra::Application
app.rb
require 'sinatra' require 'td' require 'td-client' apikey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" query_db = "access" # クエリ実行するDB。後で選択できるようにする cln = TreasureData::Client.new(apikey) def format_time(t) t ? t.getlocal.strftime("%Y/%m/%d %H:%M:%S") : "" end get '/' do @title = "Home" erb :index end # テーブルのリストを表示 get '/tables/' do @title = "Table" dbs = cln.databases @tables = [] dbs.each do |db| db.tables.each do |tbl| @tables << { :db_name => tbl.db_name, :table_name => tbl.table_name, :count => tbl.count, } end end erb :tables end # クエリ実行 get '/query/' do @title = "Query" erb :query end post '/query/' do query = params[:query] job = cln.query("access", query) redirect '/jobs/' end # Jobリスト表示 get '/jobs/' do @title = "Job List" jobs = cln.jobs @jobs = jobs.map { |job| start_at = job.start_at ? job.start_at : Time.now end_at = job.end_at ? job.end_at : Time.now exec_time = (end_at - start_at).to_i { :job_id => job.job_id, :status => job.status, :query => job.query, :start_at => format_time(start_at), :exec_time => exec_time, } } erb :jobs end # Jobのステータス、実行結果を表示 get '/job/:job_id' do |job_id| @title = "Job Status" job = cln.job job_id @job = { :job_id => job.job_id, :status => job.status, :start_at => format_time(job.start_at), :end_at => format_time(job.end_at), :query => job.query, :msg => job.debug["stderr"] } if job.status == "success" @result = cln.job_result job_id if @result && !@result.empty? @col_size = @result[0].length end end erb :job end
views/layout.erb
<html> <head> <link rel="stylesheet" href="/common.css" type="text/css"> <title>TD Admin</title> </head> <body> <h1><%= @title %></h1> <div class="navigation"> <ul> <li><a href="/">Home</a></li> <li><a href="/tables/">Table</a></li> <li><a href="/jobs/">Job</a></li> <li><a href="/query/">Query</a></li> </ul> </div> <br/> <%= yield %> </body> </html>
views/jobs.erb
<table border=4>
<tr>
<th>status</th> <th>start</th> <th>exec time</th> <th>query</th>
<% @jobs.each do |job| %>
<tr>
<td> <a href="/job/<%= job[:job_id] %>"><%= job[:status] %></a></td>
<td><%= job[:start_at] %></td>
<td><%= job[:exec_time] %></td>
<td><pre><%= job[:query] %></pre></td>
</tr>
<% end %>
</table>




