15

HBaseを使用して時系列データを保存しようとしています。私たちが現在持っているモデルは、時系列をセル内のバージョンとして保存しています。これは、セルが最終的に何百万ものバージョンを格納する可能性があることを意味し、この時系列に対するクエリは、HBaseの Get クラスで使用可能な setTimeRange メソッドを使用して、バージョンの範囲を取得します。

例えば

{
    "row1" : {
        "columnFamily1" : {
            "column1" : {
                1 : "1",
                2 : "2"
            },
            "column2" : {
                1 : "1"
            }
        }
    }
}

これは、時系列データを HBase に格納するための妥当なモデルですか?

データを複数の列に格納する代替モデル (複数の列にわたってクエリを実行できますか) と行のどちらが適していますか?

4

2 に答える 2

19

ここに時系列を保存するためにバージョン管理を使用するべきではないと思います。うまくいかないからではなく、その特定のユースケース向けに設計されておらず、他の方法があるからです。


時系列を時間ステップとして列修飾子として保存すると、値がデータ自体になることをお勧めします。何かのようなもの:

{
    "row1" : {
        "columnFamily1" : {
            "col1-000001" : "1"
            "col1-000002" : "2"
            "col1-000003" : "91"
            "col2-000001" : "31"
            }
        }
    }
}

ここでの良い点の 1 つは、HBase が列修飾子をソートされた順序で格納することです。そのため、時系列を読み返すと、項目が順番に表示されるはずです。


もう 1 つの現実的なオプションは、行キーの最初の部分としてレコードの識別子を持ち、その後行キーにも時間ステップを含めることです。何かのようなもの:

{
    "fooseries-00001" : {
        "columnFamily1" : {
            "val" : "1"
            }
        }
    }
    "fooseries-00002" : {
        "columnFamily1" : {
            "val" : "2"
            }
        }
    }

}

これには、特定のシリーズの範囲スキャンを非常に簡単に実行できるという優れた機能があります。たとえば、Fooseries のステップ 104 から 199 を引き出すことは、実装が非常に簡単で効率的になります。

これの欠点は、シリーズ全体を削除すると、もう少し管理と同期が必要になることです. もう 1 つの欠点は、MapReduce 分析がこのデータに対して何らかの分析を行うのに苦労することです。上記のアプローチでは、時系列全体が 1 回の呼び出しに渡されmap()ますが、ここでmap()はフレームごとに呼び出されます。

于 2012-04-26T03:19:40.803 に答える
0

+1 openTSDBの場合、時間ベースのロールアップクエリを簡素化するために多くのトリックを行います.

元の質問に関しては、必要な数のセル バージョンを使用できます (制限はありません)。パフォーマンスの低下はありません。'Get' はとにかく HBase で Scan として実装され、setTimeRange は非常に効果的なフィルターです。

于 2013-06-16T22:59:05.743 に答える