HeatHashを作ったわけ

一段落ついたので、HeatHashに関する色々を説明していきたいと思う。

HeatHashが中でどんなことをやっているかを説明する前に、なぜ作ったのかということと、設定した目標について説明したいと思う。

HeatHashを作ろうと思った最初のきっかけは、会社のプロジェクトのパフォーマンス問題だった。空間情報の検索のパフォーマンスが非常に悪かったわけだ。空間DB機能のない普通のRDBMSを使っているのもその原因だし、適切な空間インデックスになっていないのも問題だ。しかし、根本的にスケールアウトできないためにおのずから一台のマシンの性能に制約されてしまう。

では、スケールアウトできるDBとしてKVSがはやっているが、KeyとValueの単純な構造の中に、空間情報をどうやって格納して検索しようかと考え始めた。そこで考えたのが、一次元空間インデックスだ。単純に考えるとある範囲の点を検索する場合、XとY方向の二つの要素の大小関係を比較する必要がある。それを、一つのインデックスにXYの二つの情報を格納することで、一つの値の大小比較だけで検索が可能となる。KVSは複雑な検索はできないが、一つの値の範囲検索は非常に高速だし、スケールアウト可能だ。こいつは面白そうだ!実装してみようと思った。後から考えると、空間二分木の構造をちょっと違う表現で作ったということになるが、既存のKVSに乗っかれることは色々と楽でよい。

また、そのころTwitterのStreamingAPIとジオタグを調べたこともあり、これを組み合わせてなにか面白いことができないかと思い、できたのが、Tweetの空間分布をKVSに格納し、ヒートマップで表示するHeatHashだったというわけだ。


では、HeatHashを作るにあたって目標としたことは何か。

一つ目は、1から自分一人で作ること。とにかくインフラの整備からOSからミドルウェアから何から何まで自分でインストールして構築した。サーバーマシンは古いPentiumDのデスクトップマシンだし、OSはCentOSをOpenVZで仮想化した上でHeatHashシステムを動かしている。チューニングも全部自分で勉強しながらやった。

二つ目は、人に見せられるレベルの物にするということ。これまで、多くのプログラムを趣味で書いてきたが、公開できる完成度の物はほとんどない。だから、自分で納得して公開できるレベルの物を作ると決めた。

三つ目は、パフォーマンス。とにかく、自分が考え得る限り軽く速く動くこと。そして、一台の非力なサーバーでもそこそこ動くこと。これは、サーバーが非力なPentiumDのさらに仮想マシンでスタートすると決めたのも理由だが、パフォーマンス問題で会社で痛い目を見たので、切実な目標とした。

四つ目は、スケールアウト可能な構成にすること。そのためにHornetQによるメッセージングシステムで、Tweetのクロール部分とTokyoCabinetに格納する部分を分離している。また、Tokyo CabinetをTokyo Tyrantに変えたり、その他の分散KVSにすることで、データストレージ部分も別サーバーへの分離やスケールアウトができると考えている。

五つ目は、大規模な空間情報を上記のように今後を見据えた基盤の上で扱うノウハウを得ること。

六つ目は、プロジェクトを進める意志と計画を持って行うこと。また、これまであまりできていなかったロギングやメンテナンス性の高いコード、運用のことなど、を常に考え、実行すること。

以上六点をこのプロジェクトの主な目標としてやってきた。

一段落ついた今、振り返ってみると100点満点ではないが自分の満足のいく結果になったと思う。
しかし、まだ終わりではない。せっかくここまでできたのだから、まだ実装していないいくつかの仕組みを実装しようと思っている。