Ubuntu18.04にClickHouseをインストールして使用する方法
序章
ClickHouse は、OLAPおよびビッグデータのユースケース向けにYandexによって作成されたオープンソースの列指向分析データベースです。 ClickHouseはリアルタイムのクエリ処理をサポートしているため、1秒未満の分析結果を必要とするアプリケーションに適しています。 ClickHouseのクエリ言語はSQLの方言であり、強力な宣言型クエリ機能を可能にすると同時に、エンドユーザーに親しみやすさと学習曲線を提供します。
列指向データベースは、行ではなく列でグループ化されたブロックにレコードを格納します。 クエリに存在しない列のデータをロードしないことにより、列指向データベースはクエリの完了中にデータを読み取る時間を短縮します。 その結果、これらのデータベースは、OLAPなどの特定のワークロードに対して、従来の行ベースのシステムよりもはるかに高速に結果を計算して返すことができます。
オンライン分析処理(OLAP)システムを使用すると、大量のデータを整理し、複雑なクエリを実行できます。 ペタバイトのデータを管理し、クエリ結果をすばやく返すことができます。 このように、OLAPは、データサイエンスやビジネス分析などの分野での作業に役立ちます。
このチュートリアルでは、ClickHouseデータベースサーバーとクライアントをマシンにインストールします。 通常のタスクにはDBMSを使用し、オプションで別のサーバーからのリモートアクセスを有効にして、別のマシンからデータベースに接続できるようにします。 次に、サンプルのWebサイト訪問データをモデル化してクエリすることにより、ClickHouseをテストします。
前提条件
- 1台のUbuntu18.04サーバーと
sudo
root以外のユーザーとファイアウォールのセットアップを有効にしました。 サーバーの初期設定チュートリアルに従って、ユーザーを作成し、ファイアウォールを設定できます。 - (オプション)セカンダリUbuntu18.04サーバーと
sudo
root以外のユーザーとファイアウォールのセットアップを有効にしました。 サーバーの初期設定チュートリアルに従うことができます。
ステップ1—ClickHouseのインストール
このセクションでは、次を使用してClickHouseサーバーおよびクライアントプログラムをインストールします。 apt-get
.
まず、次のコマンドを実行してサーバーにSSH接続します。
- ssh sammy@your_server_ip
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
The clickhouse-server
と clickhouse-client
これで、パッケージをインストールできるようになります。 それらをインストールします:
- sudo apt-get install -y clickhouse-server clickhouse-client
ClickHouseサーバーとクライアントが正常にインストールされました。 これで、データベースサービスを開始し、正しく実行されていることを確認する準備が整いました。
ステップ2—サービスを開始する
The clickhouse-server
前のセクションでインストールしたパッケージは、 systemd
データベースサーバーの起動、停止、再起動などのアクションを実行するサービス。 systemd は、Linuxがサービスを初期化および管理するためのinitシステムです。 このセクションでは、サービスを開始し、正常に実行されていることを確認します。
を開始します clickhouse-server
実行によるサービス:
- sudo service clickhouse-server start
前のコマンドは出力を表示しません。 サービスが正常に実行されていることを確認するには、次を実行します。
- sudo service clickhouse-server status
次のような出力が表示されます。
Output
● clickhouse-server.service - ClickHouse Server (analytic DBMS for big data)
Loaded: loaded (/etc/systemd/system/clickhouse-server.service; enabled; vendor preset: enabled)
Active: active (running) 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 table_name
構文。 データベースを作成するには、最初に次のコマンドを実行してクライアントセッションを開始します。
- clickhouse-client
このコマンドは、クライアントプロンプトにログインし、ClickHouseSQLステートメントを実行して次のようなアクションを実行できます。
-
データベース、テーブル、インデックス、パーティション、およびビューの作成、更新、および削除。
-
クエリを実行して、さまざまな条件を使用してオプションでフィルタリングおよびグループ化されたデータを取得します。
このステップでは、ClickHouseクライアントでデータを挿入する準備ができたら、データベースとテーブルを作成します。 このチュートリアルでは、次の名前のデータベースを作成します。 test
、その中に、という名前のテーブルを作成します visits
Webサイトの訪問期間を追跡します。
ClickHouseコマンドプロンプトが表示されたら、次のコマンドを作成します。 test
実行することによるデータベース:
- CREATE DATABASE test;
データベースを作成したことを示す次の出力が表示されます。
Output
CREATE DATABASE test
Ok.
0 rows in set. Elapsed: 0.003 sec.
ClickHouseテーブルは、他のリレーショナルデータベースのテーブルに似ています。 構造化された形式で関連データのコレクションを保持します。 列とそのタイプを指定したり、データの行を追加したり、テーブルに対してさまざまな種類のクエリを実行したりできます。
ClickHouseでテーブルを作成するための構文は、次の構造例に従います。
CREATE TABLE table_name
(
column_name1 column_type [options],
column_name2 column_type [options],
...
) ENGINE = engine
The table_name
と column_name
値は、任意の有効なASCII識別子にすることができます。 ClickHouseは、さまざまな種類の列をサポートしています。 最も人気のあるもののいくつかは次のとおりです。
-
UInt64
:0〜18446744073709551615の範囲の整数値を格納するために使用されます。 -
Float64
:2039.23、10.5などの浮動小数点数を格納するために使用されます。 -
String
:可変長文字を格納するために使用されます。 任意の長さを格納できるため、maxlength属性は必要ありません。 -
Date
:次の日付を保存するために使用されますYYYY-MM-DD
フォーマット。 -
DateTime
:日付と時刻を保存するために使用され、YYYY-MM-DD HH:MM:SS
フォーマット。
列定義の後で、テーブルに使用されるエンジンを指定します。 ClickHouseでは、 Engines が、基になるデータの物理構造、テーブルのクエリ機能、同時アクセスモード、およびインデックスのサポートを決定します。 さまざまなエンジンタイプがさまざまなアプリケーション要件に適しています。 最も一般的に使用され、広く適用可能なエンジンタイプは MergeTree
.
テーブル作成の概要がわかったので、テーブルを作成します。 変更するデータベースを確認することから始めます。
- USE test;
次の出力が表示され、に切り替えたことを示します。 test
からのデータベース default
データベース:
Output
USE test
Ok.
0 rows in set. Elapsed: 0.001 sec.
このガイドの残りの部分では、このデータベースのコンテキスト内でステートメントを実行していることを前提としています。
あなたの visits
次のコマンドを実行してテーブルを作成します。
- CREATE TABLE visits (
- id UInt64,
- duration Float64,
- url String,
- created DateTime
- ) ENGINE = MergeTree()
- PRIMARY KEY id
- ORDER BY id;
コマンドの機能の内訳は次のとおりです。 次の名前のテーブルを作成します visits
4つの列があります:
-
id
:主キー列。 他のRDBMSシステムと同様に、ClickHouseの主キー列は行を一意に識別します。 各行には、この列の一意の値が必要です。 -
duration
:各訪問の期間を秒単位で保存するために使用されるフロート列。float
列には、12.50などの10進値を格納できます。 -
url
:アクセスしたURLを格納する文字列列。http://example.com
. -
created
:訪問がいつ発生したかを追跡する日付と時刻の列。
列定義の後に、次のように指定します MergeTree
テーブルのストレージエンジンとして。 MergeTreeファミリーのエンジンは、大規模なリアルタイム挿入の最適化されたサポート、全体的な堅牢性、およびクエリのサポートにより、本番データベースに推奨されます。 さらに、MergeTreeエンジンは、主キーによる行の並べ替え、行のパーティション化、およびデータの複製とサンプリングをサポートします。
ClickHouseを使用して、頻繁にクエリされないデータをアーカイブしたり、一時データを保存したりする場合は、エンジンのログファミリーを使用して、そのユースケースに最適化できます。
列を定義した後、他のテーブルレベルのオプションを定義します。 The 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—データと列の挿入、更新、および削除
このステップでは、 visits
データを挿入、更新、および削除するためのテーブル。 次のコマンドは、ClickHouseテーブルに行を挿入するための構文の例です。
INSERT INTO table_name VALUES (column_1_value, column_2_value, ....);
次に、サンプルのWebサイト訪問データを数行挿入します。 visits
次の各ステートメントを実行してテーブルを作成します。
- INSERT INTO visits VALUES (1, 10.5, 'http://example.com', '2019-01-01 00:01:01');
- INSERT INTO visits VALUES (2, 40.2, 'http://example1.com', '2019-01-03 10:01:01');
- INSERT INTO visits VALUES (3, 13, 'http://example2.com', '2019-01-03 12:01:01');
- INSERT INTO visits VALUES (4, 2, 'http://example3.com', '2019-01-04 02:01:01');
挿入ステートメントごとに次の出力が繰り返されます。
Output
INSERT INTO visits VALUES
Ok.
1 rows in set. Elapsed: 0.004 sec.
各行の出力は、行が正常に挿入されたことを示しています。 visits
テーブル。
次に、列を追加します visits
テーブル。 既存のテーブルに列を追加または削除する場合、ClickHouseは ALTER
構文。
たとえば、テーブルに列を追加するための基本的な構文は次のとおりです。
ALTER TABLE table_name ADD COLUMN column_name column_type;
名前の付いた列を追加します location
次のステートメントを実行することにより、Webサイトへのアクセスの場所を保存します。
- ALTER TABLE visits ADD COLUMN location String;
次のような出力が表示されます。
OutputALTER TABLE visits
ADD COLUMN
location String
Ok.
0 rows in set. Elapsed: 0.014 sec.
出力は、追加したことを示しています location
列に正常に。
バージョン19.3.6以降、実装上の制約により、ClickHouseはデータの個々の行の更新と削除をサポートしていません。 ClickHouseは一括更新と削除をサポートしていますが、これらの操作の非標準的な使用法を強調するための明確なSQL構文があります。
次の構文は、行を一括更新するための例です。
ALTER TABLE table_name UPDATE column_1 = value_1, column_2 = value_2 ... WHERE filter_conditions;
次のステートメントを実行して、 url
を持つすべての行の列 duration
15未満の。 これをデータベースプロンプトに入力して実行します。
- ALTER TABLE visits UPDATE url = 'http://example2.com' WHERE duration < 15;
一括更新ステートメントの出力は次のようになります。
Output
ALTER TABLE visits
UPDATE url = 'http://example2.com' WHERE duration < 15
Ok.
0 rows in set. Elapsed: 0.003 sec.
出力は、更新クエリが正常に完了したことを示しています。 The 0 rows in set
出力では、クエリが行を返さなかったことを示します。 これは、更新および削除クエリの場合に当てはまります。
行の一括削除の構文例は、行の更新に似ており、次の構造になっています。
ALTER TABLE table_name DELETE WHERE filter_conditions;
データの削除をテストするには、次のステートメントを実行して、 duration
5未満の:
- ALTER TABLE visits DELETE WHERE duration < 5;
一括削除ステートメントの出力は次のようになります。
Output
ALTER TABLE visits
DELETE WHERE duration < 5
Ok.
0 rows in set. Elapsed: 0.003 sec.
出力は、5秒未満の期間で行を削除したことを確認します。
テーブルから列を削除するための構文は、次の構造例に従います。
ALTER TABLE table_name DROP COLUMN column_name;
を削除します location
次のコマンドを実行して以前に追加した列:
- ALTER TABLE visits DROP COLUMN location;
The DROP COLUMN
列を削除したことを確認する出力は次のようになります。
OutputALTER TABLE visits
DROP COLUMN
location String
Ok.
0 rows in set. Elapsed: 0.010 sec.
これで、行と列が正常に挿入、更新、および削除されました。 visits
テーブルでは、次のステップでデータのクエリに進みます。
ステップ5—データのクエリ
ClickHouseのクエリ言語は、分析ワークロードに適した拡張機能と機能を備えたSQLのカスタム方言です。 このステップでは、選択クエリと集計クエリを実行して、データと結果を取得します。 visits
テーブル。
選択クエリを使用すると、指定した条件でフィルタリングされたデータの行と列を、返す行数などのオプションとともに取得できます。 を使用してデータの行と列を選択できます SELECT
構文。 の基本構文 SELECT
クエリは次のとおりです。
SELECT func_1(column_1), func_2(column_2) FROM table_name WHERE filter_conditions row_options;
次のステートメントを実行して取得します url
と duration
行の値 url
は http://example.com
.
- SELECT url, duration FROM visits WHERE url = 'http://example2.com' LIMIT 2;
次の出力が表示されます。
OutputSELECT
url,
duration
FROM visits
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 SUM(duration) FROM visits;
次のような出力が表示されます。
Output
SELECT SUM(duration)
FROM visits
┌─SUM(duration)─┐
│ 63.7 │
└───────────────┘
1 rows in set. Elapsed: 0.010 sec.
次に、以下を実行して上位2つのURLを計算します。
- SELECT topK(2)(url) FROM visits;
次のような出力が表示されます。
OutputSELECT topK(2)(url)
FROM visits
┌─topK(2)(url)──────────────────────────────────┐
│ ['http://example2.com','http://example1.com'] │
└───────────────────────────────────────────────┘
1 rows in set. Elapsed: 0.010 sec.
これで、クエリが正常に実行されました visits
テーブルの場合、次のステップでテーブルとデータベースを削除します。
ステップ6—テーブルとデータベースの削除
このセクションでは、 visits
テーブルと test
データベース。
テーブルを削除するための構文は、次の例に従います。
DROP TABLE table_name;
を削除するには visits
テーブルで、次のステートメントを実行します。
- DROP TABLE visits;
テーブルが正常に削除されたことを宣言する次の出力が表示されます。
outputDROP TABLE visits
Ok.
0 rows in set. Elapsed: 0.005 sec.
データベースを削除するには、 DROP database table_name
構文。 を削除するには test
データベースで、次のステートメントを実行します。
- DROP DATABASE test;
結果の出力は、データベースが正常に削除されたことを示しています。
Output
DROP DATABASE test
Ok.
0 rows in set. Elapsed: 0.003 sec.
このステップでテーブルとデータベースを削除しました。 ClickHouseインスタンスでデータベース、テーブル、およびデータを作成、更新、および削除したので、次のセクションでデータベースサーバーへのリモートアクセスを有効にします。
手順7—ファイアウォールルールの設定(オプション)
同じサーバーで実行されているアプリケーションでClickHouseをローカルでのみ使用する場合、またはサーバーでファイアウォールを有効にしていない場合は、このセクションを完了する必要はありません。 代わりに、ClickHouseデータベースサーバーにリモートで接続する場合は、この手順に従う必要があります。
現在、サーバーでファイアウォールが有効になっているため、パブリックIPアドレスがすべてのポートにアクセスできなくなります。 リモートアクセスを許可するには、次の2つの手順を実行します。
-
ClickHouseの構成を変更し、すべてのインターフェイスでリッスンできるようにします。
-
ポートへの着信接続を許可するファイアウォールルールを追加します
8123
、ClickHouseサーバーが実行するHTTPポートです。
データベースプロンプト内にいる場合は、次のように入力して終了します CTRL+D
.
次のコマンドを実行して、構成ファイルを編集します。
- sudo nano /etc/clickhouse-server/config.xml
次に、を含む行のコメントを解除します <!-- <listen_host>0.0.0.0</listen_host> -->
、次のファイルのように:
...
<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: -->
<listen_host>0.0.0.0</listen_host>
<!-- 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のサーバーはポートでリッスンします 8123
HTTP接続およびポート用 9000
からの接続用 clickhouse-client
. 次のコマンドを使用して、2番目のサーバーのIPアドレスの両方のポートへのアクセスを許可します。
- sudo ufw allow from second_server_ip/32 to any port 8123
- sudo ufw allow from second_server_ip/32 to any port 9000
両方のコマンドについて、両方のポートへのアクセスを有効にしたことを示す次の出力が表示されます。
OutputRule added
これで、追加したIPからClickHouseにアクセスできるようになります。 必要に応じて、ローカルマシンのアドレスなどのIPを自由に追加してください。
リモートマシンからClickHouseサーバーに接続できることを確認するには、最初に2番目のサーバーでこのチュートリアルのステップ1の手順に従い、次のサーバーがあることを確認します。 clickhouse-client
その上にインストールされます。
2番目のサーバーにログインしたので、次を実行してクライアントセッションを開始します。
- clickhouse-client --host your_server_ip
サーバーに正常に接続したことを示す次の出力が表示されます。
OutputClickHouse client version 19.3.6.
Connecting to your_server_ip:9000 as user default.
Connected to ClickHouse server version 19.3.6 revision 54415.
hostname :)
この手順では、ファイアウォールルールを調整して、ClickHouseデータベースサーバーへのリモートアクセスを有効にしました。
結論
これで、サーバー上にClickHouseデータベースインスタンスが正常にセットアップされ、データベースとテーブルが作成され、データが追加され、クエリが実行され、データベースが削除されました。 ClickHouseのドキュメントでは、他のオープンソースおよび商用分析データベースに対するベンチマークおよび一般的なリファレンスドキュメントについて読むことができます。 その他の機能ClickHouseには、複数のサーバーに分散されたクエリ処理が含まれており、さまざまなシャードにデータを保存することで、パフォーマンスを向上させ、データ損失から保護します。