一直以來對rowkey的設計都比較迷茫,《hbase權威指南》倒是給出了個還算靠譜的例子。
下面這個例子有點兒像文章表結構,它的rowkey設計是這樣的,可以簡單的了解為,什麼人在什麼時間發了什麼資訊,資訊包括什麼附件,它是使用者為主線的一個設計。
<b><userid>-<date>-<messageid>-<attachmentid></b>
如果我們想查某個使用者發的資訊,我們可以設定scan的start rowkey 為該userid,end rowkey為userid+1即可。
當我們要查某個使用者某天發了什麼資訊,我們可以使用<userid>-<date>來搜尋該使用者所有的文章。
當我們要查某個具體的文章的内容,rowkey過濾<userid>-<date>-<messageid>即可。
是以rowkey的設計是要看具體的應用的。
上面這個例子沒有考慮熱點的問題,實際上每個使用者的文章被通路的熱度是不一樣的,有些文章被大量通路,有的無人問津。
那怎麼辦呢?有的書上寫,在前面加0-n的随機數,random % 機器數 。但是這樣子的話,以後你想取某個使用者的userid的時候隻能開多線程去通路了,因為你不能逆推出來它的rowkey。在和支付寶的工程獅聊了一下,他們是這樣處理的取md5(userid)的前4位+reverse(userid)這個樣子來處理userid,這樣子的話,能解決熱點的問題,也可以逆推出來rowkey。