多くのデータが繰り返される大量のデータを保存およびクエリするためのオプションは何ですか?

StackOverflow https://stackoverflow.com/questions/416432

質問

Javaでの効率的なデータストレージのオプションを評価しています。データセットは、名前付きの主キーを持つタイムスタンプ付きのデータ値です。例:

Name: A|B|C:D
Value: 124
TimeStamp: 01/06/2009 08:24:39,223

特定の時点での株価である可能性があるため、これは古典的な時系列データパターンです。ただし、Hibernateを使用したいので、適切なJDBC互換データベースで動作する汎用RDBMSソリューションが本当に必要です。したがって、実装者が独自のJDBC / Hibernate対応データベースを使用できるようにしたいので、Oracleのようなデータベースの時系列拡張は実際にはオプションではありません。

ここでの課題は、短時間で蓄積できる大量のデータです。これまでのところ、私の実装は、生データがDAY、WEEK、MONTHなどのテーブルに集約される定期的なロールアップとパージスケジュールの定義に焦点を当てていますが、欠点は、異なる場所に保存された期間間の早期の粒度の不一致とわずかな不一致です集約。

データの元の粒度を保持しながら物理的に圧縮できるデータの量には絶対的な制限があるため、チャレンジにはオプションが制限されています。この制限は、リレーショナルデータベースと汎用JDBCを使用するディレクティブによって悪化しますその1つ。

従来のデータ圧縮アルゴリズムから概念的な概念を借用し、同じ名前のキーの多くの連続値が同一であると予想されるという事実を活用して、統合することで保存されたレコードの数をシームレスに減らす方法があるかどうか疑問に思っています値を1つの論理行に繰り返しながら、「次の n レコードが同じ値を持つ」ことを効果的に示すカウンターも格納します。これの実装は非常に単純に思えますが、トレードオフは、特に集計SQL関数のいずれかの種類を使用する場合、標準SQLを使用したクエリに対してデータモデルが非常に複雑になることです。これにより、複雑なカスタムコードのみがデータを「解凍済み」に復元できるため、データストアの有用性が大幅に低下します。このデータを適切にレンダリングできない数百のツールとインピーダンスの不一致が発生する状態。

基本的に「理解」するカスタムHibernateタイプを定義する可能性を検討しました。圧縮されたデータセットを元に戻し、動的に作成された合成行とともにクエリ結果を返します。 (データベースは、厳密に制御された入力ストリームを除くすべてのクライアントにのみ読み取られます)。私が念頭に置いていたいくつかのツールは、未加工のJDBC(たとえばJasperReports)に加えてHibernate / POJOSと統合しますが、これは実際には集約関数の問題に対処しておらず、おそらく他にも多くの問題があります。

だから私はおそらくより独自の[SQLでない可能性がある]データストアを使用しなければならないことに自分自身を辞任し(提案を歓迎します)、少なくとも擬似JDBCドライバーを作成するおそらくそれほど複雑ではないタスクに集中します外部ツールとの統合を容易にします。

" ビットパックファイル"と呼ばれるものへの参照を聞きました。このデータ圧縮を実現するためのメカニズムとして、これを提供するデータベースは知りません。私がやりたい(または本当にできる...)ことは、自分でデータベースを作成することです。

何か提案や洞察?

役に立ちましたか?

解決

列指向データベースを見ます。この種のアプリケーションに最適です

他のヒント

Hibernate(または任意のJPAソリューション)は、このジョブの間違ったツールです。

JPA / Hibernateは軽量なソリューションではありません。大量のアプリケーションでは、オーバーヘッドが大きいだけでなく、非常に高くなります。本当にグリッドおよびクラスターソリューション。ここでは、さまざまなテクノロジーの概要を繰り返しません。

金融市場情報システムで多くの経験があります。あなたが言ったことのいくつかは私に突き出した:

  • 生データがたくさんあります;
  • そのデータにさまざまな集計を適用します(例:日次のオープン/ハイ/ロー/クローズ);
  • 高可用性はおそらく問題です(常にこの種のシステムにあります)。そして
  • 低レイテンシはおそらく問題です(同上)。

グリッド/クラスタータイプのソリューションでは、2つのカテゴリに大まかに分けています。

  1. CoherenceやTerracottaなどのマップベースのソリューション。そして
  2. GigaSpacesのようなJavaspacesベースのソリューション。

Coherenceを頻繁に使用しましたが、Mapソリューションは素晴らしい場合がありますが、問題もあります。 Coherenceマップにはリスナーがあり、この種のことを使用して次のようなことができます。

  • 市場価格のアラート(価格が特定のレベルに達したとき、ユーザーは通知が必要な場合があります);
  • デリバティブ価格設定(たとえば、取引所で取引されているオプション価格設定システムは、原証券が最後の取引価格を変更したときに価格を変更する必要があります);
  • 取引照合/予約システムは、調整目的で受信した取引通知を照合する場合があります。
  • など

