2016-11-14 3 views
3

クリックハウスにイベントテーブル(MergeTree)があり、同時に多くの小さなインサートを実行したいです。ただし、サーバーが過負荷になり、応答しなくなります。さらに、インサートの一部が失われます。クリックハウスエラーログには多くのレコードがあります:クリックハウスに複数の小さなインサートがあります

01:43:01.668 [ 16 ] <Error> events (Merger): Part 201 61109_20161109_240760_266738_51 intersects previous part 

このようなクエリを最適化する方法はありますか?私はいくつかの種類のイベントに対して一括挿入を使用できることを知っています。基本的には、多くのレコードで1つのインサートを実行しています。しかし、クリックやオープンなどのイベントの一部は、この方法では処理できませんでした。

もう1つの質問:clickhouseは、類似したレコードが存在しないときに存在すると判断する理由を教えてください。挿入時には、インデックスと同じフィールドを持つ類似のレコードがありますが、他のフィールドは異なります。

時から私はまた、次のエラーが表示さ:clickhouseデータベースに対してテストが実行されたときに、プロジェクトのビルド中にほとんど

Caused by: ru.yandex.clickhouse.except.ClickHouseUnknownException: ClickHouse exception, message: Connect to localhost:8123 [ip6-localhost/0:0:0:0:0:0:0:1] timed out, host: localhost, port: 8123; Connect to ip6-localhost:8123 [ip6-localhost/0:0:0:0:0:0:0:1] timed out 
    ... 36 more 

を。

答えて

3

これは、(複製されていない)MergeTreeに多数の小さな挿入物を処理する際の既知の問題です。

これはバグですので、調査して修正する必要があります。

回避策として、推奨されるように、より大きなバッチでインサートを送信する必要があります.1秒あたり約1バッチ:https://clickhouse.yandex/reference_en.html#Performance%20on%20data%20insertion

+0

イベントはオン/オフベースで生成されています。バッチでCHに挿入すると、ステージング領域を作成する必要があります。キューにはキューやその他の一時的な場所があります。この帽子は私たちがやらなければならないのでしょうか、あるいは単列を挿入するための別の推奨方法がありますか? 2番目のフォローアップの質問:文書では、「パフォーマンスを向上させるために、複数のINSERTクエリを並行して作成することができます...」と述べています。これは、それぞれが挿入する並列プロセス/スレッドを実行できることを意味しますが、各プロセスは1秒あたり1バッチを並列で実行する必要がありますか? – ipolevoy

+0

はい、イベントを一部のキューまたはサービスのインプロセスバッファに蓄積し、バッチで挿入する必要があります。 – uYSIZfoz

+0

多くのINSERTを並行して実行できます。 1秒あたり1バッチがすべてのスレッドで合計で推奨されます。 – uYSIZfoz

2

私は同じような問題を抱えていましたが、悪いことではありませんが、1秒あたり〜20個の挿入を行うと、サーバは高負荷、メモリ消費、CPU使用量に達します。私はメモリ内のインサートをバッファリングするBufferテーブルを作成し、それを定期的に "実際の"オンディスクテーブルにフラッシュします。そして、魔法のように、すべてがきちんと進んでいます:loadavg、メモリ、CPUの使用量は正常なレベルにまで落ちました。良い点は、バッファテーブルに対してクエリを実行し、メモリとディスクの両方から一致する行を取得できることです。クライアントはバッファリングの影響を受けません。 https://clickhouse.yandex/docs/en/table_engines/buffer.html

関連する問題