Cloudforce2012 Mini Hackに参加したよ (2)
前回の続きです。
2つ目のお題は "Treasure Data Mini Hack" です。
Treasure Data Mini Hack
ふむふむ。Treasure Dataネタですね。
※Force.comとは無関係ですが、頑張ってみましょう。
tdコマンドのインストール
Toolbeltが用意されているので、これも簡単ですね。
ちなみに、herokuもToolbeltを用意してますねー。インストールパッケージを用意してくれると、気軽に使えるようになっていいですね!ww
TweetデータをTreasure Dataにアップロード
さて、ココからが本番です。ローカルに保存したデータをアップロードしましょう!
Treasure Dataから提供されているドキュメントが非常に参考になりますので、併せて確認ください!
1. ログイン
ターミナルで
$ td account -f
と入力して、ユーザIDとパスワードを聞かれるので、そのまま入力してログインします。
2. データベース&テーブルの作成
Treasure Data内にデータベースと、その中にテーブルを作成します。
$ td db:create cfj2012
$ td table:create cfj2012 test
最初のコマンドで "cfj2012" というデータベースを作成します。
そして、"cfj2012"データベースの中に、"test"というテーブルを作成します。
3. Tweetデータのアップロード
$ td table:import cjf2012 test --json tweet.json
td table:import コマンドで「データベース」「テーブル」と、アップロードするローカルのファイルを指定して、インポートします。
・
・
・
というだけで良かったはずなのですが、
skipped: argument out of range: "{\"retweet_count\":\"0\",\"time\":\"1352901513\",\"user_screen_name\":\"philnash\",\"user_name\":\"Phil Nash\",\"created_at\":\"2012-11-14 08:58:32 -0500\",\"text\":\"@_dte Why not just use Heroku for Ruby stuff?\"}\n" uploading 8969 bytes... imported 89 entries from tweet.json.
と結果が返ってきました。。。。。
んー・・・何か激しくエラーが発生してるみたいで、OKかどうか悩ましいところです。。。
skipped: argument out of range
が、どうにも怪しいので、色々ググるとこんな感じのエラーみたいでした。
Time: argument out of range (ArgumentError)
時刻のデータをパースする際にエラーになってるみたいですが、一体何がッ・・・!?
で、結局、Treasure Dataのブースにいた方々の支援を得ました..w
どうやら、Tweet.json内の
"time":"1352901513"
が悪さをしているようでした。
Treasure Data側が「文字列」として指定されている"1352901513"を時刻型でパースしようとして"argument out of range"エラーが発生していたようです。
なんと・・・_| ̄|○
結局のところ
$ td table:import cfj2012 test --json tweet.json -t "created_at"
という感じに、timeの指定をオプションで付加することで、
importing tweet.json... uploading 808174 bytes... imported 9817 entries from tweet.json. done.
と無事にインポートできました!
※しかし、最初のインポートで、89件は取り込まれた模様ですが、この89件は何でしょうね??
カスタマーダッシュボードで確認すると、こんな感じでした。
↓
ジョブの実行
さて、データがインポートできましたので、クエリを発行してみましょう!
$ td query -d cfj2012 -w 'SELECT COUNT(*) FROM test'
とコマンドを実行してみると・・・?
Job 1319769 is queued. Use 'td job:show 1319769' to show the status. queued... started at 2012-12-20T13:06:32Z Hive history file=/tmp/1237/hive_job_log__276669154.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=<number> In order to limit the maximum number of reducers: set hive.exec.reducers.max=<number> In order to set a constant number of reducers: set mapred.reduce.tasks=<number> Starting Job = job_201209262127_180974, Tracking URL = http://ip-10-8-189-47.ec2.internal:50030/jobdetails.jsp?jobid=job_201209262127_180974 Kill Command = /usr/lib/hadoop/bin/hadoop job -Dmapred.job.tracker=10.8.189.47:8021 -kill job_201209262127_180974 2012-12-20 13:06:46,411 Stage-1 map = 0%, reduce = 0% 2012-12-20 13:06:55,512 Stage-1 map = 65%, reduce = 0% 2012-12-20 13:06:58,541 Stage-1 map = 80%, reduce = 0% 2012-12-20 13:07:01,570 Stage-1 map = 92%, reduce = 0% 2012-12-20 13:07:04,604 Stage-1 map = 100%, reduce = 0% finished at 2012-12-20T13:07:15Z 2012-12-20 13:07:12,684 Stage-1 map = 100%, reduce = 100% Ended Job = job_201209262127_180974 OK MapReduce time taken: 36.445 seconds Time taken: 36.621 seconds Status : success Result : +-------+ | _c0 | +-------+ | 19724 | +-------+ 1 row in set
・・・という結果になりました。
※インポートコマンドを何回か実行してるので、データ件数は実際とは異なるかと思います。
おしまい
今回、初めてTreasure Dataに触れる機会がありました。
こうして見ると、課題自体は非常にシンプルなのですが、実際に手を動かしてやってみて、クエリの結果が返ってくるとなかなか楽しいものですね!
また、まずはちょっと触ってもらう、知ってもらう・・ために、こうした"Mini Hack"をやるのは非常に良かったと思います。
"Force.com"と"Treausre Data"を組み合わせると、何か面白いソリューションとかできそうな予感もします。
例えば、Salesforce側で蓄積された過去の実績データ(売上とか?)の退避先として"Treasure Data"を選ぶ・・というのも、面白いかもしれません。(会社のルール等の制約で難しいかもしれませんが・・・)
また、中の人から聞いた話では、Talend Open StudioなどのETLツールと組み合わせることも可能(参考)ということなので、一度試してみる価値はありそうですッ・・・!
さて、この雑記はAdvent Calendar 21日目にエントリしています。
もう残すところわずかになりましたねー。最後まで頑張りましょう!
ではでは〜