流沙河鎮

情報技術系のこと書きます。

q言語基礎_0_大規模データ分析エコシステム「kdb+」への招待

# 以下は2020年頃に執筆した過去ブログのアーカイブです。現在メンテしておらず、一部の情報が古い可能性があります

kdb+って何なのか

kdb+とは何か、この質問に回答するのは非常に難しい。杓子定規に答えるならば、「kx Systemsが開発/販売している、ビッグデータの蓄積、分析に特化したデータベースプロダクト」とでも言ったところか。しかしこれは非常に外面的かつ空を掻くような定義で、実務でkdb+と触れ合っている人々には何一つ響かないと思う。

Wikipediaは何と言っているだろう?

kdb+は、Kx Systemsにより開発および販売されているインメモリデータベース(IMDB)かつカラムベース・リレーショナル・タイムシリーズ・データベース(a column-based relational time series database (TSDB) )である。

kdb+ - Wikipedia
これもイマイチな定義で、誤解を招く表現を含んでいる。インメモリ的な振舞はkdb+エコシステムを構成する一側面に過ぎないし、kdb+は必ずしもリレーショナルではない。リレーショナルデータベースめいた作りにすることは可能だが、そうしなければならない技術的言語的な制約は何もない。
また、kdb+は必ずしも時系列ベースというわけでもない。確かにテーブルにtimestampカラムを定義するアーキテクチャが普通ではあるが、技術仕様上は必須ではない。
更に言うならば、「データベース」であるという表現にも違和感を覚える。後述するが、kdb+は「データベースみたいなもの」であって、データベースではない。少なくとも私はそう信じている。

それでは大本命、開発元のKx Systemsは何と言っているのだろう。恐るべきことに、kdb+とは何かを端的に定義する公式記事はアレコレ調べても見つけられなかったが、以下ページの記載がそれに近そうだ。

Kx is a suite of enterprise-level products and solutions centered around kdb+, the world’s fastest time-series database. Kdb+ is optimized for ingesting, analyzing, and storing massive amounts of structured data. The combination of the columnar design of kdb+ and its in-memory capabilities means it offers greater speed and efficiency than typical relational databases. Its native support for time-series operations vastly improves both the speed and performance of queries, aggregation and analysis of structured data.

kx.com
これは一抹の真理に触れていそうな感じがする。確かに、kdb+の最大の特徴はデータフローのハンドル、蓄積、分析までの全ての処理を独自のDSLであるq言語によって実装された一つのエコシステム上で扱うことが出来る点にある。
本当にthe world’s fastest time-series databaseであるかは何とも言い難い*1所だが、基本的にはインメモリでデータを扱うのと、vector指向の言語仕様を基にしてカラムベースでデータを扱うために動作が高速である、というのはある程度の説得力がある。
とは言え、kdb+に触れたことがない人からすれば、これもまた分かったような分からないような定義に聞こえるのではないか。

それでは筆者の考えるkdb+の定義とは何かと言えば、次のような感じだ。
自分だけのデータ分析プラットフォームが作れる工作キット。Kx Systemsが提供するq言語ランタイムを使って、好きなようにデータベースや分析エンジンを作ってみよう!

何よりも大事なことだが、Kx Systemsはデータベースソフトウェアを提供しているわけではない。単に大量データを扱うことに最適化された独自言語であるqのランタイムを提供するのみで、それを使って何を作るかは全て顧客に委ねられている。
導入に向けたコンサルテーションは当然にあるが、基本的にはどう使おうと自由だ。インメモリデータベースを作ってもいいし、静的データベースを作ってもいいし、分析プラットフォームでもいい。時系列ベースでもいいし、そうでなくてもいい。
仮に不具合が起きたとしても、開発元へ機械的に仕様の照会を投げるわけにもいかない。自分の手で実装を読み解き、問題を掘っていくしかない。
kdbの世界でテーブルと呼んでいるものも、単にネストしたDictionaryを変形させたものにすぎない。何か特別な、レコードを処理する結構な機能が存在するわけではない。欲しければ作るしかない。
先ほど「kdb+はデータベースではなく、データベースみたいなもの」だと言ったのはそういうことだ。
そうして作ったデータ処理ソフトウェア群を繋ぎ合わせたプラットフォーム/エコシステムがkdb+なのである。
以下に、非常に単純化した、一般的なkdbのデータフローを示す。

kdb+の導入事例

