46
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

小さなデータ基盤 Nayco をリリースしました

Last updated at Posted at 2020-08-17

Nayco とは?

Naycoは主にオンプレミスのデータ収集・蓄積・可視化環境を素早く立ち上げるための、オールインワンの小さなデータ基盤です。
nayco
tac0x2a/nayco

#アイコンはパワポで頑張って描きました

主な特徴

  • Dockerコンテナ群で構成され、docker-compose コマンド一発で起動
  • 列指向DWH(ClickHouse)による、高速な集計とデータ圧縮による高いストレージ効率
  • 入力データを元にスキーマを推定し、自動でDWHにテーブルを作成。データに合わせてテーブルを作成する必要はありません。
  • 構成するソフトウェアは全てOSS

docker-compose コマンドで立ち上げたあとは、共有フォルダにファイルを置いたりMQTTでデータを送信するだけで、DWHへ自動でデータが蓄積され、Metabaseや一般的なツールによってデータを利用することができます。

Nayco の概要

overview

Naycoは、データの入力、変換、蓄積、可視化のためのソフトウェア群によって構成されています。
基本の入力はMQTTで、JSON, JSONL, またはヘッダ付きCSV形式のデータを受け付けます。ヘッダなしのCSVフォーマットはサポートされません。
ファイルによる入力も可能で、所定のフォルダに上記形式のファイルを置くか追記することで、同様にデータを入力できます。

入力されたデータは内部のブローカーを経由し、DWHへ保存されます。このとき、データから推定された型を元に、自動的にテーブルが作成されます。

DWHへ格納されたデータは、Naycoが内蔵する可視化サービスを用いて分析やダッシュボードを作ったり、外部のSQLクライアントから直接データを利用することができます。

その他、コンテナの管理ツールや、DWHのテーブルを管理するツールが含まれています。

詳細については Usage.ja.md を参照してください。

なぜ Nayco を作ったのか?

いわゆるデータ基盤は、クラウドのオブジェクトストレージや分散処理基盤のマネージドサービスなどを組み合わせて構築するのが一般的ですが、インターネットとの接続が困難な環境でデータ収集/分析をスモールスタートしたい、という人たちが案外います。(私もそう)

このようなケースにおいて、私の経験では小規模なツールやRDBを組み合わせたシステムを、個別のエンジニアリングで構築&スタートすることが多いのですが、収集データの項目を追加するたびにテーブルのメンテナンスが必要になったり、非力なハードウェアでは十分な性能が出ないなど、色々と苦労が多かったです。

そこで、データ項目が多少変化してもエンジニアリングレスでいい感じにデータを貯め続けてくれる仕組みと、オンプレのマシンでも性能が期待できるClickHouseを使ったデータ基盤を爆速で構築できる環境がほしい!という思いで、この Nayco を作りました。


とりあえず動かしてみる

1. 起動

$ docker -v
Docker version 19.03.12

$ docker-compose -v
docker-compose version 1.26.2
$ git clone https://github.com/tac0x2a/nayco.git
$ cd nayco
$ docker-compose up -d

上記でNaycoが起動します。各コンテナの状態は Portainer(http://<NAYCO_HOST>:19000 )にアクセスして確認することができます。

なお、<NAYCO_HOST> は Naycoが実行されているホストまたはIPアドレスに読み替えてください。

2. サンプルデータの入力

ここでは、MQTTでJSONを送信してデータを入力してみます。

以下のデータをMQTTでNaycoへ送信します。

  • Topic: hello/nayco
  • Payload: {"title": "The Perfect Insider", "pub_date": "1996/4/5", "lang": "ja"}
  • Host: <NAYCO_HOST>
  • Port: 1883
Pythonの例
import paho.mqtt.publish as pub

topic = "hello/nayco"
payload = '{"title": "The Perfect Insider", "pub_date": "1996/4/5", "lang": "ja"}'
hostname = "<NAYCO_HOST>"
port = 1883

pub.single(topic=topic, payload=payload, hostname=hostname, port=1883)

3. データの確認

送信が完了したら、以下のデータ管理サービスでテーブルが作成されたことを確認します。

  • Uminoco: http://<NAYCO_HOST>:5000/table/hello_nayco_001

データとtopic名を元にテーブルが自動作成されていることを確認できます。
テーブル名はtopic名を元に生成されますが、RENAME TABLE ボタンから変更することができます。
今はデータが10件だけなので圧縮率が悪く見えますが、データが増えるにつれて、ClickHouseによるデータ圧縮が効果を発揮します。

4. データの可視化

蓄積したデータを可視化するサービスとして、NaycoにはMetabase が含まれています。

  • Metabase: http://<NAYCO_HOST>:3000

Metabaseを利用するためには、初回アクセス時に、DWH(ClickHouse)のDBをデータソースとして登録する必要があります。

  • Database type ClickHouse,
  • Database Name: 任意
  • Host: clickhouse
  • Port: 8123
  • Database user name: default
  • Database password: <空>

上記をSaveして、Naycoに蓄積されたデータをMetabseで可視化する準備が整いました。(Metabaseのクロールが実行されるまでの間、実際のテーブルがMetabase上に表示されない場合があります)
試しに、簡単な可視化をしてみましょう。Metabase上で hello_nayco_001 テーブルが見えるようになったので、以下のようなチャート(Question)を作成します。
Metabaseの使い方については、Metabaseのドキュメントを参照してください。

横軸を公開日、縦軸を件数とするバーチャートです。今は1件しかデータが登録されていないので、シンプルな見た目です。

以下のようなスクリプトを実行し、データを追加してみます。

Pythonの例
import paho.mqtt.publish as pub

topic = "hello/nayco"
payload = """
{ "title": "Doctors in Isolated Room", "pub_date": "1996/7/5", "lang": "ja" }
{ "title": "Mathematical Goodbye",     "pub_date": "1996/9/5", "lang": "ja" }
{ "title": "Jack the Poetical Private","pub_date": "1997/1/5", "lang": "ja" }
{ "title": "Who Inside",               "pub_date": "1997/4/5", "lang": "ja" }
{ "title": "Illusion Acts Like Magic", "pub_date": "1997/10/5","lang": "ja" }
{ "title": "Replaceable Summer",       "pub_date": "1998/1/7", "lang": "ja" }
{ "title": "Switch Back",              "pub_date": "1998/4/5", "lang": "ja" }
{ "title": "Numerical Models",         "pub_date": "1998/7/5", "lang": "ja" }
{ "title": "The Perfect Outsider",     "pub_date": "1998/10/5","lang": "ja" }
"""
hostname = "<NAYCO_HOST>"
port = 1883

pub.single(topic=topic, payload=payload, hostname=hostname, port=1883)

その後、Metabaseのページをリロードすると追加されたデータが表示されます。

このように、MQTTでデータを送信するだけで、簡単に可視化が可能です。その他、任意のSQLクライアントでDWHを直接クエリしたり、ファイルとしてエクスポートすることが可能です。

その他詳細については Usage.ja.md を御覧ください。

今後

  • (特に)DWHのDB名や認証認可がガバガバなので、もう少しまともにしたい
  • データマートを構成するためのETLっぽい仕組みの導入。
    Node-Redでそれっぽいことも頑張れ無くないが、Embulkをブラウザからキックするようなサービスを入れたい。

最後に

ClickHouseはいいぞ!

46
36
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
46
36

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?