500M +アイテムのクエリを処理する方法


8

私のデータの構造は次のとおりです:

date: <timestamp>
filter_a: <integer> -> range [0, 1000]
filter_b: <integer> -> range [0, 1000]
filter_c: <integer> -> range [0, 86400]
filter_d: <integer> -> range [0, 6]
group: <string>
second_group: <integer>
variable_a: <float>
variable_b: <float>
variable_c: <float>
a couple more no very important

次のクエリを実行する必要があります。

最初:

  • フィルターデータによってdatefilter_afilter_bfilter_c、その他

次に、フィルタリングされたデータを使用します。

  • すべてのレコードを数える
  • 取得平均variable_avariable_bおよびvariable_c
  • 取得標準偏差のをvariable_avariable_bそしてvariable_c
  • 取得四分位 のをvariable_avariable_bそしてvariable_c
  • groupor second_groupおよびaggregate(Count、Avg、Std、..)によってデータをグループ化する

システムの利用者の数は約10または15であるが、項目数は今それが、巨大である70Mが、それはなります500M数週間で、それが可能になる1000Mについての年に。

クエリの数は少なく、同時ユーザー数は10人以下です。私の問題は、この大量のデータでこれらのクエリを処理する方法です。

これまでに何を試しましたか?

  • mongodbはから始めましたが、最初は高速でしたが、10M +で四分位数を計算すると遅くなりました。インデックスを追加すると改善しましたが、すべてのデータをクエリする必要がある場合はあまり役に立ちませんでした。mongodbを使い始めたのは、データが非常に動的だったためですが、幸いにもデータ形式は「もう変更されない」ためです。

  • ノードのように見えるのでfilter_afilter_b試してみましたneo4j。私はそれをneo4jがとても好きでしたが、私のグラフはエッジがたくさんあるので、クエリはあまり速くありませんでした。

  • 最後に、データ形式は変更されず、コレクション/テーブルは1つだけなので、SQLで結合する必要がないため、postgresqlを確認しました。私のテストはpostgresqlの方が高速でしたが、将来的に適切にスケーリングできなくなるのではないかと心配しています。

私が必要なものは何?

  • この場合、postgresqlは適切な選択肢ですか?
  • 使用できる別の種類のデータベースはありますか?この場合、どちらが最適ですか?
  • それを改善するために他に何ができますか?

編集する

  • 約1Mの要素が毎日挿入され、時間に沿って「変更してはいけません」。
  • 書き込み速度は重要ではありません
  • ハード要件は、読み取り/集約を高速化することです

ありがとう!


1
SQL Serverのインデックス付きビュー/ Oracleのメタビューのビューはどうですか?これらはベーステーブルの実行中の集計であるため、ベーステーブルが変更されると、インデックスもオンザフライで変更されます。そうすれば、すでに計算されている集計をいつでもクエリできます。
Ali Razeghi

@AliRazeghiインデックス付きビューは良い考えです。とにかく、まずクエリ自体を最適化する前に、最高のデータベース/デザインを選択したいと思います
Andres

1
純粋にPostgresで最適化するために、BRINインデックスがここで役立つと言いたいのですが、それらについて読む以外に何もしていません。postgresql.org/docs/9.5/static/brin-intro.html
Erik Darling

1
個人的には、大量のメモリなしにOLTPサーバーで数十億行のレポートDBを継承しました。幸いなことに、その中で最も照会された部分はローリング「過去3週間」でしたが、テーブルスキャンは前代未聞ではありませんでした。正直なところ、非常に優れた圧縮、パーティショニング、パーティション削除、パーティショニングスキーム、SANキャッシュ最適化を使用し、未使用のインデックスを削除することで、MS SQL 2008 Entで非常に優れたパフォーマンスを得ました。10億はPGSQLにとってそれほど難しくありません。各行の幅はどのくらいですか、または各行に必要なスペースはどのくらいあると思いますか。また、テーブルまたは入力プロセスごとにインデックスはいくつありますか。
Ali Razeghi