kdbがどういった組織で使われているのかと言えば、主に金融機関で使われている。らしい。というのも、筆者はKx Systemsとは何の関わりもない、仕事上の必要からkdbに触れる機会を持ったいちエンジニアに過ぎないので、マクロな視点での市場規模であるとか、導入実績については良く知らないというのが正直なところだ。
しかし皆さまお気付きの通り、少なくとも日本においてkdb+及びq言語はお世辞にも有名とは言えない、というか超がつくレベルのマイナー言語なので、非常にニッチな需要の上に成り立っていることだけは間違いない。どうやら海外の金融機関では広く利用されているようだが。。。
筆者が思いつくだけでも、マイナーな理由はいくつもある。
 - kdb+を導入しなければならない程の膨大かつ高速処理が要求されるデータを保持している組織があまりない
 - 活用するためにはエンジニアのみならずエンドユーザを含めたq言語への習熟が必要であり、ハードルが高い
 - OSSではなく、ベンダクローズドな製品である。また、ライセンスも決して安いとは言えない
 - kdb+を活用するためには相応のマシンリソースが必要であり、インフラ整備のハードルが高い
 - 実装言語であるqが異様に難解な黒魔術みたいな言語であり、しかも日本語資料がほぼ存在しないに等しいため、学習コストが非常に高い

こうした条件をクリアするのにぴったりな業界と言えば、正に金融業界、特に市場取引にかかわるシステムを扱っているような部門ということになる。
彼らには資金力があり、膨大なマーケットデータを保持し、分析し、リアルタイムに活用する需要があるためだ。
先日も、SMBCが次世代為替インフラとしてkdb+を採用することにしたらしい。
prtimes.jp

q言語の学習法

ここまで書いた通り、kdb+を扱うのは、q言語を読解し、操ることと同義であるため、もし少しでもkdb+に興味があるなら今すぐq言語の学習を始めるべきだ。
もっとも、ここまで読んで、よっしゃq言語勉強してみようと思う人がそうそういるとも考え難いが、ここで止めてはこれから連載を始める予定のq言語紹介企画が破綻してしまうので、このまま続ける。
qのランタイム自体は個人利用目的であれば無料でダウンロード可能なので、とりあえず触ってみるのは容易だ、
https://kx.com/connect-with-us/download/
しかし、q言語には日本語の学習資料が存在しない。というか、英語でも纏まった資料があまりない。
『q for mortals』と『q tips』の二冊がバイブル的な書籍であり、大概のq言語話者はこれらのどちらかないし、両方でq言語を学んだのではないかと思う。
上記二冊はKx Systemsが全文Web上で無料公開している。英語が得意で、技術書を読みなれている人であれば、これらに目を通すのが最も近道だろう。
www.amazon.com
www.amazon.com

が、これらの書きっぷりは平易とはいいがたく、読解にはそれなりにカロリーを要する。そもそも全文英語なので、普段あまり英語資料を読まない人にはそれだけで辛いものがあるだろう。
もっとも、筆者の観測範囲では、kdb+を扱うような人間は大体が英語が堪能か、そもそも英語圏の人間なので、日本語資料の需要自体ないのかもしれないが。
とはいえ筆者のように極めて貧弱な英語能力しか備えていないにも関わらず、kdbと付き合わなければならない人、新たにq言語を勉強したいという意欲に燃えている人*2もいることだろう。
そこで、筆者の知識の整理も兼ねて、q言語のエッセンスをこれから本ブログに纏めていくことにした。
基本的には『q for mortals』と『q tips』の章立てを下敷きにしつつ、実務上そこまで重要ではないと思われる知識は端折り、逆に有用なテクニックは適宜紹介することで、易しく実践的なq言語の紹介記事を書くことを目指す。
読者諸兄にあっては、筆者が失踪しないようブログ及びTwitterで熱いエールを送ってあげて欲しい。また、kdbを知っている人で、分かりづらい点や、誤っていると思われる点を発見した方がいれば、お気軽に指摘していただきたい。
仕事以外でkdbを知っている人物に出会ったことがないので、そのような人々との交流の足掛かりに出来ればとも願っている。

次回は環境セットアップからお約束のHelloWorldまでを記す。
q言語基礎_0.5_環境セットアップからHelloWorld!まで

*1:qが世界最速であることを示すエビデンスベンチマークの類を筆者は見たことがない。もし見かけた人がいたら是非教えて欲しい。

*2:そんな奴いるのか???