2013-07-22 12 views
10

Ho un tavolo HBase dove sto scrivendo le chiavi fila come:HBase riga per monotona crescente chiavi

<prefix>~1 
<prefix>~2 
<prefix>~3 
... 
<prefix>~9 
<prefix>~10 

La scansione sul guscio HBase dà un output:

<prefix>~1 
<prefix>~10 
<prefix>~2 
<prefix>~3 
... 
<prefix>~9 

Come deve essere progettata una chiave di riga in modo che la riga con il tasto <prefix>~10 sia valida per ultima? Sto cercando alcuni modi consigliati o modi più popolari per progettare le chiavi di riga HBase.

risposta

1

Se possibile, è consigliabile utilizzare chiavi a lunghezza fissa. Bytes.toBytes (valore lungo) può essere utilizzato per ottenere un array di byte da un contatore. Ordinerà bene per long lunghi positivi inferiori a Long.MAX_VALUE.

5

HBase negozi rowkeys in ordine lessicografico, in modo da poter provare a utilizzare questo schema con lunghezza fissa rowrey:

<prefix>~0001 
<prefix>~0002 
<prefix>~0003 
... 
<prefix>~0009 
<prefix>~0010 

Tenete a mente che è anche necessario utilizzare prefissi casuali per evitare la regione hot-spotting (quando una singola regione accetta la maggior parte delle scritture, mentre le altre regioni sono inattive).

21

Come deve essere progettata una chiave di riga in modo che la riga con il tasto ~ 10 sia l'ultima?

Si veda digitalizzazione in questo modo perché rowkeys in HBase sono mantenuti allineati lexicographically indipendentemente dall'ordine di inserzione. Ciò significa che sono ordinati in base alle loro rappresentazioni di stringa. Ricorda che i tasti di riga in HBase sono trattati come una matrice di byte con una rappresentazione di stringa. Il tasto di ordine più basso viene visualizzato per primo in una tabella. Ecco perché 10 appare prima delle 2 e così via. Vedi le sezioni Righe su questo page per saperne di più.

Quando si lasciano i numeri interi con zeri, il loro ordinamento naturale viene mantenuto intatto mentre si ordina lessicograficamente ed è per questo che si vede l'ordine di scansione uguale all'ordine in cui sono stati inseriti i dati. Per farlo puoi progettare i tuoi rowkey come suggerito da @shutty.

Sto cercando alcuni modi consigliati o le modalità più popolari per la progettazione delle chiavi di riga HBase.

ci sono alcune linee guida generali da seguire al fine di elaborare un buon progetto:

  • Mantenere il rowkey il più piccolo possibile.
  • Evitare l'uso di tasti di riga che aumentano in modo monotono, ad esempio timestamp, ecc. Si tratta di un progetto di scarsa qualità e porta all'hotspotting di RegionServer. Se non puoi evitare di usarlo in qualche modo, come l'hashing o la salatura per evitare di fare hotspotting.
  • Evitare l'uso di stringhe come tasti di riga, se possibile. La rappresentazione in serie di un numero richiede più byte rispetto al suo numero intero o rappresentazione lunga. Ad esempio: Un valore lungo è 8 byte.È possibile memorizzare un numero senza firma fino a 18.446.744.073,709,551,615 in questi otto byte. Se hai memorizzato questo numero come stringa - presumendo un byte per carattere - hai bisogno di quasi 3 volte i byte.
  • Utilizzare un meccanismo, come l'hashing, per ottenere una distribuzione uniforme delle righe nel caso in cui le regioni non siano caricate uniformemente. Potresti anche creare tabelle pre-suddivise per raggiungere questo obiettivo.

Vedere questo link per ulteriori informazioni sulla progettazione di rowkey.

HTH