2017-06-11 48 views
0

我有以下規則的情況:Hbase數據應該如何用於快速查詢響應?

  1. 用戶只能是在一個時間一個地點。如果用戶A在場地X處登記,然後在場地Y處登記,則他們不再處於場地X.
  2. 登記入住僅「持續」最多3小時。如果在場地X用戶A的檢查,然後再執行 任何3小時,他們不再在會場十

的數據將使用卡夫卡被解析成的HBase和火花流。

我想用TTL的HBase是3小時,版本是1,符合上述條件。問題是我很困惑如何組織HBase中的數據以加快查詢響應,我是否應該使用單一列與場地名稱或場地名稱作爲不同的列名稱?

哪一個會是更好的選擇,爲什麼?

需要執行的查詢有: 1.用戶A現在在哪裏? 2.現在有哪些用戶在場地X?

+0

預計有多少用戶和多少場地?什麼是讀寫比例?預計每秒有多少請求? – AdamSkywalker

+0

這是實時查詢的新實現。現在一切都會減少,但期望每個公衆場所都是場地。 –

回答

1

最有效的查詢是基於HBase表的行密鑰。 我會使用用戶名作爲行鍵,以便能夠快速獲取信息的特定用戶。你需要爲每一行提供一列 - 場地。顯然,要收集所有數據(查詢2:用戶在場所X處),您需要掃描整個表格(部分)。所以它不會很有效。查看HBase的二級索引 - 如果您遇到此類查詢的性能問題。

1

因此,要解決上述情況,我建議有兩個表:

  1. 第一個表的行鍵將用戶ID(我還建議增加像HBase的區域(用戶ID%數量的一些碎片關鍵)來均勻分配數據並避免熱點)。這個表格將提供映射用戶ID - >場地,並檢查特定用戶在哪裏將O(1)。
  2. 第二個表格的行鍵將是venueID + userID(也帶有一些分片鍵的前綴)。因此,您可以使用KeyOnlyFilter和PrefixFilter(前綴是場地)來獲取特定場地中的所有用戶。這應該是相當快的。

由於您使用Kafka和Spark,攝入兩張表不應影響您的表現。

如果您需要更多詳細信息,請讓我知道。

+0

不錯的做法。但你認爲這是值得兩桌嗎? –

+0

這種非規範化的主要開銷是更新。但據我所知,案件更新是在訴訟期間完成的,同時也是如此。所以你可以保持兩個表中的數據同步。所以,我認爲這應該起作用。 – gorros