このトピックでは、ApsaraDB for ClickHouse に関するよくある質問への回答を提供します。
選択と購入
スケールアウトとスケールイン
接続
移行と同期
ApsaraDB for ClickHouse クラスターにデータをインポートするときに、「too many parts」というエラーメッセージが表示された場合はどうすればよいですか?
DataX を使用して ApsaraDB for ClickHouse クラスターのテーブルにデータをインポートするのに長い時間がかかるのはなぜですか?
テーブル間でデータが同期された後、Hive インスタンスのテーブルと ApsaraDB for ClickHouse クラスターの外部テーブルの間で行数が一致しないのはなぜですか?
テーブル間でデータが同期された後、Kafka インスタンスのテーブルと ApsaraDB for ClickHouse クラスターの外部テーブルの間で行数が一致しないのはなぜですか?
Spark または Flink を使用して ApsaraDB for ClickHouse クラスターにデータをインポートするにはどうすればよいですか?
セルフマネージド ClickHouse データベースから ApsaraDB for ClickHouse クラスターにデータを移行するにはどうすればよいですか?
「Too many partitions for single INSERT block (more than 100)」というエラーメッセージが表示された場合はどうすればよいですか?
ApsaraDB for ClickHouse は、コミュニティ互換版クラスターからエンタープライズ版クラスターへのデータ移行をサポートしていますか?
データの書き込みとクエリ
INSERT INTO SELECT 文を実行した後、メモリ使用量がしきい値を超えたためにエラーが発生した場合はどうすればよいですか?
テーブルにデータが書き込まれていないときに、同じ文を実行してテーブルからデータをクエリするたびに異なるクエリ結果が返される場合はどうすればよいですか?
作成したテーブルが見つからないのはなぜですか?また、同じ文を実行するたびに異なる数のレコードが返される場合はどうすればよいですか?
テーブルからクエリされたタイムスタンプデータが、テーブルに書き込まれたタイムスタンプデータと異なる場合はどうすればよいですか?
Kafka 外部テーブルのデータを格納するローカルテーブルのデータ量が、外部テーブルからデータを書き込んだ後も変更されないのはなぜですか?
ApsaraDB for ClickHouse で DDL 文を実行して列を作成、削除、または変更するにはどうすればよいですか?
テーブルを作成するときに「ON CLUSTER is not allowed for Replicated database」というエラーメッセージが表示された場合はどうすればよいですか?
データストレージ
モニタリング、スペックアップ、およびシステムパラメータ
その他
オープンソースの ClickHouse と比較した ApsaraDB for ClickHouse の独自機能は何ですか?
安定性を確保するために、ApsaraDB for ClickHouse ではオープンソースの ClickHouse の複数のバグが修正されています。 ApsaraDB for ClickHouse は、ユーザーにバインドされているリソースキューに優先順位を割り当てるためのリソースキュー機能を提供します。
購入に推奨される ApsaraDB for ClickHouse クラスターのバージョンはどれですか?
ApsaraDB for ClickHouse は、オープンソースコミュニティによってリリースされた長期サポート (LTS) カーネルバージョンに基づいてサービスを提供します。ほとんどの場合、リリース後 3 か月以上カーネルバージョンが安定している場合は、そのカーネルバージョンを使用する ApsaraDB for ClickHouse クラスターを購入できます。 V21.8 以降の ApsaraDB for ClickHouse クラスターを購入することをお勧めします。異なるカーネルバージョンの機能比較については、異なるカーネルバージョンの機能比較を参照してください。
シングルレプリカ版とダブルレプリカ版の違いは何ですか?
シングルレプリカ版の ApsaraDB for ClickHouse クラスターの場合、レプリカシャードを持つシャードはありません。このエディションは高可用性を保証できません。シングルレプリカ版の ApsaraDB for ClickHouse クラスターは、データの複数のコピーを作成し、ディスクにデータを保存します。このエディションは費用対効果が高く、データのセキュリティを確保します。
ダブルレプリカ版の ApsaraDB for ClickHouse クラスターでは、各シャードにレプリカシャードがあります。これにより、ディザスタリカバリが可能になります。クラスター内のシャードが使用できなくなると、そのレプリカシャードが引き継ぎます。
ApsaraDB for ClickHouse クラスターを作成するときに、選択したゾーンのリソースが不足している場合はどうすればよいですか?
同じリージョン内の別のゾーンを選択できます。同じバーチャルプライベートクラウド (VPC) 内の ApsaraDB for ClickHouse クラスターは、同じリージョン内の異なるゾーンのリソースを使用できます。同じリージョン内のサービスは、ネットワークレイテンシの影響を受けません。
クラスターのスケールアウトまたはスケールインに必要な時間に影響を与える要因は何ですか?
クラスターのスケールアウトまたはスケールイン中にデータが移行されます。クラスターデータの量が多いほど、スケーリングに時間がかかります。
スケールアウトまたはスケールイン中にクラスターはどのように影響を受けますか?
クラスターをスケールアウトまたはスケールインすると、クラスターは読み取り専用になります。これにより、データの移行後にデータの整合性が確保されます。
水平スケーリングの推奨事項は何ですか?
水平スケーリングは完了するまでに長い時間がかかる場合があります。クラスターのパフォーマンスがビジネス要件を満たせない場合は、クラスターをスケールアップすることをお勧めします。クラスターをスケールアップする方法の詳細については、ApsaraDB for ClickHouse コミュニティ互換版クラスターの構成を変更するを参照してください。
ポートはどのように機能しますか?
プロトコル | ポート | シナリオ |
TCP | 3306 | このポートは、clickhouse-client ツールを使用して ApsaraDB for ClickHouse クラスターに接続するときに使用されます。詳細については、ApsaraDB for ClickHouse の CLI を使用してクラスターに接続するを参照してください。 |
HTTP | 8123 | このポートは、Java Database Connectivity (JDBC) を使用して ApsaraDB for ClickHouse クラスターに接続してアプリケーション開発を行うときに使用されます。詳細については、JDBC を使用して ApsaraDB for ClickHouse クラスターに接続するを参照してください。 |
HTTPS | 8443 | このポートは、HTTPS を使用して ApsaraDB for ClickHouse クラスターに接続するときに使用されます。詳細については、HTTPS 経由で ApsaraDB for ClickHouse クラスターに接続するを参照してください。 |
各プログラミング言語の SDK が ApsaraDB for ClickHouse クラスターに接続するために使用するポートは何ですか?
プログラミング言語 | HTTP | TCP |
Java | 8123 | 3306 |
Python | ||
Go |
Go または Python に推奨される SDK はどれですか?
詳細については、サードパーティ開発者からのクライアントライブラリを参照してください。
クライアントツールを使用して ApsaraDB for ClickHouse クラスターに接続するときに、「接続がタイムアウトしました」というエラーメッセージが表示された場合はどうすればよいですか?
この問題を解決するには、次の操作を実行します。
ネットワーク接続が確立されているかどうかを確認します。
ping
コマンドを実行して、ネットワーク接続の状態を確認できます。telnet
コマンドを実行して、ApsaraDB for ClickHouse クラスターのポート 3306 とポート 8123 が有効になっているかどうかを確認することもできます。接続先の ApsaraDB for ClickHouse クラスターにホワイトリストが構成されているかどうかを確認します。 ApsaraDB for ClickHouse クラスターのホワイトリストを構成する方法の詳細については、ホワイトリストを構成するを参照してください。
クライアントの実際の IP アドレスが使用されているかどうかを確認します。企業の内部ネットワークに接続されているマシンの IP アドレスは頻繁に変更されます。そのため、取得したクライアント IP アドレスは、クライアントの実際の IP アドレスではない場合があります。 WhatsMyIP などの IP アドレス確認ツールを使用して、クライアントの実際の IP アドレスを取得できます。詳細については、WhatsMyIP を参照してください。
ApsaraDB for ClickHouse クラスターの外部テーブルを MySQL、Hadoop 分散ファイルシステム (HDFS)、Kafka などのプラットフォーム上のテーブルに接続できないのはなぜですか?
V20.3 または V20.8 の ApsaraDB for ClickHouse クラスターに外部テーブルを作成すると、システムは ApsaraDB for ClickHouse クラスターと外部プラットフォーム間のネットワーク接続を自動的に検証します。外部テーブルが作成されると、ネットワーク接続が確立されます。次のいずれかの原因により、外部テーブルの作成に失敗する可能性があります。
接続先のテーブルが、ApsaraDB for ClickHouse クラスターと同じ VPC にないクラスターにデプロイされています。この場合、ネットワーク接続の確立に失敗します。
接続先の MySQL インスタンスにホワイトリストが構成されています。 ApsaraDB for ClickHouse クラスターが接続されている VPC の CIDR ブロックがホワイトリストに含まれていません。この場合、CIDR ブロックをホワイトリストに追加します。
たとえば、ApsaraDB for ClickHouse クラスターに外部テーブルを作成します。外部テーブルは Kafka インスタンスのテーブルに接続されています。外部テーブルからデータをクエリすると、結果が返されません。一般的な原因は、Kafka インスタンスのデータが、外部テーブルのスキーマで定義されているフィールドと形式に基づいて解析できないことです。エラーメッセージは、解析エラーに関する情報を返します。
アプリケーションが ApsaraDB for ClickHouse クラスターに接続できないのはなぜですか?
この問題については、以下のセクションで一般的な原因と解決策を示します。
原因 1:VPC 設定またはインターネットアクセス設定が不適切です。アプリケーションとクラスターが同じ VPC にデプロイされている場合は、内部ネットワーク経由でアプリケーションをクラスターに接続できます。アプリケーションとクラスターが異なる VPC にデプロイされている場合は、クラスターのパブリックエンドポイントを申請します。
解決策:アプリケーションとクラスターが異なる VPC にデプロイされている場合は、クラスターのパブリックエンドポイントを申請します。詳細については、パブリックエンドポイントの申請とリリースを参照してください。
原因 2:アプリケーションの IP アドレスがクラスターのホワイトリストに追加されていません。
解決策:アプリケーションの IP アドレスをクラスターのホワイトリストに追加します。詳細については、ホワイトリストの構成を参照してください。
原因 3:クラスターが実行されている Elastic Compute Service (ECS) インスタンスのセキュリティグループがアクセストラフィックを拒否しています。
解決策:クラスターが実行されている Elastic Compute Service (ECS) インスタンスのセキュリティグループを有効にして、アクセストラフィックを許可します。詳細については、セキュリティグループの操作を参照してください。
原因 4:企業がネットワークファイアウォールを使用しています。
解決策:ファイアウォールルールを変更します。
原因 5:接続文字列のアカウントパスワードに、次の特殊文字のいずれかが含まれています:
!@#$%^&*()_+=
。これらの特殊文字は接続中に認識できません。その結果、アプリケーションは ApsaraDB for ClickHouse クラスターに接続できません。解決策:次のエスケープルールを使用して、接続文字列の特殊文字をエスケープします。
! : %21 @ : %40 # : %23 $ : %24 % : %25 ^ : %5e & : %26 * : %2a ( : %28 ) : %29 _ : %5f + : %2b = : %3d
たとえば、パスワードが
ab@#c
の場合、パスワードのエスケープされた文字は、接続文字列ではab%40%23c
になります。原因 6:ApsaraDB for ClickHouse クラスターは、デフォルトで Classic Load Balancer (CLB) インスタンスに接続されています。 CLB インスタンスは、従量課金制で課金されます。 Alibaba Cloud アカウントに延滞料金がある場合、ApsaraDB for ClickHouse クラスターにアクセスできない可能性があります。
解決策:Alibaba Cloud アカウントに延滞料金があるかどうかを確認します。延滞料金がある場合は、できるだけ早く延滞料金をお支払いください。
ApsaraDB for ClickHouse クラスターのタイムアウトエラーをどのように解決しますか?
ApsaraDB for ClickHouse のカーネルは、複数のタイムアウト関連パラメータを提供し、インタラクション用に複数のプロトコルをサポートしています。たとえば、HTTP および TCP に関連するパラメータを設定して、ApsaraDB for ClickHouse クラスターのタイムアウトエラーを解決できます。
HTTP
HTTP は、本番環境で ApsaraDB for ClickHouse クラスターによって使用される最も一般的なインタラクションプロトコルです。 ClickHouse が提供する Java Database Connectivity (JDBC) ドライバー、Alibaba Cloud Data Management (DMS)、DataGrip など、多くのツールとサービスが HTTP を採用しています。一般的な HTTP ポートは 8123 です。
distributed_ddl_task_timeout パラメータを設定してタイムアウトを処理する
distributed_ddl_task_timeout パラメータは、on cluster 句を含む分散 DDL クエリのタイムアウト期間を指定します。デフォルト値は 180 秒です。 DMS で次の文を実行して、このパラメータをグローバルに設定できます。パラメータを設定した後、クラスターを再起動します。
set global on cluster default distributed_ddl_task_timeout = 1800;
分散 DDL クエリは、ZooKeeper ノードに作成されたタスクキューに基づいて非同期に実行されます。分散 DDL クエリがタイムアウトした場合でも、クエリは失敗していない可能性があります。分散 DDL クエリがタイムアウトした後、クエリはキューで実行されるのを待ちます。クエリを再送信する必要はありません。
max_execution_time パラメータを設定してタイムアウトを処理する
max_execution_time パラメータは、クエリのタイムアウト期間を指定します。クエリのデフォルトのタイムアウト期間は、DMS では 7,200 秒、JDBC ドライバーと DataGrip では 30 秒です。クエリの待機時間が指定されたタイムアウト期間を超えると、クエリは自動的にキャンセルされます。このパラメータは、クエリ文で設定できます。たとえば、次のクエリ文を実行できます:
select * from system.numbers settings max_execution_time = 3600
。また、DMS で次の文を実行して、このパラメータをグローバルに設定することもできます。set global on cluster default max_execution_time = 3600;
socket_timeout パラメータを設定してタイムアウトを処理する
socket_timeout パラメータは、クライアントが HTTP 経由でソケットをリッスンし、結果を待機するときのタイムアウト期間を指定します。デフォルトのタイムアウト期間は、DMS では 7,200 秒、JDBC ドライバーと DataGrip では 30 秒です。このパラメータは、ApsaraDB for ClickHouse の組み込みパラメータではなく、HTTP 用の JDBC ドライバーのパラメータです。このパラメータは、クライアントが結果を待機する制限時間を指定します。max_execution_time パラメータは、socket_timeout パラメータの設定により無効になる場合があります。ほとんどの場合、max_execution_time パラメータを設定するときは、socket_timeout パラメータも設定する必要があります。 socket_timeout パラメータを max_execution_time パラメータの値よりわずかに大きい値に設定します。socket_timeout パラメータを設定するには、JDBC 接続文字列に socket_timeout プロパティを追加します。値の単位はミリ秒です。例:'jdbc:clickhouse://127.0.0.1:8123/default?socket_timeout=3600000'
サーバー IP アドレスを使用して ApsaraDB for ClickHouse サーバーに接続されているクライアントのハングを処理する
ECS インスタンス上の JDBC クライアントが別のセキュリティグループの ApsaraDB for ClickHouse サーバーにアクセスすると、ECS インスタンスでサイレント接続エラーが発生する場合があります。このエラーは、ApsaraDB for ClickHouse サーバーの IP アドレスが、ECS インスタンスが属するセキュリティグループのホワイトリストに追加されていないために発生しました。システムがクライアントの要求のクエリ結果を取得するのに長い時間がかかると、ルートテーブルで使用可能なルートがないため、返された結果をクライアントに送信できない場合があります。この場合、クライアントはハングします。
この問題を解決するには、send_progress_in_http_headers パラメータを 1 に設定します。この方法は、SLB 切断を処理する方法と同じです。この方法はほとんどの場合に機能します。まれに、send_progress_in_http_headers パラメータを 1 に設定した後もこの問題が解決しない場合があります。パラメータを 1 に設定した後も問題が解決しない場合は、ApsaraDB for ClickHouse サーバーの IP アドレスを、ECS インスタンスが属するセキュリティグループのホワイトリストに追加します。次に、問題が解決したかどうかを確認します。
TCP
TCP は、主に ApsaraDB for ClickHouse の組み込みコマンドラインツールを使用してインタラクティブ分析を実行するシナリオで使用されます。頻繁に使用される TCP ポートは 3306 です。 TCP キープアライブパケットは、スケジュールされた接続障害検出に使用されます。 TCP が使用されている場合、ソケットタイムアウトは発生しません。 TCP のタイムアウト関連パラメータ distributed_ddl_task_timeout と max_execution_time のみを設定する必要があります。 HTTP のパラメータを設定するのと同じ方法でパラメータを設定できます。
ORC や Parquet などの形式のデータを Object Storage Service (OSS) オブジェクトから ApsaraDB for ClickHouse クラスターの外部テーブルにインポートするときに、メモリ不足 (OOM) エラーまたはメモリ関連のエラーが発生するのはなぜですか?
一般的な原因:メモリ使用量が多い。
この問題を解決するには、次の操作を実行します。
OSS オブジェクトを複数のオブジェクトに分割します。次に、これらのオブジェクトから ApsaraDB for ClickHouse クラスターの外部テーブルにデータをインポートします。
ApsaraDB for ClickHouse クラスターのメモリ容量をスケールアップします。詳細については、ApsaraDB for ClickHouse コミュニティ互換版クラスターの構成を変更するを参照してください。
ApsaraDB for ClickHouse クラスターにデータをインポートするときに、「too many parts」というエラーメッセージが表示された場合はどうすればよいですか?
ApsaraDB for ClickHouse クラスターのテーブルにデータを書き込むたびに、データパートが生成されます。一度に 1 つのデータレコードまたは少量のデータのみを書き込むと、ApsaraDB for ClickHouse クラスターに多数のデータパートが生成されます。これにより、CPU 使用率が増加し、マージ操作とクエリの実行に必要な時間が長くなります。 ApsaraDB for ClickHouse クラスターで多数のデータパートが生成されないようにするために、生成できるデータパートの数に制限が課せられています。 ApsaraDB for ClickHouse クラスターで多数のデータパートが生成されると、「too many parts」というエラーメッセージが返されます。このエラーが発生した場合は、バッチサイズを増やして、一度に ApsaraDB for ClickHouse クラスターのテーブルに書き込むデータ量を増やします。バッチサイズを増やすことができない場合は、ApsaraDB for ClickHouse コンソールで merge_tree.parts_to_throw_insert
パラメータをより大きい値に設定できます。
DataX を使用して ApsaraDB for ClickHouse クラスターのテーブルにデータをインポートするのに長い時間がかかるのはなぜですか?
この問題については、以下のセクションで一般的な原因と解決策を示します。
原因 1:指定されたパラメータ値がシナリオに適していません。 ApsaraDB for ClickHouse では、複数のバッチでデータを書き込むことをお勧めします。各バッチに大量のデータが含まれており、少数の同時データ書き込みタスクが同時に実行されていることを確認してください。ほとんどの場合、データのバッチには数万行、あるいは数十万行が含まれる可能性があります。これは、単一行のサイズによって異なります。ほとんどの場合、行の推定サイズは 100 バイトです。行サイズを見積もり、行サイズに基づいて行数を計算する必要があります。
解決策:同時書き込み要求の最大数を 10 に設定します。パラメータの設定を変更して、再試行できます。
原因 2:DataWorks で作成された排他的リソースグループでは、ECS インスタンスの仕様が低くなっています。排他的リソースグループでは、CPU コアまたはメモリの仕様が低いと、要求の同時実行性またはアウトバウンド帯域幅に制限が課される可能性があります。大きなバッチサイズを指定したがメモリ容量が不足している場合、DataWorks Java プロセスでガベージコレクションが発生する可能性があります。
解決策:DataWorks の出力ログに基づいて ECS インスタンスの仕様を確認します。
原因 3:データソースで読み取り操作を実行するのに長い時間がかかります。
解決策:DataWorks の出力ログで totalWaitReaderTime と totalWaitWriterTime を検索します。 totalWaitReaderTime の値が totalWaitWriterTime の値よりもはるかに大きい場合、書き込み操作に必要な時間よりも読み取り操作に必要な時間が長くなります。
原因 4:パブリックエンドポイントが使用されています。パブリックエンドポイントは限られた帯域幅を提供し、高パフォーマンスのデータのインポートまたはエクスポートを保証できません。
解決策:パブリックエンドポイントを VPC エンドポイントに置き換えます。
原因 5:データソースにダーティデータが含まれています。通常の場合、データはバッチで書き込まれます。データソースからダーティデータが読み取られると、書き込まれているデータのバッチが失敗し、データの行が毎回書き込まれます。さらに、多数のデータパートが生成されます。これにより、書き込み操作が遅くなります。
次の方法を使用して、ダーティデータが書き込まれているかどうかを確認できます。
データをクエリし、返されたエラーメッセージを確認します。メッセージに
"Cannot parse"
が含まれている場合は、ダーティデータが書き込まれています。次のサンプルコードを実行できます。
SELECT written_rows, written_bytes, query_duration_ms, event_time, exception FROM system.query_log WHERE event_time BETWEEN '2021-11-22 22:00:00' AND '2021-11-22 23:00:00' AND lowerUTF8(query) LIKE '%insert into <table_name>%' and type != 'QueryStart' and exception_code != 0 ORDER BY event_time DESC LIMIT 30;
データのバッチが書き込まれた後に行数を確認します。行数が 1 の場合は、ダーティデータが書き込まれています。
次のサンプルコードを実行できます。
SELECT written_rows, written_bytes, query_duration_ms, event_time FROM system.query_log WHERE event_time BETWEEN '2021-11-22 22:00:00' AND '2021-11-22 23:00:00' AND lowerUTF8(query) LIKE '%insert into <table_name>%' and type != 'QueryStart' ORDER BY event_time DESC LIMIT 30;
解決策:データソースのダーティデータを削除または変更します。
テーブル間でデータが同期された後、Hive インスタンスのテーブルと ApsaraDB for ClickHouse クラスターの外部テーブルの間で行数が一致しないのはなぜですか?
テーブル間で行数が一致しない原因を特定するには、次の手順を実行します。
query_log という名前のシステムテーブルに基づいて、データ同期中にエラーが報告されているかどうかを確認します。エラーが報告された場合、データ損失が発生する可能性があります。
使用しているテーブルエンジンで重複を削除できるかどうかを確認します。 ReplacingMergeTree を使用している場合、ApsaraDB for ClickHouse クラスターの外部テーブルの行数は、Hive インスタンスのテーブルよりも少ない場合があります。
Hive インスタンスに保存されているテーブルの行数が正しいかどうかを確認します。
テーブル間でデータが同期された後、Kafka インスタンスのテーブルと ApsaraDB for ClickHouse クラスターの外部テーブルの間で行数が一致しないのはなぜですか?
テーブル間で行数が一致しない原因を特定するには、次の手順を実行します。
query_log という名前のシステムテーブルに基づいて、データ同期中にエラーが報告されているかどうかを確認します。エラーが報告された場合、データ損失が発生する可能性があります。
使用しているテーブルエンジンで重複を削除できるかどうかを確認します。 ReplacingMergeTree を使用している場合、ApsaraDB for ClickHouse クラスターの外部テーブルの行数は、Kafka インスタンスのテーブルよりも少ない場合があります。
外部テーブルに kafka_skip_broken_messages パラメータが設定されているかどうかを確認します。このパラメータが設定されている場合、ApsaraDB for ClickHouse は解析に失敗した Kafka メッセージをスキップする可能性があります。その結果、ApsaraDB for ClickHouse クラスターの外部テーブルの行数は、Kafka インスタンスのテーブルよりも少ない場合があります。
Spark または Flink を使用して ApsaraDB for ClickHouse クラスターにデータをインポートするにはどうすればよいですか?
Spark を使用して ApsaraDB for ClickHouse クラスターにデータをインポートする方法の詳細については、Spark プログラムを使用してデータをインポートするを参照してください。
Flink を使用して ApsaraDB for ClickHouse クラスターにデータをインポートする方法の詳細については、SQL 文を使用して Flink データを ApsaraDB for ClickHouse クラスターに書き込むを参照してください。
セルフマネージド ClickClickHouse データベースから ApsaraDB for ClickHouse クラスターにデータを移行するにはどうすればよいですか?
この問題を解決するには、次の操作を実行します。
clickhouse-client を使用して、ファイルをエクスポートすることによりデータを移行します。詳細については、セルフマネージド ClickHouse クラスターから ApsaraDB for ClickHouse クラスターにデータを移行するを参照してください。
次の文を実行して、remote 関数を使用してデータを移行します。
INSERT INTO <宛先テーブル> SELECT * FROM remote('<接続文字列>', '<データベース>', '<テーブル>', '<ユーザー名>', '<パスワード>');
MaterializeMySQL エンジンを使用して MySQL データを同期するときに、「The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires"
エラーが報告されるのはなぜですか?
一般的な原因:MaterializeMySQL エンジンが長時間データの同期を停止しました。その結果、MySQL バイナリログの有効期限が切れ、システムがログをクリアしました。
解決策:エラーを報告したデータベースを削除し、ApsaraDB for ClickHouse で MaterializeMySQL エンジンを使用するデータベースを作成します。
MaterializeMySQL エンジンを使用して MySQL データを同期するときに、テーブルのデータ同期が停止するのはなぜですか? system.materialize_mysql システムテーブルの sync_failed_tables
フィールドが null でないのはなぜですか?
一般的な原因:同期中に実行された MySQL DDL 文が ApsaraDB for ClickHouse でサポートされていません。
解決策:次の手順を実行して、MySQL データの別の同期を実行します。
データ同期が停止したテーブルを削除します。
DROP TABLE <テーブル名> ON cluster default;
説明table_name
パラメータは、データ同期が停止したテーブルの名前を指定します。データ同期が停止したテーブルが分散テーブルの場合、ローカルテーブルと分散テーブルを削除する必要があります。データ同期を再起動します。
ALTER database <データベース名> ON cluster default MODIFY SETTING skip_unsupported_tables = 1;
説明<database_name>
パラメータは、ApsaraDB for ClickHouse で MaterializeMySQL エンジンを使用するデータベースの名前を指定します。
「Too many partitions for single INSERT block (more than 100)」というエラーメッセージが表示された場合はどうすればよいですか?
一般的な原因:単一の INSERT 操作で指定された単一の挿入ブロック内のパーティションの数が、max_partitions_per_insert_block の値を超えています。 max_partitions_per_insert_block のデフォルト値は 100 です。ApsaraDB for ClickHouse は、書き込み操作ごとにデータパートを生成します。パーティションには、1 つ以上のデータパートが含まれる場合があります。単一の INSERT 操作で過度に多数のパーティションが挿入されると、ApsaraDB for ClickHouse に多数のデータパートが生成され、マージ操作とクエリ操作に大きな負担がかかる可能性があります。多数のデータパートが生成されないようにするために、ApsaraDB for ClickHouse は特定の制限を課しています。
解決策:次の操作を実行して、パーティションの数または max_partitions_per_insert_block の値を調整します。
テーブルスキーマとパーティションモードを調整するか、一度に挿入されるパーティションの数が上限を超えないようにします。
一度に挿入されるパーティションの数が上限を超えないようにするには、次のいずれかの文を実行して、データ量に基づいて max_partitions_per_insert_block の値を変更し、一度に挿入できるパーティションの数の上限を引き上げます。
シングルノードクラスター
SET GLOBAL max_partitions_per_insert_block = XXX;
マルチノードクラスター
SET GLOBAL ON cluster DEFAULT max_partitions_per_insert_block = XXX;
説明ClickHouse では、max_partitions_per_insert_block の推奨デフォルト値は 100 です。max_partitions_per_insert_block を過度に大きい値に設定しないでください。そうしないと、パフォーマンスに影響を与える可能性があります。バッチでデータをインポートした後、max_partitions_per_insert_block の値をデフォルト値に変更できます。
INSERT INTO SELECT 文を実行した後、メモリ使用量がしきい値を超えたためにエラーが発生した場合はどうすればよいですか?
この問題については、以下のセクションで一般的な原因と解決策を示します。
原因 1:メモリ使用量が多い。
解決策:max_insert_threads パラメータの設定を変更して、メモリ使用量を削減します。
原因 2:
INSERT INTO SELECT
文を実行して、ある ApsaraDB for ClickHouse クラスターから別のクラスターにデータをインポートしました。解決策:ファイルを宛先クラスターにインポートすることにより、データを移行します。詳細については、セルフマネージド ClickHouse クラスターから ApsaraDB for ClickHouse クラスターにデータを移行するを参照してください。
CPU 使用率とメモリ使用量をどのようにクエリしますか?
system.query_log テーブルで CPU 使用率とメモリ使用量のログを表示できます。このテーブルには、各クエリの CPU 使用率とメモリ使用量に関する統計が含まれています。詳細については、system.query_log を参照してください。
クエリの実行時にシステムのメモリ使用量がしきい値を超えた場合はどうすればよいですか?
ApsaraDB for ClickHouse サーバーは、各クエリ スレッドにメモリ トラッカーを提供します。各クエリのすべてのスレッドのメモリ トラッカーは、メモリ使用量を「クエリ用のメモリ トラッカー」という名前のメモリ トラッカーに報告します。次に、「クエリ用のメモリ トラッカー」は、取得した情報を上位層のメモリ トラッカー(「合計用のメモリ トラッカー」という名前)に報告します。問題を解決するには、シナリオに基づいて次の操作を実行します。
"Memory limit (for query)"
メッセージが返された場合、クラスターメモリの 70% 以上がクエリによって消費されています。メモリ仕様をスケールアップすることをお勧めします。"Memory limit (for total)"
メッセージが返された場合、クラスターメモリの 90% 以上が消費されています。同時クエリの数を減らすことをお勧めします。この操作を実行した後も問題が解決しない場合は、バックグラウンドでの非同期タスクによって大量のメモリが消費されている可能性があります。ほとんどの場合、データの書き込み後に同じプライマリキー値を含むレコードを重複排除すると、大量のメモリが消費されます。メモリ仕様をスケールアップすることをお勧めします。
同時クエリの数が上限を超えた場合はどうすればよいですか?
デフォルトでは、ApsaraDB for ClickHouse サーバーでの同時クエリの最大数は 100 です。ApsaraDB for ClickHouse コンソールで値を変更できます。同時クエリの最大数を変更するには、次の手順を実行します。
ApsaraDB for ClickHouse コンソール にログインします。
[クラスター] ページで、[コミュニティ互換版のクラスター] タブをクリックし、管理するクラスターの ID をクリックします。
左側のナビゲーションウィンドウで、[パラメータ管理] をクリックします。
[設定] タブで、max_concurrent_queries パラメータを見つけ、[パラメータ値] 列の編集アイコンをクリックします。
表示されるダイアログボックスで、値を入力し、[OK] をクリックします。
[パラメータを送信] をクリックします。
[OK] をクリックします。
テーブルにデータが書き込まれていないときに、同じ文を実行してテーブルからデータをクエリするたびに異なるクエリ結果が返される場合はどうすればよいですか?
SELECT COUNT(*)
文に対して返される数は、データレコードの総数の約半分であるか、同じ文に対して異なるクエリ結果が返される場合があります。
この問題を解決するには、次の操作を実行します。
ApsaraDB for ClickHouse クラスターがマルチノードクラスターかどうかを確認します。 ApsaraDB for ClickHouse クラスターに複数のノードがある場合は、ノードに分散テーブルを作成する必要があります。次に、分散テーブルにデータを書き込み、分散テーブルからデータをクエリできます。このようにして、分散テーブルからデータをクエリする文を実行するたびに、同じクエリ結果が返されます。分散テーブルを使用しない場合、文を実行するたびに異なるシャードのデータがクエリされる可能性があります。その結果、同じ文に対して異なるクエリ結果が返されます。分散テーブルを作成する方法の詳細については、テーブルを作成するを参照してください。
ApsaraDB for ClickHouse クラスターがダブルレプリカ版かどうかを確認します。ダブルレプリカ版の ApsaraDB for ClickHouse クラスターを使用する場合は、ノードにレプリケートされたテーブルを作成します。これにより、データがノードのレプリカ間で一貫していることが保証されます。レプリケートされたテーブルを作成しない場合、クエリ結果は、クエリされたレプリカに基づいて異なる場合があります。レプリケートされたテーブルを作成する方法の詳細については、テーブルエンジンを参照してください。
作成したテーブルが見つからないのはなぜですか?また、同じ文を実行するたびに異なる数のレコードが返される場合はどうすればよいですか?
この問題については、以下のセクションで一般的な原因と解決策を示します。
原因 1:無効な DDL 文を使用して、ApsaraDB for ClickHouse クラスターにテーブルを作成しています。分散 ApsaraDB for ClickHouse クラスターにテーブルを作成するには、CREATE TABLE 文に ON CLUSTER default 句を含める必要があります。
CREATE TABLE
文のみを実行すると、クライアントが接続されているサーバーにのみテーブルが作成されます。この場合、このテーブルからのみデータをクエリできます。クライアントを別のサーバーに接続すると、テーブルが見つかりません。解決策:
テーブルを作成するときは、
CREATE TABLE <テーブル名> ON CLUSTER default
文を実行します。ON CLUSTER default
句により、文はデフォルトクラスターのすべてのノードで実行されます。次のサンプル文は例を示しています。CREATE TABLE test ON cluster default (a UInt64) Engine = MergeTree() ORDER BY tuple();
test という名前のテーブルに分散テーブルエンジンを作成します。次の文を実行して、test_dis という名前の分散テーブルを作成できます。
CREATE TABLE test_dis ON cluster default AS test Engine = Distributed(default, default, test, cityHash64(a));
原因 2:ReplicatedMergeTree テーブルが正しく構成されていません。 ReplicatedMergeTree テーブルエンジンは、MergeTree テーブルエンジンに基づいて開発されており、レプリケートされたテーブル間でデータを同期するために使用できます。シングルレプリカ版の ApsaraDB for ClickHouse クラスターでは、MergeTree テーブルエンジンのみを作成できます。ダブルレプリカ版の ApsaraDB for ClickHouse クラスターでは、ReplicatedMergeTree テーブルエンジンのみを作成できます。
解決策:ダブルレプリカ版の ApsaraDB for ClickHouse クラスターにテーブルを作成するときは、
ReplicatedMergeTree('/clickhouse/tables/{database}/{table}/{shard}', '{replica}')
またはReplicatedMergeTree()
を使用して、ReplicatedMergeTree テーブルエンジンを構成します。ReplicatedMergeTree('/clickhouse/tables/{database}/{table}/{shard}', '{replica}')
は固定構成であり、変更する必要はありません。
テーブルからクエリされたタイムスタンプデータが、テーブルに書き込まれたタイムスタンプデータと異なる場合はどうすればよいですか?
SELECT timezone()
文を実行して、クラスターのタイムゾーンをクエリします。クラスターがローカルタイムゾーンを使用していない場合は、timezone パラメータをローカルタイムゾーンに設定します。パラメータの値を変更する方法の詳細については、同時クエリの数が上限を超えた場合はどうすればよいですか? を参照してください。
テーブルからデータをクエリするときに、作成したテーブルが見つからない場合はどうすればよいですか?
一般的な原因:DDL 文が 1 つのノードでのみ実行されます。
解決策:テーブルを作成するために実行した DDL 文に on cluster
キーワードが含まれているかどうかを確認します。詳細については、CREATE TABLE を参照してください。
Kafka 外部テーブルのデータを格納するローカルテーブルのデータ量が、外部テーブルからデータを書き込んだ後も変更されないのはなぜですか?
原因を特定するには、SELECT * FROM
文を実行して、外部テーブルからデータをクエリします。エラーメッセージが報告された場合は、エラーメッセージに基づいて原因を特定できます。ほとんどの場合、エラーメッセージはデータの解析に失敗したことを示しています。クエリ結果が返され、エラーが報告されない場合は、ローカルテーブルのフィールドと外部テーブルのフィールドが一致するかどうかを確認します。ローカルテーブルにデータを書き込むことができない場合、ローカルテーブルのフィールドと外部テーブルのフィールドが一致しません。次のサンプル文を実行できます。
insert into <ローカルテーブル> as select * from <Kafka インスタンスのテーブルに接続されている外部テーブル>;
ApsaraDB for ClickHouse クライアントに表示される時間とタイムゾーンが、ApsaraDB for ClickHouse サーバーに表示される時間とタイムゾーンと異なるのはなぜですか?
クライアントに use_client_time_zone
パラメータが設定されており、パラメータ値がローカルタイムゾーンに設定されていません。
ApsaraDB for ClickHouse クラスターのテーブルに書き込んだデータが見つからないのはなぜですか?
問題の説明:テーブルに書き込まれたデータをクエリできません。
原因:この問題は、次の要因によって発生する可能性があります。
ローカルテーブルとそれに関連付けられた分散テーブルで異なるスキーマが使用されています。
分散テーブルにデータを書き込んだ後、データを格納する一時ファイルが、必要なノードに完全に配布されていません。
ダブルレプリカ版クラスターの 1 つのレプリカにデータを書き込んだ後、データが他のレプリカに完全に同期されていません。
考えられる原因と解決策
テーブル間で異なるスキーマ
system.distribution_queue
という名前のシステムテーブルをクエリして、分散テーブルにデータを書き込むときにエラーが発生するかどうかを確認できます。
一時ファイル内のデータが完全に配布されていない
原因分析:ドメイン名を使用してマルチノード ApsaraDB for ClickHouse クラスターのデータベースに接続し、INSERT 文を実行してデータベースの分散テーブルにデータを書き込むと、INSERT 要求は、クラスターに接続されている CLB インスタンスによって、クラスター内のランダムなノードに転送されます。ノードが INSERT 要求を受信した後、ノードはデータの一部を保存のためにノードのディスクに直接書き込みます。データの残りの部分は一時ファイルとしてノードに保存され、その後、クラスター内の他のノードに非同期に配布されます。配布が完了する前に、配布されていないデータをクエリできない場合があります。
解決策:INSERT 文の実行直後にクエリ結果の精度に対する要件が高い場合は、INSERT 文に settings insert_distributed_sync = 1
設定を追加できます。このようにして、INSERT 操作は同期待機モードに入り、成功応答を返す前に、データが必要なすべてのノードに完全に配布されるのを待ちます。次の例は、設定を構成する方法を示しています。
設定を構成した後、INSERT 操作はデータが完全に配布されるのを待つため、INSERT 文の実行時間が長くなる可能性があります。書き込みパフォーマンスに基づいて、設定を構成するかどうかを決定できます。
この設定はクラスター全体に影響します。注意して進めてください。テストのために単一のクエリに設定を追加することをお勧めします。クエリ結果が正しいことを確認し、ビジネス要件に基づいて設定をクラスターに適用するかどうかを決定します。
単一のクエリにのみ設定を適用する場合は、クエリ文に設定を追加します。サンプル文:
INSERT INTO <テーブル名> values() settings insert_distributed_sync = 1;
クラスターに設定を適用する場合は、user.xml ファイルを構成する必要があります。詳細については、user.xml ファイルのパラメータを構成するを参照してください。
データが完全に同期されていない
原因分析:INSERT 文を実行して、ダブルレプリカ版を使用する ApsaraDB for ClickHouse クラスターにデータを書き込むと、2 つのレプリカのうちの 1 つだけが INSERT 文を実行し、他のレプリカはデータを非同期に同期します。したがって、INSERT 文を実行した後、データが一方のレプリカからもう一方のレプリカに完全に同期されておらず、同期が完了していないレプリカによって SELECT クエリが実行されると、クエリが予期したデータを返さない場合があります。
解決策:INSERT 文の実行直後にクエリ結果の精度に対する要件が高い場合は、INSERT 文に settings insert_quorum = 2
設定を追加できます。このようにして、INSERT 操作は同期待機モードに入り、成功応答を返す前に、データがレプリカに完全に同期されるのを待ちます。
設定を構成するには、次の項目に注意してください。
設定を構成した後、INSERT 操作はデータがレプリカ間で完全に同期されるのを待つため、INSERT 文の実行時間が長くなる可能性があります。書き込みパフォーマンスに基づいて、設定を構成するかどうかを決定できます。
設定を構成した後、INSERT 操作は成功応答を返す前に、データがレプリカ間で完全に同期されるのを待ちます。したがって、レプリカが使用できなくなると、insert_quorum = 2 設定で構成されたすべての書き込み要求が失敗します。これは、ダブルレプリカ版の信頼性保証と競合します。
この設定はクラスター全体に影響します。注意して進めてください。テストのために単一のクエリに設定を追加することをお勧めします。クエリ結果が正しいことを確認し、ビジネス要件に基づいて設定をクラスターに適用するかどうかを決定します。
単一のクエリにのみ設定を適用する場合は、クエリ文に設定を追加します。サンプル文:
INSERT INTO <テーブル名> values() settings insert_quorum = 2;
クラスターに設定を適用する場合は、user.xml ファイルを構成する必要があります。詳細については、user.xml ファイルのパラメータを構成するを参照してください。
OPTIMIZE 文の実行に長い時間がかかるのはなぜですか?
OPTIMIZE 文の実行は、多数の CPU リソースを消費し、ディスクスループットを増加させます。 CPU 使用率とディスクスループットが高いと、クエリのパフォーマンスが低下し、OPTIMIZE 文の実行に必要な時間が長くなります。負荷の高いノードで OPTIMIZE 文を実行すると、この文の実行に長い時間がかかります。このバージョンでは、解決策はありません。
OPTIMIZE 文を実行した後、同じプライマリキー値を含むレコードが重複排除されないのはなぜですか?
OPTIMIZE 文を実行する前に、次の条件が満たされていることを確認してください。これにより、同じプライマリキー値を含むレコードを重複排除するために使用されるロジックが有効であることが保証されます。
データを格納するテーブルを定義するときは、PARTITION BY 句で指定されたフィールドを
order by
句で指定されたフィールドに含める必要があります。異なるパーティションの 2 つのレコードに同じプライマリキー値が含まれている場合、レコードは重複排除されません。分散テーブルを定義するときは、ハッシュするフィールドを
order by
句で指定されたフィールドに含める必要があります。異なるノードの 2 つのレコードに同じプライマリキー値が含まれている場合、レコードは重複排除されません。
次の表に、一般的な OPTIMIZE 文を示します。
文 | 説明 |
| MergeTree テーブルの特定のデータパートで、同じプライマリキー値を含むレコードを重複排除しようとします。システムは、同じプライマリキー値を含むレコードを重複排除せずに結果を返す場合があります。この文を実行しても、テーブル内の同じプライマリキー値を含むすべてのレコードが重複排除されるわけではありません。ほとんどの場合、この文は使用されません。 |
| 指定されたパーティションのすべてのデータパートで、同じプライマリキー値を含むレコードを重複排除します。システムは、同じプライマリキー値を含むレコードを重複排除せずに結果を返す場合があります。この文が実行された後、指定されたパーティションのすべてのデータパートで、同じプライマリキー値を含むレコードが重複排除されます。重複排除プロセスが完了すると、パーティション内のすべてのレコードが同じデータパートに保存されます。この文がデフォルトの単一パーティションを含むテーブルで実行されると、単一パーティション内の同じプライマリキー値を含むレコードが重複排除されます。この文の実行中にデータが書き込まれた場合、書き込まれたデータは重複排除されません。指定したパーティションにデータパートが 1 つだけ含まれている場合、この文は実行されません。 説明 テーブルにパーティションキーが含まれていない場合、テーブルのデフォルトパーティションは partition tuple() です。 |
| テーブルの各パーティションで、同じプライマリキー値を含むレコードを重複排除します。この文は、1 つ以上のデータパートを含むテーブルパーティションで実行できます。この文を実行して、指定された有効期限 (TTL) 値に基づいて期限切れのデータレコードを削除できます。3 つの文の中で、OPTIMIZE TABLE test FINAL; 文の実行は、最も多くのリソースを消費します。 OPTIMIZE TABLE test FINAL; 文が実行された後、システムは、同じプライマリキー値を含むレコードを重複排除せずに結果を返す場合があります。 |
上記のいずれかの文を実行する場合、optimize_throw_if_noop
パラメータを設定できます。このパラメータは、文が同じプライマリキー値を含むレコードを重複排除しない場合に例外エラーを返すかどうかを指定します。
OPTIMIZE 文を実行した後、TTL 設定が有効にならないのはなぜですか?
この問題については、以下のセクションで一般的な原因と解決策を示します。
原因 1:同じプライマリキー値を含むレコードが重複排除されているときに、指定された TTL 値に基づくエビクションが発生します。データパート内の同じプライマリキー値を含むレコードが長時間重複排除されない場合、期限切れのレコードを削除できません。
解決策:
FINAL
句またはPARTITION
句を使用して OPTIMIZE TABLE 文を実行することにより、同じプライマリキー値を含むレコードを重複排除するタスクをトリガーできます。テーブルを作成するときに、merge_with_ttl_timeout パラメーターと ttl_only_drop_parts パラメーターを設定して、期限切れのデータを含むデータパーツ内の同じプライマリキー値を含むレコードの重複排除の頻度を高めることができます。
原因 2:テーブルの TTL が指定または変更されています。その結果、既存のデータパートの TTL 情報が不完全または不正確になり、期限切れのデータが削除されない場合があります。
解決策:
ALTER TABLE materialize ttl
文を実行して、TTL を再構成できます。OPTIMIZE TABLE test PARTITION tuple();
文を実行して、TTL を更新できます。
OPTIMIZE 文を実行した後、データが更新または削除されないのはなぜですか?
ApsaraDB for ClickHouse は、非同期でデータを更新または削除します。データの更新または削除の進行に介入するための対策はありません。 system.mutations テーブルで各操作の進行状況を表示できます。
ApsaraDB for ClickHouse で DDL 文を実行して列を作成、削除、または変更するにはどうすればよいですか?
ローカルテーブルの場合、DDL 文を実行して列を作成、削除、または変更できます。分散テーブルの場合、次のいずれかの方法を使用して、さまざまなシナリオで列を作成、削除、または変更できます。
分散テーブルにデータが書き込まれていない場合は、ローカルテーブルで列を作成、削除、または変更してから、分散テーブルで列を作成、削除、または変更できます。
分散テーブルにデータが書き込まれている場合は、次のいずれかの手順を使用してさまざまな操作を実行できます。
タイプ
操作
NULL 値が許可された列を作成します。
ローカルテーブルで列を作成または変更します。
分散テーブルで列を作成または変更します。
データ型の変換がサポートされている場合は、列のデータ型を変更します。
NULL 値が許可された列を削除します。
分散テーブルで列を作成または変更します。
ローカルテーブルで列を作成または変更します。
NULL 値が許可されない列を作成します。
データの書き込みを停止します。
SYSTEM FLUSH DISTRIBUTED 文を実行します。
ローカルテーブルで列を作成または変更します。
分散テーブルで列を作成または変更します。
分散テーブルへのデータの書き込みを再開します。
NULL 値が許可されない列を削除します。
列の名前を変更します。
DDL 文の実行中にシステムが応答を停止するのはなぜですか?また、DDL 文の実行に長い時間がかかるのはなぜですか?
一般的な原因:グローバル DDL 文を実行すると、文はシリアルモードで実行されます。複雑なクエリにより、デッドロックが発生する可能性があります。
この問題を解決するには、次の操作を実行します。
すべての DDL 文が実行されるまで待ちます。
ApsaraDB for ClickHouse コンソールでの DDL 文の実行を停止します。
分散方式で DDL 文を実行するときに、「longer than distributed_ddl_task_timeout (=xxx) seconds」というエラーが返される場合はどうすればよいですか?
この問題を解決するには、SET GLOBAL ON CLUSTER default distributed_ddl_task_timeout=xxx
文を実行して、デフォルトのタイムアウト期間を変更します。文の xxx を、指定するタイムアウト期間に置き換えます。タイムアウト期間は秒単位で測定されます。グローバルパラメータの設定を変更する方法の詳細については、user.xml ファイルのパラメータを構成するを参照してください。
SET GLOBAL ON CLUSTER default 文で構文エラーが発生した場合はどうすればよいですか?
この問題については、以下のセクションで一般的な原因と解決策を示します。
原因 1:ApsaraDB for ClickHouse クライアントは文の構文を解析します。ただし、
SET GLOBAL ON CLUSTER default
文は ApsaraDB for ClickHouse サーバーでのみ有効です。クライアントバージョンがサーバーバージョンと一致しない場合、SET GLOBAL ON CLUSTER default 文を実行すると、クライアントは構文エラーを報告します。解決策:
クライアントで文の構文を解析しないツールを使用します。たとえば、JDBC ドライバーで DataGrip または DBeaver を使用できます。
JDBC プログラムを作成して、SET GLOBAL ON CLUSTER default 文を実行することもできます。
原因 2:
SET GLOBAL ON CLUSTER default
文に、単一引用符 (') で囲まれていない文字列値を指定しました。解決策:SET GLOBAL ON CLUSTER default 文の文字列値を単一引用符 (') で囲みます。
推奨されるビジネスインテリジェンス (BI) ツールは何ですか?
Quick BI を使用することをお勧めします。
データクエリに推奨される統合開発環境 (IDE) はどれですか?
DataGrip または DBeaver を使用することをお勧めします。
ApsaraDB ClickHouse はベクトル検索をサポートしていますか?
ApsaraDB for ClickHouse はベクトル検索をサポートしています。詳細については、次のトピックを参照してください。
テーブルを作成するときに「ON CLUSTER is not allowed for Replicated database
」というエラーメッセージが表示された場合はどうすればよいですか?
エンタープライズ版クラスターを使用し、ON CLUSTER default
を含む文を実行してクラスターにテーブルを作成すると、ON CLUSTER is not allowed for Replicated database
というエラーメッセージが表示される場合があります。エンタープライズ版のマイナーエンジンバージョンを最新バージョンに更新することをお勧めします。特定のマイナーエンジンバージョンでこのエラーが発生する可能性があります。詳細については、マイナーエンジンバージョンの更新を参照してください。
分散テーブルで JOIN または IN サブクエリを実行するときに「Double-distributed IN/JOIN subqueries is denied (distributed_product_mode='deny ')
」というエラーメッセージが表示された場合はどうすればよいですか?
問題の説明:コミュニティ互換版を実行しているマルチノードクラスターで JOIN 句または IN 句を使用して複数の分散テーブルをクエリした後、次のエラーメッセージが表示される場合があります:Exception: Double-distributed IN/JOIN subqueries is denied (distributed_product_mode = 'deny').
原因分析:複数の分散テーブルで JOIN または IN サブクエリを実行すると、サブクエリの数が乗算されます。たとえば、3 ノードクラスターで JOIN または IN サブクエリを実行すると、ローカルテーブルのサブクエリの数は 9 に増加します。これにより、リソースの浪費とレイテンシの増加が発生します。したがって、システムはこのようなクエリの実行を禁止しています。
解決策の説明:IN または JOIN を GLOBAL IN または GLOBAL JOIN に置き換えます。このようにして、GLOBAL IN 句または GLOBAL JOIN 句のサブクエリは単一ノードで実行され、サブクエリ結果は一時テーブルに保存されます。次に、一時テーブルが上位クエリのために他のノードに送信されます。
IN または JOIN を GLOBAL IN または GLOBAL JOIN に置き換えることの影響:
一時テーブルはすべてのリモートサーバーに送信されるため、大きなデータセットを使用しないことをお勧めします。
remote 関数を使用して外部インスタンスからデータをクエリする場合、GLOBAL IN 句または GLOBAL JOIN 句のサブクエリは、SQL 文を実行するインスタンスで実行され、外部インスタンスでは実行されません。これにより、正しくないクエリ結果が生成される可能性があります。
たとえば、インスタンス A で次の文を実行し、remote 関数を使用して
cc-bp1wc089c****
という名前の外部インスタンスからデータをクエリします。SELECT * FROM remote('cc-bp1wc089c****.clickhouse.ads.aliyuncs.com:3306', `default`, test_tbl_distributed1, '<your_Account>', '<YOUR_PASSWORD>') WHERE id GLOBAL IN (SELECT id FROM test_tbl_distributed1);
解決策の説明で説明されている内容に基づいて、GLOBAL IN 句の
SELECT id FROM test_tbl_distributed1
文はインスタンス A で実行されてテーブル A という名前の一時テーブルが生成され、次にテーブル A が上位クエリのためにcc-bp1wc089c****
インスタンスに送信されます。その結果、cc-bp1wc089c****
インスタンスで実行される最終的な文はSELECT * FROM default.test_tbl_distributed1 WHERE id IN (Table A);
です。前の例は、GLOBAL IN または GLOBAL JOIN のしくみを示しています。 IN または JOIN を GLOBAL IN または GLOBAL JOIN に置き換え、remote 関数を使用して外部インスタンスからデータをクエリした後、クエリ結果が正しくない場合があります。
前の例では、
cc-bp1wc089c****
インスタンスで実行される最終的な文はSELECT * FROM default.test_tbl_distributed1 WHERE id IN (Table A);
文であり、SELECT * FROM default.test_tbl_distributed1 WHERE id IN (SELECT id FROM test_tbl_distributed1 );
文ではありません。条件セットとして使用されるテーブル A は、cc-bp1wc089c****
インスタンスではなく、インスタンス A から生成されます。これは、条件セットが正しくないソースからのものであることを示しており、正しくないクエリ結果につながります。
解決策:
解決策 1:ビジネスコードの SQL 文を変更します。 IN または JOIN を手動で GLOBAL IN または GLOBAL JOIN に置き換えます。
変更前のサンプル文:
SELECT * FROM test_tbl_distributed WHERE id IN (SELECT id FROM test_tbl_distributed1);
変更後のサンプル文:
SELECT * FROM test_tbl_distributed WHERE id GLOBAL IN (SELECT id FROM test_tbl_distributed1);.
解決策 2:distributed_product_mode または prefer_global_in_and_join システムパラメータを変更します。システムは IN または JOIN を GLOBAL IN または GLOBAL JOIN に自動的に置き換えます。
distributed_product_mode
次の文を実行して、distributed_product_mode パラメータを global に設定します。次に、システムは IN または JOIN を GLOBAL IN または GLOBAL JOIN に自動的に置き換えます。
SET GLOBAL ON cluster default distributed_product_mode='global';
使用上の注意
パラメータの説明:このパラメータは、分散サブクエリを管理するために使用されます。これは ClickHouse の重要な設定です。
有効な値:
disable (デフォルト):IN および JOIN サブクエリを無効にします。パラメータを disable に設定すると、IN または JOIN サブクエリを実行すると
"Double-distributed IN/JOIN subqueries is denied"
例外がスローされます。local:サブクエリのデータベースとテーブルを、クエリするサーバー (シャード) のローカルテーブルに置き換え、通常の IN または JOIN を保持します。
global:IN または JOIN を GLOBAL IN または GLOBAL JOIN に置き換えます。
allow:IN および JOIN サブクエリを許可します。
シナリオ:このパラメータは、JOIN または IN-JOIN サブクエリで複数の分散テーブルを使用するクエリに適しています。
prefer_global_in_and_join
prefer_global_in_and_join
次の文を使用して、prefer_global_in_and_join パラメータを 1 に設定します。このようにして、システムは IN または JOIN を GLOBAL IN または GLOBAL JOIN に自動的に置き換えます。
SET GLOBAL ON cluster default prefer_global_in_and_join = 1;
使用上の注意
パラメータの説明:このパラメータは、IN 演算子と JOIN 演算子を管理するために使用されます。これは ClickHouse の重要な設定です。
有効な値:
0 (デフォルト):IN および JOIN サブクエリを無効にします。パラメータを 0 に設定すると、IN または JOIN サブクエリを実行すると
"Double-distributed IN/JOIN subqueries is denied"
例外がスローされます。1:IN および JOIN サブクエリを有効にし、IN または JOIN を GLOBAL IN または GLOBAL JOIN に置き換えます。
シナリオ:このパラメータは、JOIN または IN-JOIN サブクエリで複数の分散テーブルを使用するクエリに適しています。
各テーブルで使用されているディスク容量を確認するにはどうすればよいですか?
各テーブルで使用されているディスク容量を確認するには、次のサンプル文を実行できます。
SELECT table, formatReadableSize(sum(bytes)) as size, min(min_date) as min_date, max(max_date) as max_date FROM system.parts WHERE active GROUP BY table;
コールドデータのサイズをクエリするにはどうすればよいですか?
コールドデータのサイズをクエリするには、次のサンプル文を実行できます。
SELECT * FROM system.disks;
コールドストレージにあるデータを確認するにはどうすればよいですか?
コールドストレージにあるデータを確認するには、次のサンプル文を実行できます。
SELECT * FROM system.parts WHERE disk_name = 'cold_disk';
パーティション内のデータをコールドストレージにダンプするにはどうすればよいですか?
パーティション内のデータをコールドストレージにダンプするには、次のサンプル文を実行できます。
ALTER TABLE table_name MOVE PARTITION partition_expr TO DISK 'cold_disk';
特定の期間のクラスタ モニタリング データがないのはなぜですか?
この問題は、次のいずれかの原因で発生します。
データをクエリすると、OOM エラーが報告されます。
クラスタの構成が変更されています。これにより、クラスタが再起動します。
クラスタの仕様がスケールアップまたはスケールダウンされています。これにより、クラスタが再起動します。
V20.8 以降の ApsaraDB for ClickHouse クラスターは、データ移行を必要としないシームレスなアップデートをサポートしていますか?
ApsaraDB for ClickHouse クラスターがシームレスなスペックアップをサポートするかどうかは、クラスターの作成時間によって異なります。 2021 年 12 月 1 日以降に購入したクラスターの場合は、データを移行することなく、主要エンジンバージョンをインプレースでスペックアップできます。 2021 年 12 月 1 日より前に購入したクラスターの場合は、主要エンジンバージョンをスペックアップする前にデータを移行する必要があります。 主要エンジンバージョンのスペックアップ方法の詳細については、「主要エンジンバージョンをスペックアップする」をご参照ください。
一般的なシステムテーブルとは
次の表に、一般的なシステムテーブルを示します。
パラメーター | 説明 |
system.processes | 実行中の SQL 文が含まれています。 |
system.query_log | 実行された SQL 文が含まれています。 |
system.merges | クラスタで実行されたマージ操作に関する情報が含まれています。 |
system.mutations | クラスタのミューテーションに関する情報が含まれています。 |
システムパラメータの設定を変更するにはどうすればよいですか? システムパラメータの設定を変更した後、クラスタを再起動する必要がありますか? クラスタを再起動すると、クラスタにどのような影響がありますか?
config.xml ファイルには、システム設定に関する情報が含まれています。 ファイル内のシステムパラメータの設定を変更できます。 システムパラメータの設定を変更するには、次の手順を実行します。
ApsaraDB for ClickHouse コンソール にログオンします。
[クラスタ] ページで、[community 互換エディションのクラスタ] タブをクリックし、管理するクラスタの ID をクリックします。
左側のナビゲーションウィンドウで、[パラメータ管理] をクリックします。
[設定] タブで、max_concurrent_queries パラメータを見つけ、[パラメータ値] 列の編集アイコンをクリックします。
表示されるダイアログボックスで、値を入力し、[OK] をクリックします。
[パラメータの送信] をクリックします。
[OK] をクリックします。
[OK] をクリックすると、ApsaraDB for ClickHouse サーバーが自動的に再起動されます。 再起動により、約 1 分間続く一時的な接続が発生します。
ユーザーパラメータの設定を変更するにはどうすればよいですか?
users.xml ファイルには、ユーザー設定に関する情報が含まれています。このファイルでユーザーパラメータの設定を変更できます。ユーザーパラメータの設定を変更するには、次のサンプル文を実行します。
SET global ON cluster default ${key}=${value};
特に指定がない限り、新しいパラメータ値は、文が実行された直後に有効になります。
リソースクォータを変更するにはどうすればよいですか?
SETTINGS 文を使用して、リソースクォータを変更できます。リソースクォータを変更するには、次のサンプル文を実行します。
settings max_memory_usage = XXX;
ノード間で CPU 使用率とメモリ使用量が大きく異なるのはなぜですか?
複数ノードのデュアルレプリカ版クラスターまたはシングルレプリカ版クラスターを使用している場合、大量の書き込み操作が実行されるノードの CPU 使用率とメモリ使用量は、他のノードよりも高くなります。 データが他のノードに同期されると、CPU 使用率とメモリ使用量は、すべてのノードで徐々にバランスの取れた状態になります。
システムの詳細ログを表示する方法
問題の説明:
ユーザーは、エラーのトラブルシューティングや潜在的な問題の特定のために、システムの詳細ログを表示したいと考えています。
解決策:
クラスタの text_log.level パラメーターの値を表示します。値を表示するには、次の操作を実行します。
text_log.level パラメーターが空のままの場合、text_log は無効になっています。 text_log を有効にするには、text_log.level パラメーターを設定する必要があります。
text_log.level パラメーターが指定されている場合は、text_log レベルがビジネス要件を満たしているかどうかを確認します。 text_log レベルがビジネス要件を満たしていない場合は、text_log.level パラメーターを変更します。
text_log.level パラメーターの表示および変更方法の詳細については、「config.xml ファイルのパラメーターを設定する」をご参照ください。
ターゲットデータベースにログオンします。詳細については、「データベース接続」をご参照ください。
次の文を実行して、分析結果を表示します。
SELECT * FROM system.text_log;
宛先クラスターとデータソース間の接続の確立に失敗した場合はどうすればよいですか?
宛先クラスターとデータソースが同じリージョンにデプロイされ、同じ VPC を使用している場合は、宛先クラスターの IP アドレスがデータソースのホワイトリストに追加されているかどうか、およびデータソースの IP アドレスが宛先クラスターのホワイトリストに追加されているかどうかを確認します。 IP アドレスがホワイトリストに追加されていない場合は、ホワイトリストを設定します。
ApsaraDB for ClickHouse クラスターのホワイトリストを設定する方法の詳細については、「ホワイトリストを設定する」をご参照ください。
データソースのホワイトリストを設定する方法の詳細については、対応するサービスドキュメントをご参照ください。
それ以外の場合は、適切なネットワークソリューションを選択してネットワーク接続の問題を解決し、ホワイトリストに IP アドレスを追加します。
シナリオ | ソリューション |
Alibaba Cloud 上のデータセンターとサービス間の通信 | |
リージョンおよび Alibaba Cloud アカウントをまたがる VPC 間通信 | |
同じリージョン内の異なる VPC 間の通信 | |
リージョンおよび Alibaba Cloud アカウントをまたがる VPC 間通信 | CEN と Basic Edition 転送ルータを使用して、異なるリージョンおよび Alibaba Cloud アカウントの VPC を接続する |
ApsaraDB for ClickHouse は、Community 互換エディション クラスターから Enterprise Edition クラスターへのデータ移行をサポートしていますか?
ApsaraDB for ClickHouse は、Community 互換エディション クラスターから Enterprise Edition クラスターへのデータ移行をサポートしています。
リモート関数またはデータのインポートとエクスポートを使用して、2 つのエディション間でデータを移行できます。詳細については、「セルフマネージド ClickHouse クラスターから ApsaraDB for ClickHouse クラスターにデータを移行する」をご参照ください。
元のクラスターでエラーなく実行された SQL 文が V24.5 以降の Enterprise Edition クラスターでエラーを報告した場合、どうすればよいですか?
デフォルトでは、Enterprise Edition V24.5 以降を実行する新しい ApsaraDB for ClickHouse クラスターのクエリエンジンは、新しいアナライザを使用します。新しいアナライザはクエリのパフォーマンスを向上させましたが、以前のバージョンの Enterprise Edition で使用されていた特定の SQL 文と互換性がない場合があります。これにより、解析エラーが発生する可能性があります。このエラーが発生した場合は、次の文を実行して、新しいアナライザを古いアナライザにロールバックできます。詳細については、「Analyzer enabled by default」をご参照ください。
SET allow_experimental_analyzer = 0;
ApsaraDB for ClickHouse クラスターを一時停止するにはどうすればよいですか??
ApsaraDB for ClickHouse クラスターのうち、Community 互換 Edition を実行しているクラスターは一時停止できません。 Enterprise Edition クラスターは一時停止できます。 Enterprise Edition クラスターを一時停止するには、[クラスター] ページの [Enterprise Edition クラスター] タブに移動します。[クラスター] ページの左上隅で、クラスターを一時停止するリージョンを選択します。一時停止するクラスターを見つけ、>[アクション] 列で [一時停止] を選択します。