大量の_構造化_データを保存するにはどうすればよいですか?


9

アプリケーションは継続的に(ほぼ毎秒)ユーザーの位置を収集して保存します。

このデータは構造化されています。リレーショナルデータベースでは、次のように保存されます。 | user | timestamp | latitude | longitude |

ただし、データが多すぎます。ユーザーごとに、毎日60×60×24 = 86,400レコードになります。ユーザー数が1000であっても、これは毎日86,400,000レコードを意味します。

そして、それは毎日86,400,000レコードだけではありません。これらのレコードが処理され、それらの処理されたバージョンも保存されるためです。したがって、その数に約2を掛けます。

データの使用方法

基本的に、位置データのより粗いバージョンを作成して、より簡単に使用できるようにする予定です。あれは:

  1. タイムスタンプ付きの受信データを並べ替えます。
  2. このリストを順番に繰り返して、場所が大幅に変更されたかどうかを判断します(緯度と経度の変化量を確認してください)。
  3. 重要ではない場所の変更を出力の単一のエントリとして表します(したがって、出力は場所データのより粗いバージョンです)。
  4. 大幅な変更のためにさらに大きな緯度と経度の変更を要求することにより、出力でこのプロセスを繰り返します。したがって、前の出力から生成される出力は、さらに粗くなります。
  5. プロセス全体を必要なだけ繰り返します。
  6. さまざまな解像度を集計してユーザーに送信します。また、後で使用できるように、データのすべての解像度を保存します。

このデータを保存するには何を使用すればよいですか?リレーショナルデータベースまたはNoSQLソリューションを使用する必要がありますか?このアプリケーションを設計するとき、他に何を考慮すべきですか?


3
このような1秒あたり2000レコードは、おそらく最新のSQLエンジンに影響を与えません。簡単な容量テストは、一括ロードされるファイルにランダムに書き込むコンソールプログラムを取得することです。
Caleth

1
@Calethしかし、それはスケーラブルですか?ユーザーベースが100倍になった場合はどうなりますか?
Utku 2017年

3
ハードウェアが現在処理できるものを測定します。ボトルネックは、CPUが値を「処理」するか、生のディスク速度である可能性があります。あなたは何をするつもり行うすべてのデータと?これにより、ストレージに選択するテクノロジーが
決まり

3
カレスは絶対に正しい。何百万ものレコードが最新のデータベースシステムを混乱させることはありません。NoSQLストアは、大量のデータを非常に高速に書き込むのに非常に適してますが、最終的には、もう一度読み取ることを伴う何かを実行したいと考えています。多くの場合、どれだけの読み取りが必要になるかによって、使用するストアの種類が決まります。
キリアンフォス2017年

3
良い答えを与えるには、このデータの使用方法を知る必要があります。アドホッククエリが必要な場合はデータベースが適切な選択ですが、データセット全体の分析にはファイルベースのソリューションの方が適しています。閉じる投票。
kdgregory 2017年

回答:


9

このデータを保存するためのいくつかの選択肢:

  1. Apache Kafkaのようなメッセージキュー(おそらく分散)

これは、データのストリームの書き込みと読み取り用に最適化されます。処理しやすい形式でデータストリームを収集するのに理想的ですが、通常は、ストリーム全体を読み取る以外にクエリを実行することはできません。したがって、これはアーカイブ目的、または処理レイヤーへの途中の中間ステップのいずれかになります。

  1. リレーショナルデータベース

これをデータベースに書き込むだけで、ボリュームがDBの処理能力を超えると、データベースをシャーディングできます(=データの複数のサブセットを異なるデータベースサーバーに配置できます)。利点:リレーショナルDBを使用でき、新しいことを学ぶ必要はありません。欠点:DBを処理するすべてのコードは、どの断片のデータが存在するかを認識している必要があり、集約されたクエリはアプリケーションソフトウェアで実行する必要があります。

  1. Cassandraのような分散NoSQLデータベース。