これらはすべてリスナーで実行できますが、Coherenceでは、たとえばリスナーを安価にする必要があります。これにより、Mapが別のMapに何かを書き込むよりもリスナーを持つようになります。また、キャッシュエントリの変更には問題が発生する可能性があります(この種の問題に対処するメカニズムもありますが、2回目にトリガーされないように市場価格アラートをオフにするなどの状況について話します)。

GigaSpacesタイプのグリッドソリューションは、この種のアプリケーションにとってはるかに魅力的であることがわかりました。読み取り(または破壊的な読み取り)操作は非常にエレガントでスケーラブルなソリューションであり、ミリ秒未満のパフォーマンスでトランザクショングリッドの更新を取得できます。

2つの古典的なキューアーキテクチャを検討してください:

  • リクエスト/レスポンス:悪いメッセージはキューをブロックする可能性がありますが、多くの送信者と受信者が(スケーラビリティのために)パイプの数を増やすことは必ずしも簡単ではありません。そして
  • パブリッシュ/サブスクライブ:これは送信者と受信者を分離しますが、複数のサブスクライバーがいる場合、それぞれがメッセージを受信するという点で拡張性がありません(必ずしも予約システムで欲しいものとは限りません)。

GigaSpacesでは、破壊的な読み取りはスケーラブルなパブリッシュ/サブスクライブシステムに似ており、読み取り操作は従来のパブリッシュ/サブスクライブモデルに似ています。グリッドの上に構築されたMapおよびJMS実装があり、FIFO順序付けを実行できます。

今、あなたが聞いているのを聞いて、粘り強さについてはどうですか?永続性は、他のすべてのものを決定した結果です。この種のアプリケーションでは、サービスとしての持続性モデル(皮肉なことにHibernateについて書かれていますが、すべてに適用されます)。

基本的に、これは日付ストアのヒットが非同期であり、要約データの実行でうまく機能することを意味します。トレード通知をリッスンし、関心のあるものだけを保持するサービスを持つことができます(必要に応じてメモリに集約します)。この方法で始値/高値/安値/終値を行うことができます。

大量のデータの場合、実際にはすべてをデータベースに書き込む必要はありません。

Michael StonebrakerのMoney:Techでのプレゼンテーション。彼はあなたが必要とする多くの事柄に当たり、彼は大きな3つの象(SQL Server、Oracle、およびDB2)がどのようにティックストアのニーズを満たすことができないかを説明します(あなたが構築しているように見えます)。彼は列ストアを超えて掘り下げますが、それは正しい方向です。彼は圧縮と速度についても話し合っていますが、どちらも問題です。

ここにあなたが面白いと思うかもしれないいくつかのリンクがあります:

多くのJDBC対応データベース管理システム(Oracleなど)は、物理ストレージエンジンで圧縮を提供します。たとえば、Oracleには「圧縮」という概念があります。解凍オーバーヘッドのないテーブル:

http://www.ardentperf .com / wp-content / uploads / 2007/07 / advanced-compression-datasheet.pdf

回答ありがとうございます。

Cletus、概要に感謝しますが、DBの柔軟性とJDBC / Hibernateとの互換性を放棄して、利用可能なすべてのツールを使用できるようにすることはできません。さらに、私はこれを明確に述べていませんでしたが、ユーザーに(おそらく高価な)商用ソリューションの採用を強制したくありません。データベースブランドXがある場合は、それを使用してみましょう。気にしない場合は、オープンソースのデータベースブランドYをお勧めします。基本的に、アプリケーションには複数の顔があり、そのうちの1つは受信データのリポジトリですが、もう1つの顔はレポートソースであり、私は本当にレポートジェネレーターを作成するビジネスに参加したくない。

まだロードテストを行っていませんが、 LucidDB には非常に感銘を受けました。これは列指向のデータベースであり、良好なクエリパフォーマンスと一見良好なデータ圧縮を提供します。私が知る限り、Hibernateダイアレクトはまだ存在しませんが、JDBCドライバーがあります。また、ユーザー定義の変換もサポートしています。つまり、繰り返しの値と連続した値を1つの「行」に圧縮するというアイデアをシームレスに実装できると思いますが、それらを複数の「合成」に吹き飛ばしますクエリ時の行。すべてはクエリ呼び出し元に見えないように行われます。最後に、データベーステーブルをサポートする他のJDBCをLucidDBに配置できる外部テーブルのこの気の利いた機能をサポートします。これは、他のデータベースにある程度のサポートを提供するために非常に貴重であると思います。

ポインター、Javamanに感謝します。 LucidDBにゾーニングしました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top