時間範囲に基づいてデータを取得する必要があります。時間範囲に基づいて hbase テーブルを分割する方法はありますか。例: 9:00 から 9:05 までのデータが必要です。
3 に答える
タイプの複合キーを作成する<timestamp><id>
と、hbase のすべてのエントリがタイムスタンプ順に並べ替えられます。次に、範囲の先頭から開始し、範囲の末尾で終了するスキャナーを作成できます。
直面する可能性のある問題の 1 つは、挿入率が高い場合、単一のサーバーがすべての新しいエントリのホットスポットになることです。これを回避する 1 つの方法は、キーを逆にして、最初の部分がランダムであることを確認することです: <sha1 of ID><timestamp>
. これには、クラスター全体に書き込みが分散されるという利点がありますが、特定の範囲を取得するためにテーブル全体の読み取りが必要になるという欠点があります。
の最初の方法を使用すると<timestamp><id>
、マップ ジョブが必要な数のチャンクに作業を分割できない場合があります。テーブル分割が機能するデフォルトの方法はリージョンです。タイム スライスが十分に小さい場合、データを提供する単一のリージョンがあり、クエリで並列処理が得られない可能性があります。リージョンよりも多くのマッパーにわたってクエリを並列化するカスタム テーブル分割を行うこともできますが、それでも 1 つのリージョンからすべてのデータを読み取ることになり、並列処理にも欠点が生じる可能性があります。
テーブルをどのようにセットアップするかは、予測される使用シナリオと読み取り/書き込みの比率、およびそれぞれに必要なパフォーマンスの高さによって異なります。
一意性を確保するためにタイムスタンプに ID を追加しても、指定されたタイムスタンプを持つすべてのイベントを返すスキャナーを取得できます。HBase は、バイト表現に基づいて辞書的にキーをソートします。したがって、キーが<timestamp>:<id>
の場合、スキャナを行で開始し、行<timestamp>
で停止するように設定<timestamp+1>
して、そのタイムスタンプですべてのイベントを取得できます。
タイムスタンプをキーの最初の部分にすることができます。明らかに、欠点は、他のキーを直接照会できなくなることです。それも必要な場合は、両方が重要であれば、データを複製することを検討できます。
私にとって問題は、エントリの重複です。多くのイベントを同時に発生させることができます。例: たとえば 10:05 に 10 個のイベントを発生させることができます。エポック時間に変換して挿入すると、hbase で互いに上書き (または書き込みに失敗) する可能性があります。
タイムスタンプとともに ID を追加できますが、この ID を追加すると、mapreduce ジョブで開始時刻と終了時刻を設定できますか?