データを分散NoSQLデータベースに書き込むと、データが自動的にシャーディングされます。Cassandraを使用すると、クラスター全体でクエリを実行でき、データに戻るために必要なアプリケーションコードが少なくて済みます。利点:大量のデータにより自然に適しているという欠点があります。特定の専門知識と、これらのシステムがどのように機能して優れたパフォーマンスを達成し、ニーズに応じてデータをクエリ可能にするかのメカニズムを深く理解する必要があります。NoSQLは魔法のようなパフォーマンスの修正ではなく、ナビゲートするために理解する必要がある一連のトレードオフです。

  1. Hadoop /ファイル

データはファイルに追加され、Hadoopプラットフォームによってサーバー全体に自動的に分散され、M / RやApache Sparkなどのツールを使用してそれらのサーバーで処理され、HiveやImpalaなどのHadoop SQLエンジンを使用して(ファイルとして)最終的にクエリされます。

どちらを選ぶ?

これらの代替案の間のトレードオフは複雑であり、それらは書き込みパターンと読み取りパターンの両方に大きく依存するため、これらのトレードオフを決定できるのはあなただけです。これらの代替案を深く理解するための時間が足りない場合は、リレーショナルDBを使用して、シャーディングソリューションを見つけてください。おそらく、YAGNI


データの使用方法について詳しく説明しました。この情報に基づいて何か追加しますか?
Utku 2017年

「解決」とはどういう意味か、まだはっきりしていません。地理レベル(市、州など)またはgeohashなどの座標系に集約しますか?または、動きのしきい値に基づいて通知を作成したいので、デルタの量に興味がありますか?要するに、これは何のためにあるのですか?
Joeri Sebrechts、2017年

ユーザーを追跡するためのものです。ユーザーはお互いを追跡し、追跡したユーザーがデバイスで過去5時間にどこにいたかをグラフ化します。本質的には、より細かい、より良いです。ただし、モバイルデバイスのメモリ容量は限られているため、解像度を下げないとデータを送信できません。つまり、ユーザーAがユーザーB、C、Dを追跡しているとします。サーバー側で処理を行わずに、B、C、Dから受信した位置データをAに転送すると、ユーザーAのデバイスのメモリが非常に速くいっぱいになります。したがって、いくつかの処理を行う必要があります。
Utku 2017年

私があなたが説明しているものを構築する場合、それをスパークストリーミングを介して接続された一連のカフカログとして構築します。ここで、位置はスパークストリームのウィンドウ全体に統合され、最終的な出力カフカログはプルおよびクライアントにWeb APIをプッシュします。ただし...これは非常に特殊なテクノロジーであり、背景や利用可能な時間によっては、これらの選択が間違っている場合があります。
Joeri Sebrechts 2017年

ありがとう。私はそれを心に留めておきますが、YAGNIの原則に従って、今のところリレーショナルデータベースを使用することを計画しています。必要に応じて、アプリケーションに適したものに切り替えます。必要に応じて、回答の情報を自由に編集してください。
Utku 2017年

6

要件をもう少し詳しく調べます。毎秒位置を追跡する錯覚を作成する方法があります。

現在のGPS位置を知っており、それをデータベースに書き込むアプリがある場合、位置が変化しないのになぜ位置を書き続けるのでしょうか? データが必要な場合でも、ユーザーが7時間眠っている場合は、プログラムで不足しているタイムスロットに重複した場所を入力して、計算やマッピングなどの必要なことを行うことができます。

毎秒場所を追跡する場合、これらのデータを永久に保存する必要がありますか? レコードを別のデータベースにアーカイブして、現在のテーブルが大きくなりすぎないようにすることができます。または、位置が変更された場所で記録を保持することもできます。これはデータウェアハウスでは一般的です。


2

データは時系列のセットです。時間とともに進化する数値のセット(ユーザーごとに2つ)を指定しました。通常は、リレーショナルストレージの種類を探すのではなく、RRDストレージを探します。これらのストレージは、バッファリングすることにより、多数の小さな書き込みのI / O作業を減らすことに重点を置いています。

リレーショナルストレージは、このボリュームの時系列の異端です。ただし、RRDの開発は、SQLほどプログラム可能な利用という点でサポートされていないことに注意してください。あなたはおそらく深刻な統合作業を見ているでしょうが、あなたの要件を考えるとそれは避けられません。

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