著者はhttps://www.brightfunds.org/funds/foss-nonprofits [無料およびオープンソース基金]を選択して、https://do.co/w4do-cta [Donationsのために書く]の一部として寄付を受け取りましたプログラム。
前書き
https://clickhouse.yandex [ClickHouse]は、https://en.wikipedia.org/wiki/Online_analytical_processing [OLAP]向けにhttps://yandex.com [Yandex]によって作成された、オープンソースの列指向の分析データベースです。ビッグデータのユースケース。 ClickHouseのリアルタイムクエリ処理のサポートにより、1秒未満の分析結果を必要とするアプリケーションに適しています。 ClickHouseのクエリ言語はSQLの方言であり、強力な宣言型クエリ機能を可能にすると同時に、エンドユーザーに親しみやすさと小さな学習曲線を提供します。
_Column-oriented_データベースは、行ではなく列でグループ化されたブロックにレコードを保存します。 クエリにない列のデータを読み込まないことにより、列指向データベースはクエリの完了中にデータを読み取る時間を短縮します。 その結果、これらのデータベースは、OLAPなどの特定のワークロードに対して、従来の行ベースのシステムよりもはるかに高速に結果を計算して返すことができます。
オンライン分析処理(OLAP)システムでは、大量のデータを整理し、複雑なクエリを実行できます。 ペタバイトのデータを管理し、クエリ結果を迅速に返すことができます。 このように、OLAPはデータサイエンスやビジネス分析などの分野での作業に役立ちます。
このチュートリアルでは、ClickHouseデータベースサーバーとクライアントをマシンにインストールします。 通常のタスクにDBMSを使用し、オプションで別のサーバーからリモートアクセスを有効にして、別のマシンからデータベースに接続できるようにします。 次に、サンプルのWebサイト訪問データをモデリングおよびクエリして、ClickHouseをテストします。
前提条件
-
`+ sudo +`を備えた1台のDebian 9サーバーは、非rootユーザーとファイアウォールのセットアップを有効にしました。 サーバーの初期セットアップhttps://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-9[tutorial]に従ってユーザーを作成し、ファイアウォールをセットアップできます。
-
(オプション) `+ sudo +`が有効な非Debianユーザーとファイアウォールのセットアップを備えたセカンダリDebian 9サーバー。 初期サーバー設定https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-9[tutorial]に従うことができます。
ステップ1-ClickHouseのインストール
このセクションでは、 `+ apt-get +`を使用してClickHouseサーバーとクライアントプログラムをインストールします。
最初に、次を実行してサーバーにSSH接続します。
ssh @
`+ dirmngr +`は、証明書とキーを管理するためのサーバーです。 リモートリポジトリキーの追加と検証に必要です。次を実行してインストールします。
sudo apt-get install -y dirmngr
Yandexは、ClickHouseの最新バージョンを含むAPTリポジトリを管理しています。 検証済みのClickHouseパッケージを安全にダウンロードできるように、リポジトリのGPGキーを追加します。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv E0C56BD4
次のような出力が表示されます。
Output
Executing: /tmp/apt-key-gpghome.JkkcKnBAFY/gpg.1.sh --keyserver keyserver.ubuntu.com --recv E0C56BD4
gpg: key C8F1E19FE0C56BD4: public key "ClickHouse Repository Key <[email protected]>" imported
gpg: Total number processed: 1
gpg: imported: 1
出力は、キーが正常に検証および追加されたことを確認します。
次を実行して、APTリポジトリリストにリポジトリを追加します。
echo "deb http://repo.yandex.ru/clickhouse/deb/stable/ main/" | sudo tee /etc/apt/sources.list.d/clickhouse.list
ここでは、 `+ echo `の出力を ` sudo tee +`にパイプ処理して、この出力がルート所有ファイルに出力できるようにしました。
次に、 `+ apt-get update`を実行してパッケージを更新します。
sudo apt-get update
+ clickhouse-server`および
+ clickhouse-client`パッケージがインストールできるようになります。 以下を使用してインストールします。
sudo apt-get install -y clickhouse-server clickhouse-client
ClickHouseサーバーとクライアントを正常にインストールしました。 これで、データベースサービスを開始し、それが正しく実行されていることを確認する準備ができました。
ステップ2-サービスの開始
前のセクションでインストールした + clickhouse-server +`パッケージは、データベースサーバーの起動、停止、再起動などのアクションを実行する `+ systemd +`サービスを作成します。 https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files [
+ systemd +`]は、Linuxがサービスを初期化および管理するためのinitシステムです。 このセクションでは、サービスを開始し、正常に実行されていることを確認します。
次を実行して、 `+ clickhouse-server +`サービスを開始します。
sudo service clickhouse-server start
前のコマンドは出力を表示しません。 サービスが正常に実行されていることを確認するには、次を実行します。
sudo service clickhouse-server status
次のような出力が表示されます。
Output
● - ClickHouse Server (analytic DBMS for big data)
Loaded: loaded (/etc/systemd/system/clickhouse-server.service; enabled; vendor preset: enabled)
Active: since Sat 2018-12-22 07:23:20 UTC; 1h 9min ago
Main PID: 27101 (ClickHouse-serv)
Tasks: 34 (limit: 1152)
CGroup: /system.slice/ClickHouse-server.service
└─27101 /usr/bin/ClickHouse-server --config=/etc/ClickHouse-server/config.xml
出力は、サーバーが実行中であることを示しています。
ClickHouseサーバーを正常に起動し、 + clickhouse-client +
CLIプログラムを使用してサーバーに接続できるようになります。
ステップ3-データベースとテーブルの作成
ClickHouseでは、対話型データベースプロンプトでSQLステートメントを直接実行することにより、データベースを作成および削除できます。 ステートメントは、特定の構文に従うコマンドで構成され、必要なデータとともに要求された操作を実行するようデータベースサーバーに指示します。 データベースを作成するには、「+ CREATE DATABASE +」構文を使用します。 データベースを作成するには、まず次のコマンドを実行してクライアントセッションを開始します。
clickhouse-client
このコマンドは、ClickHouse SQLステートメントを実行して次のようなアクションを実行できるクライアントプロンプトにログインします。
-
データベース、テーブル、インデックス、パーティション、ビューの作成、更新、削除。
-
クエリを実行して、さまざまな条件を使用してオプションでフィルター処理およびグループ化されたデータを取得します。
このステップでは、ClickHouseクライアントでデータを挿入する準備ができたら、データベースとテーブルを作成します。 このチュートリアルでは、「」という名前のデータベースを作成し、その中に「」という名前のテーブルを作成して、ウェブサイトへのアクセス時間を追跡します。
ClickHouseコマンドプロンプト内にいるので、次を実行して `++`データベースを作成します。
CREATE DATABASE ;
データベースが作成されたことを示す次の出力が表示されます。
Output
CREATE DATABASE
Ok.
0 rows in set. Elapsed: 0.003 sec.
ClickHouseテーブルは、他のリレーショナルデータベースのテーブルに似ています。構造化された形式で関連データのコレクションを保持します。 タイプとともに列を指定し、データの行を追加し、テーブルに対してさまざまな種類のクエリを実行できます。
ClickHouseでテーブルを作成するための構文は、次の構造例に従います。
CREATE TABLE
(
,
,
...
) ENGINE =
`+ table_name `と ` column_name +`の値は、任意の有効なASCII識別子にすることができます。 ClickHouseは、幅広い列タイプをサポートしています。最も人気のあるものは次のとおりです。
-
+ UInt64 +
:0から18446744073709551615の範囲の整数値を保存するために使用されます。 -
+ Float64 +
:2039.23、10.5などの浮動小数点数を格納するために使用されます。 -
+ String
:可変長文字の保存に使用されます。 任意の長さを格納できるため、最大長属性は必要ありません。 -
+ Date +
: `+ YYYY-MM-DD +`形式に従う日付を保存するために使用されます。 -
+ DateTime +
:日付と時刻を組み合わせて保存するために使用され、 `+ YYYY-MM-DD HH:MM:SS +`形式に従います。
列の定義後、テーブルに使用されるエンジンを指定します。 ClickHouseでは、_Engines_が基になるデータの物理構造、テーブルのクエリ機能、同時アクセスモード、インデックスのサポートを決定します。 さまざまなエンジン要件は、さまざまなアプリケーション要件に適しています。 最も一般的に使用され、広く適用されているエンジンタイプは、「+ MergeTree +」です。
テーブル作成の概要ができたので、テーブルを作成します。 変更するデータベースを確認することから始めます。
USE ;
`+ default `データベースから `+`データベースに切り替えたことを示す次の出力が表示されます。
Output
USE
Ok.
0 rows in set. Elapsed: 0.001 sec.
このガイドの残りの部分では、このデータベースのコンテキスト内でステートメントを実行することを想定しています。
次のコマンドを実行して、 `++`テーブルを作成します。
CREATE TABLE (
,
,
,
) ENGINE =
PRIMARY KEY
ORDER BY ;
コマンドの機能の内訳は次のとおりです。 4つの列を持つ `++`という名前のテーブルを作成します。
-
+ id +
:主キー列。 他のRDBMSシステムと同様に、ClickHouseの主キー列は行を一意に識別します。各行には、この列の一意の値が必要です。 -
+ duration +
:各訪問の期間を秒単位で保存するために使用されるフロート列。 `+ float +`カラムには、12.50などの10進数値を格納できます。 -
+ url
:` + http:// example.com`のような、アクセスしたURLを保存する文字列列。 -
+ created +
:訪問が発生した日時を追跡する日付と時刻の列。
列定義の後、テーブルのストレージエンジンとして「+ MergeTree +」を指定します。 エンジンのhttps://clickhouse.yandex/docs/en/operations/table_engines/mergetree/[MergeTreeファミリー]は、大規模なリアルタイム挿入、全体的な堅牢性、およびクエリサポートの最適化されたサポートにより、実稼働データベースに推奨されます。 さらに、MergeTreeエンジンは、主キーによる行の並べ替え、行のパーティション分割、データの複製とサンプリングをサポートしています。
頻繁にクエリされないデータのアーカイブまたは一時データの保存にClickHouseを使用する場合は、https://clickhouse.yandex/docs/en/operations/table_engines/log_family/ [Log family]のエンジンを使用して最適化できます。そのユースケースのために。
列の定義後、他のテーブルレベルのオプションを定義します。 + PRIMARY KEY`句は
+ id + を主キーカラムとして設定し、
+ ORDER BY`句は `+ id +`カラムでソートされた値を保存します。 主キーは行を一意に識別し、単一行への効率的なアクセスと行の効率的なコロケーションに使用されます。
createステートメントを実行すると、次の出力が表示されます。
OutputCREATE TABLE visits
(
id UInt64,
duration Float64,
url String,
created DateTime
)
ENGINE = MergeTree()
PRIMARY KEY id
ORDER BY id
Ok.
0 rows in set. Elapsed: 0.010 sec.
このセクションでは、Webサイト訪問データを追跡するためのデータベースとテーブルを作成しました。 次のステップでは、データをテーブルに挿入し、既存のデータを更新して、そのデータを削除します。
手順4-データと列の挿入、更新、削除
このステップでは、 `++`テーブルを使用してデータを挿入、更新、削除します。 次のコマンドは、ClickHouseテーブルに行を挿入するための構文の例です。
INSERT INTO VALUES (, );
次に、次の各ステートメントを実行して、ウェブサイト訪問データのサンプルの数行を「++」テーブルに挿入します。
INSERT INTO VALUES ();
INSERT INTO VALUES ();
INSERT INTO VALUES ();
INSERT INTO VALUES ();
挿入ステートメントごとに次の出力が繰り返されます。
Output
INSERT INTO VALUES
Ok.
1 rows in set. Elapsed: 0.004 sec.
各行の出力は、それが「++」テーブルに正常に挿入されたことを示しています。
次に、「+」テーブルに列を追加します。 既存のテーブルに列を追加または削除する場合、ClickHouseは ` ALTER +`構文をサポートします。
たとえば、テーブルに列を追加するための基本的な構文は次のとおりです。
ALTER TABLE ADD COLUMN ;
次のステートメントを実行して、Webサイトへの訪問の場所を保存する「++」という名前の列を追加します。
ALTER TABLE ADD COLUMN ;
次のような出力が表示されます。
OutputALTER TABLE
ADD COLUMN
location String
Ok.
0 rows in set. Elapsed: 0.014 sec.
出力は、「++」列が正常に追加されたことを示しています。
バージョン19.3.6の時点では、ClickHouseは実装の制約のため、データの個々の行の更新と削除をサポートしていません。 ただし、ClickHouseは一括更新と一括削除をサポートしており、これらの操作の標準ではない使用法を強調するための明確なSQL構文を備えています。
次の構文は、行を一括更新する例です。
ALTER TABLE UPDATE WHERE ;
次のステートメントを実行して、「+ duration」が15未満のすべての行の「+ url in」列を更新します。 データベースプロンプトに入力して実行します。
ALTER TABLE UPDATE url = '' WHERE ;
一括更新ステートメントの出力は次のとおりです。
Output
ALTER TABLE
UPDATE url = '' WHERE duration < 15
Ok.
0 rows in set. Elapsed: 0.003 sec.
出力は、更新クエリが正常に完了したことを示しています。 出力の `+0 rows in set +`は、クエリが行を返さなかったことを示します。これは、更新クエリと削除クエリの場合に当てはまります。
行を一括削除するための構文例は、行の更新に似ており、次の構造を持っています。
ALTER TABLE DELETE WHERE ;
データの削除をテストするには、次のステートメントを実行して、「+ duration +」が5未満のすべての行を削除します。
ALTER TABLE DELETE WHERE ;
一括削除ステートメントの出力は次のようになります。
Output
ALTER TABLE
DELETE WHERE duration < 5
Ok.
0 rows in set. Elapsed: 0.003 sec.
出力は、5秒未満の期間で行を削除したことを確認します。
テーブルから列を削除するには、構文は次の構造例に従います。
ALTER TABLE DROP COLUMN ;
次を実行して、以前に追加した「+ location +」列を削除します。
ALTER TABLE DROP COLUMN ;
列が削除されたことを確認する「+ DROP COLUMN +」出力は次のようになります。
OutputALTER TABLE
DROP COLUMN
location String
Ok.
0 rows in set. Elapsed: 0.010 sec.
`++`テーブルに行と列を正常に挿入、更新、削除したので、次のステップでデータのクエリに進みます。
ステップ5-データのクエリ
ClickHouseのクエリ言語は、分析ワークロードに適した拡張機能を備えたSQLのカスタム方言です。 このステップでは、選択および集約クエリを実行して、 `++`テーブルからデータと結果を取得します。
選択クエリを使用すると、指定した条件でフィルタリングされたデータの行と列を、取得する行数などのオプションとともに取得できます。 `+ SELECT `構文を使用して、データの行と列を選択できます。 ` SELECT +`クエリの基本的な構文は次のとおりです。
SELECT FROM WHERE ;
次のステートメントを実行して、「+ url 」が「 http://example.com+」である行の「+ url」および「+ duration of」の値を取得します。
SELECT url, duration FROM WHERE url = 'http://example2.com' LIMIT 2;
次の出力が表示されます。
OutputSELECT
url,
duration
FROM
WHERE url = 'http://example2.com'
LIMIT 2
┌─url─────────────────┬─duration─┐
│ http://example2.com │ 10.5 │
└─────────────────────┴──────────┘
┌─url─────────────────┬─duration─┐
│ http://example2.com │ 13 │
└─────────────────────┴──────────┘
2 rows in set. Elapsed: 0.013 sec.
出力は、指定した条件に一致する2つの行を返しました。 値を選択したので、集計クエリの実行に移ることができます。
集計クエリは、一連の値を操作し、単一の出力値を返すクエリです。 分析データベースでは、これらのクエリは頻繁に実行され、データベースによって適切に最適化されます。 ClickHouseでサポートされているいくつかの集約関数は次のとおりです。
-
+ count +
:指定された条件に一致する行の数を返します。 -
+ sum +
:選択した列の値の合計を返します。 -
+ avg +
:選択した列の値の平均を返します。
ClickHouse固有の集計関数には次のものがあります。
-
+ uniq +
:一致した個別の行のおおよその数を返します。 -
+ topK +
:近似アルゴリズムを使用して、特定の列の最も頻繁な値の配列を返します。
集計クエリの実行を示すために、 `+ sum +`クエリを実行して訪問の合計期間を計算します:
SELECT FROM ;
次のような出力が表示されます。
Output
SELECT
FROM
┌─SUM(duration)─┐
│ 63.7 │
└───────────────┘
1 rows in set. Elapsed: 0.010 sec.
次に、以下を実行して上位2つのURLを計算します。
SELECT FROM ;
次のような出力が表示されます。
OutputSELECT topK(2)(url)
FROM visits
┌─topK(2)(url)──────────────────────────────────┐
│ ['http://example2.com','http://example1.com'] │
└───────────────────────────────────────────────┘
1 rows in set. Elapsed: 0.010 sec.
「++」テーブルのクエリが正常に完了したので、次のステップでテーブルとデータベースを削除します。
ステップ6-テーブルとデータベースの削除
このセクションでは、「」テーブルと「」データベースを削除します。
テーブルを削除するための構文は、この例に従います。
DROP TABLE ;
`++`テーブルを削除するには、次のステートメントを実行します。
DROP TABLE ;
テーブルが正常に削除されたことを宣言する次の出力が表示されます。
outputDROP TABLE
Ok.
0 rows in set. Elapsed: 0.005 sec.
`+ DROP database `構文を使用してデータベースを削除できます。 `+`データベースを削除するには、次のステートメントを実行します。
DROP DATABASE ;
結果の出力は、データベースが正常に削除されたことを示しています。
Output
DROP DATABASE
Ok.
0 rows in set. Elapsed: 0.003 sec.
この手順でテーブルとデータベースを削除しました。 ClickHouseインスタンスでデータベース、テーブル、データを作成、更新、削除したので、次のセクションでデータベースサーバーへのリモートアクセスを有効にします。
手順7-ファイアウォールルールの設定(オプション)
同じサーバーで実行されているアプリケーションでClickHouseをローカルでのみ使用する場合、またはサーバーでファイアウォールを有効にしていない場合は、このセクションを完了する必要はありません。 代わりに、ClickHouseデータベースサーバーにリモートで接続する場合は、この手順に従う必要があります。
現在、サーバーでは、すべてのポートにアクセスするパブリックIPアドレスを無効にするファイアウォールが有効になっています。 リモートアクセスを許可するには、次の2つの手順を完了します。
-
ClickHouseの構成を変更し、すべてのインターフェイスでリッスンできるようにします。
-
ClickHouseサーバーが実行するHTTPポートであるポート「8123」への着信接続を許可するファイアウォールルールを追加します。
データベースプロンプト内にいる場合は、「+ CTRL + D +」と入力して終了します。
以下を実行して構成ファイルを編集します。
sudo nano /etc/clickhouse-server/config.xml
次に、次のファイルのように、 `+ <!-<listen_host> 0.0.0.0 </ listen_host>→ +`を含む行のコメントを解除します。
/etc/clickhouse-server/config.xml
...
<interserver_http_host>example.yandex.ru</interserver_http_host>
-->
<!-- Listen specified host. use :: (wildcard IPv6 address), if you want to accept connections both with IPv4 and IPv6 from everywhere. -->
<!-- <listen_host>::</listen_host> -->
<!-- Same for hosts with disabled ipv6: -->
<!-- Default values - try listen localhost on ipv4 and ipv6: -->
<!--
<listen_host>::1</listen_host>
<listen_host>127.0.0.1</listen_host>
-->
...
ファイルを保存して、「+ nano +」を終了します。 新しい構成を適用するには、次を実行してサービスを再起動します。
sudo service clickhouse-server restart
このコマンドからの出力は表示されません。 ClickHouseのサーバーは、HTTP接続の場合はポート「8123」で、「+ clickhouse-client 」からの接続の場合はポート「+9000」でリッスンします。 次のコマンドを使用して、2番目のサーバーのIPアドレスの両方のポートへのアクセスを許可します。
sudo ufw allow from /32 to any port 8123
sudo ufw allow from /32 to any port 9000
両方のポートへのアクセスを有効にしたことを示す両方のコマンドの次の出力が表示されます。
OutputRule added
ClickHouseは、追加したIPからアクセスできるようになります。 必要に応じて、ローカルマシンのアドレスなどのIPを自由に追加してください。
リモートマシンからClickHouseサーバーに接続できることを確認するには、最初に2台目のサーバーでこのチュートリアルのステップ1の手順を実行し、 `+ clickhouse-client +`がインストールされていることを確認します。
2番目のサーバーにログインしたので、次を実行してクライアントセッションを開始します。
clickhouse-client --host
サーバーに正常に接続されたことを示す次の出力が表示されます。
OutputClickHouse client version 19.3.6.
Connecting to :9000 as user default.
Connected to ClickHouse server version 19.3.6 revision 54415.
:)
この手順では、ファイアウォールルールを調整して、ClickHouseデータベースサーバーへのリモートアクセスを有効にしました。
結論
サーバーにClickHouseデータベースインスタンスを正常にセットアップし、データベースとテーブルを作成し、データを追加し、クエリを実行し、データベースを削除しました。 ClickHouseのドキュメント内で、他のオープンソースおよび商用の分析データベースに対するhttps://ClickHouse.yandex/benchmark.html[benchmarks]および一般的なリファレンスhttps://ClickHouse.yandex/docs/en/[documents]を読むことができます。 さらにhttps://ClickHouse.yandex/docs/en/introduction/distinctive_features/[features] ClickHouseには、異なるhttps://www.digitaloceanにデータを保存することでパフォーマンスを改善し、データ損失から保護するために、複数のサーバーにわたる分散クエリ処理が含まれます。 com / community / tutorials / understanding-database-sharding [shards]。