2
@Andresは、それが含まれているdbエンジンと、各行の最大サイズが何であるかによって異なります。たとえば、PostgreSQLにはvarcharとcharしかありません。charは計算が簡単で、varcharは平均の長さを推測する必要があります。それがどのフィールドタイプであるか(Mongoまたは独自の形式でドキュメントに格納するものを除く)、それぞれに必要な文字数、および列を持つインデックスの数がわかっている場合。8 GBのRAMは、そのRAMがサーバー上の他のテーブルやリソースと共有されている場合は特に、メモリから効率的に取り出すには低すぎるように聞こえます。
Ali Razeghi

回答:


5

リレーショナルデータベースを使用して時系列データに対してこれらの統計計算を実行する代わりに、この数学および後処理作業をデータベースの外部のクライアントアプリケーションに移動することをお勧めします。

PythonやRubyなどのスクリプト言語を使用して、固定幅の期間にわたってデータの「チャンク」をクエリし、中間の統計サマリーを計算して、ループするときに複数のチャンクにわたって結果を結合することで、問題を段階的に解決できます。歴史全体にわたって。いくつかの統計的測定値はチャンク間で組み合わせるのは難しいですが、Avg()のようなものはチャンクごとにsum()とcount()しか必要ないため、O(1)とO(chunksize)の両方があるため、チャンクのマージは適切にスケーリングできます。


私はpython / pandasを使用してそのようなものを試しました。微積分はより高速でしたが(数秒)、すべてのデータの取得は低速でした。たぶん、より良いchunksizeことが役立つかもしれません。+1
アンドレス

1

データは変更されず、追加されるだけなので、データは好きなところに保存します。たとえば、Amazon S3ですが、高速読み込みのデータベースであれば問題ありません。インデックスはありません。選択するデータベース/ FSには、バケット内のデータを読み取るオプションが必要です。たとえば、1Mレコードのファイルを1日1つ持つことができます。

次に、Sparkを使用してフィルタリング/分析を行います。これはクラスターベースであり、ニーズに合わせてスケーリングできます。


同意します。すでに1日ごとにデータセットを分離しています。私はHDFSとHBaseについても考えていました
Andres

0

応答は、この後のデータの使用方法によって異なります。処理にはCassandraを、分析にはHiveを使用してください。


ハイブはに最適な選択肢ではないことを理解しましたreal time。私が間違っている?
アンドレス

1
はい、HBaseはリアルタイムの読み取り/書き込み用です。しかし、Cassandraも同じことができます。しかし、HBaseの方が優れていると思います。
Artemyプロトタイピング2016

0

この種の状況は、SQL Server(私が最もよく知っているもの)のようなプラットフォーム上でRalph Kimball等によって完成された手法を使用するデータウェアハウジングに理想的です。これらは、このタイプのシナリオを念頭に置いて特別に設計されました。比較的静的な膨大な量のデータレコードで、この種の集計を計算する必要があります。番号リレーショナルテクニックは、この種のアプリケーションで適切に実装されたデータウェアハウジングと一致しますが、組織がそれらを実装するソフトウェアパッケージ(SQL Server Analysis Servicesなど)のライセンスを単に提供できない場合は、他のものよりも確かに優れているものもあります。この種のデータアクセス用にカスタマイズされたMDXなどの言語を実装するための学習曲線もあります。データウェアハウジングが組織にとって実行可能なオプションである場合でも、リレーショナルソリューションを探すために時間を無駄にしないでください。これはリレーショナルデータベースの問題ではありません。必要に応じて、Kimballなどの基本的なリファレンスやSSASおよびMDXへのリンク(申し訳ありませんが、Oracleや、よく知らない他の競合他社には役立ちません)のドキュメントを投稿できます。お役に立てば幸いです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.