5

リアルタイム分析にHBaseを使用することを検討しています。

HBaseの前は、ログファイルに対してHadoop Map Reduceジョブを実行してデータを集約し、細粒度の集計結果をHBaseに保存して、集計データのリアルタイム分析とクエリを可能にします。そのため、HBaseテーブルには事前に集計されたデータ(日付別)が含まれます。

私の質問は、HBaseデータベースのスキーマと主キーの設計を最適に設計して、高速で柔軟なクエリを可能にする方法です。

たとえば、次の行をデータベースに格納するとします。

timestamp, client_ip, url, referrer, useragent

そして、map-reduceジョブが3つの異なる出力フィールドを生成し、それぞれを個別の「テーブル」(HBase列ファミリー)に格納するとします。

  • 日付、オペレーティングシステム、ブラウザ
  • 日付、URL、リファラー
  • 日付、URL、国

(私たちのmap-reduceジョブは、ユーザーエージェントとclient_ipデータからoperationing_system、browser、countryフィールドを取得します。)

私の質問は、HBaseスキーマを構造化して、これらのフィールドのいずれか、またはその組み合わせを高速でほぼリアルタイムで柔軟に検索できるようにするにはどうすればよいでしょうか。たとえば、ユーザーは次を指定できる必要があります。

  • 日付別のoperationing_system(「この日付範囲のiPadユーザーは何人ですか?」)
  • 国別および日付別のURL(「先月、この国からこのURLへのユーザー数は?」)

そして基本的に他のカスタムクエリはありますか?

次のようなキーを使用する必要があります。

  • date_os_browser
  • date_url_referrer
  • date_url_country

もしそうなら、私たちは上で指定された種類のクエリを満たすことができますか?

4

1 に答える 1

8

あなたはそれの要点を持っています、はい。どちらのクエリ例も日付でフィルタリングされます。これは、このドメインの自然な「プライマリ」ディメンションです(イベントレポート)。

キーを日付で開始することについてよくある注意点は、「ホットスポット」の問題が発生することです。その問題の本質は、時間的に連続している日付範囲も連続しているサーバーになるため、「現在」(または「最近」)発生したデータを常に挿入およびクエリしている場合、1つのサーバーがすべての負荷を取得することです。他の人が遊んでいる間。これは、排他的にバッチロードするため、挿入に関して大きな懸念事項とは思えませんが、読み取り時に問題になる可能性があります。すべてのクエリが20台のサーバーのいずれかに送信される場合、実質的に5%の容量になります。

OpenTSDBは、日付の前に3バイトの「メトリックID」を付加することでこれを回避します。これは、クラスター全体に更新をスプレーするのに適しています。似たようなものがあり、ほとんどのクエリに常に(または通常)そのフィルターを含めることがわかっている場合は、それを使用できます。または、日付の上位部分(「月」など)のハッシュを前に付けると、少なくとも読み取りがもう少し広がります。

于 2012-05-29T21:52:32.383 に答える