{"id":55302,"date":"2020-01-17T00:00:00","date_gmt":"2020-01-16T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/teoriya-i-praktika-ispolzovaniya-hbase"},"modified":"2020-02-18T14:03:24","modified_gmt":"2020-02-18T11:03:24","slug":"teoriya-i-praktika-ispolzovaniya-hbase","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase","title":{"rendered":"Teoria e pratica dell'uso di HBase","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Buongiorno! Mi chiamo Danil Lipovoy, e il nostro team di Sbertech ha iniziato a utilizzare HBase come archivio di dati operativi. Durante lo studio di questo strumento, abbiamo accumulato esperienze che desideravamo sistematizzare e descrivere (speriamo che possano essere utili a molti). Tutti gli esperimenti riportati di seguito sono stati condotti con le versioni HBase 1.2.0-cdh5.14.2 e 2.0.0-cdh6.0.0-beta1. <\/p>\n<ol>\n<li>Architettura generale <\/li>\n<li>Scrittura di dati in HBASE<\/li>\n<li>Lettura di dati da HBASE<\/li>\n<li>Caching dei dati<\/li>\n<li>Elaborazione batch dei dati MultiGet\/MultiPut<\/li>\n<li>Strategia di divisione delle tabelle in regioni (splitting)<\/li>\n<li>Tolleranza ai guasti, compattazione e localit\u00e0 dei dati<\/li>\n<li>Impostazioni e prestazioni<\/li>\n<li>Carico di test<\/li>\n<li>Conclusioni<\/li>\n<\/ol>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>1. Architettura generale<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di HBase\" src=\"\/wp-content\/uploads\/2020\/01\/30800d8a48de4c52ff1650a4f1dec4c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nUn Master di riserva ascolta il heartbeat del Master attivo sul nodo ZooKeeper e, in caso di assenza, assume le funzioni di Master. <\/p>\n<h2>2. Scrittura di dati in HBASE<\/h2>\n<p>\nIniziamo considerando il caso pi\u00f9 semplice: la registrazione di un oggetto chiave-valore in una tabella tramite put(rowkey). Il client deve prima determinare dove si trova il server regionale principale (Root Region Server - RRS) che ospita la tabella hbase:meta. Questa informazione viene ottenuta da ZooKeeper. Successivamente, il client si rivolge al RRS e legge la tabella hbase:meta, dalla quale estrae informazioni su quale RegionServer (RS) \u00e8 responsabile della memorizzazione dei dati per la chiave rowkey specificata nella tabella di interesse. A fini di utilizzo futuro, la tabella meta viene memorizzata nella cache dal client e pertanto le successive chiamate avvengono pi\u00f9 rapidamente, direttamente al RS.<\/p>\n<p>Successivamente, RS, ricevuta la richiesta, scrive per prima cosa nel WriteAheadLog (WAL), necessario per il ripristino in caso di guasti. Poi salva i dati nel MemStore. Questo \u00e8 un buffer in memoria che contiene un insieme ordinato di chiavi per questa regione. La tabella pu\u00f2 essere suddivisa in regioni (partizioni), ciascuna delle quali contiene un insieme di chiavi non sovrapposto. Ci\u00f2 consente, distribuendo le regioni su server diversi, di ottenere prestazioni superiori. Tuttavia, nonostante l'evidenza di questa affermazione, vedremo in seguito che non funziona in tutti i casi.<\/p>\n<p>Dopo aver posizionato la registrazione nel MemStore, viene restituita al cliente una risposta che indica che la registrazione \u00e8 stata salvata con successo. In realt\u00e0, per\u00f2, \u00e8 conservata solo nel buffer e sar\u00e0 trasferita su disco solo dopo un certo intervallo di tempo o quando verr\u00e0 riempita con nuovi dati. <\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di HBase\" src=\"\/wp-content\/uploads\/2020\/01\/10f4d5d600a20882690f5cc81322bc41.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDurante l'operazione 'Delete' non avviene l'eliminazione fisica dei dati. Vengono semplicemente contrassegnati come eliminati, e la loro rimozione avviene al momento della chiamata alla funzione major compact, di cui si parla pi\u00f9 dettagliatamente al punto 7.<\/p>\n<p>I file in formato HFile si accumulano in HDFS e periodicamente viene avviato un processo di minor compact, che unisce semplicemente file piccoli in file pi\u00f9 grandi, senza eliminare nulla. Col tempo, questo genera un problema che si manifesta solo durante la lettura dei dati (ne parleremo pi\u00f9 avanti). <\/p>\n<p>Oltre al processo di caricamento descritto sopra, esiste una procedura molto pi\u00f9 efficiente, che costituisce forse il punto di forza principale di questo database: BulkLoad. Essa consiste nel creare autonomamente HFiles e scriverli su disco, il che consente di scalare in modo eccellente e di raggiungere velocit\u00e0 notevoli. In sostanza, il limite non \u00e8 HBase, ma le capacit\u00e0 dell'hardware. Di seguito sono riportati i risultati del caricamento su un cluster composto da 16 RegionServer e 16 NodeManager YARN (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 thread), versione HBase 1.2.0-cdh5.14.2. <\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di HBase\" src=\"\/wp-content\/uploads\/2020\/01\/4e4452b216eda3269a364ea97c49120f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQui si pu\u00f2 vedere che aumentando il numero di partizioni (regioni) nella tabella, cos\u00ec come gli executor Spark, otteniamo un incremento della velocit\u00e0 di caricamento. Inoltre, la velocit\u00e0 dipende dal volume di scrittura. Blocchi grandi offrono un aumento in megabyte al secondo, mentre quelli piccoli aumentano il numero di record inseriti per unit\u00e0 di tempo, a parit\u00e0 di condizioni. <\/p>\n<p>\u00c8 possibile avviare il caricamento in due tabelle contemporaneamente, raddoppiando cos\u00ec la velocit\u00e0. Di seguito si pu\u00f2 vedere che la scrittura di blocchi da 10 KB in due tabelle avviene a una velocit\u00e0 di circa 600 MB\/sec per ciascuna (complessivamente 1275 MB\/sec), che corrisponde alla velocit\u00e0 di scrittura in una sola tabella di 623 MB\/sec (vedi n. 11 sopra).<\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di HBase\" src=\"\/wp-content\/uploads\/2020\/01\/9f1b4fc0c80b797111494d400e9ce332.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIl secondo avvio con registrazioni da 50 KB mostra che la velocit\u00e0 di caricamento aumenta solo lievemente, il che indica che ci si sta avvicinando ai valori massimi. Occorre inoltre tenere presente che non si crea praticamente alcun carico su HBASE; tutto ci\u00f2 che \u00e8 richiesto \u00e8 prima restituire i dati da hbase:meta e, dopo l'inserimento degli HFiles, svuotare i dati BlockCache e salvare il buffer MemStore su disco, se non \u00e8 vuoto.<\/p>\n<h2>3. Lettura dei dati da HBASE<\/h2>\n<p>\nSe si considera che il cliente ha gi\u00e0 tutte le informazioni da hbase:meta (vedi punto 2), la richiesta viene inviata direttamente al RS che conserva la chiave necessaria. Inizialmente, la ricerca avviene in MemCache. Indipendentemente dal fatto che ci siano dati o meno, viene effettuata una ricerca anche nel buffer BlockCache e, se necessario, negli HFiles. Se vengono trovati dati nel file, vengono inseriti in BlockCache e la prossima volta saranno restituiti pi\u00f9 rapidamente. La ricerca in HFile avviene piuttosto rapidamente grazie all'uso del filtro di Bloom, che determinando un piccolo volume di dati stabilisce subito se quel file contiene la chiave necessaria e, in caso contrario, passa al successivo.<\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di HBase\" src=\"\/wp-content\/uploads\/2020\/01\/a21b1b825a84cfd02507ec334e9452fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nRicevuti i dati da queste tre fonti, il RS forma la risposta. In particolare, pu\u00f2 trasmettere pi\u00f9 versioni dell'oggetto trovate se il cliente ha richiesto versioning.<\/p>\n<h2>4. Caching dei dati<\/h2>\n<p>\nI buffer MemStore e BlockCache occupano fino all'80% della memoria on-heap allocata per RS (il resto \u00e8 riservato per compiti di servizio di RS). Se il modo tipico di utilizzo prevede che i processi scrivano e leggano immediatamente i medesimi dati, ha senso ridurre BlockCache e aumentare MemStore, poich\u00e9 durante la scrittura i dati non vengono memorizzati nella cache per la lettura, quindi l'utilizzo di BlockCache avverr\u00e0 meno frequentemente. Il buffer BlockCache \u00e8 composto da due parti: LruBlockCache (sempre on-heap) e BucketCache (di solito off-heap o su SSD). \u00c8 consigliabile utilizzare BucketCache quando ci sono molte richieste di lettura e non si riescono a memorizzare in LruBlockCache, causando un'attiva operazione del Garbage Collector. Tuttavia, non ci si pu\u00f2 aspettare un aumento radicale delle prestazioni dall'uso della cache per la lettura, ma ne parleremo di nuovo al punto 8.<\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di HBase\" src=\"\/wp-content\/uploads\/2020\/01\/17d7791a998dd7da747cb7089dce1f10.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nBlockCache \u00e8 unico per tutto il RS, mentre MemStore \u00e8 specifico per ciascuna tabella (uno per ogni Column Family).<\/p>\n<p>Come <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.cloudera.com\/blog\/2012\/06\/hbase-write-path\/\">\u00e8 descritto<\/a><\/noindex> In teoria, quando i dati vengono registrati, non vengono messi nella cache e, in effetti, i parametri CACHE_DATA_ON_WRITE per la tabella e \"Cache DATA on Write\" per RS sono impostati su false. Tuttavia, nella pratica, se si scrivono dati nel MemStore, poi lo si svuota su disco (cos\u00ec facendo), successivamente si elimina il file risultante, eseguendo quindi una richiesta get, riusciremo a ottenere i dati con successo. E anche se si disattiva completamente il BlockCache e si riempie la tabella con nuovi dati, poi si effettua il flush del MemStore su disco, li si elimina e si richiede da un'altra sessione, comunque verranno recuperati da qualche parte. Quindi HBase conserva non solo i dati, ma anche misteri enigmatici.<\/p>\n<pre><code class=\"bash\">hbase(main):001:0&gt; create 'ns:magic', 'cf'\nCreated table ns:magic\nTook 1.1533 seconds\nhbase(main):002:0&gt; put 'ns:magic', 'key1', 'cf:c', 'try_to_delete_me'\nTook 0.2610 seconds\nhbase(main):003:0&gt; flush 'ns:magic'\nTook 0.6161 seconds\nhdfs dfs -mv \/data\/hbase\/data\/ns\/magic\/* \/tmp\/trash\nhbase(main):002:0&gt; get 'ns:magic', 'key1'\n cf:c      timestamp=1534440690218, value=try_to_delete_me\n<\/code><\/pre>\n<p>\nIl parametro \"Cache DATA on Read\" \u00e8 impostato su false. Se avete idee, benvenuti a discuterne nei commenti.<\/p>\n<h2>5. Elaborazione batch dei dati MultiGet\/MultiPut<\/h2>\n<p>\nL'elaborazione di richieste singole (Get\/Put\/Delete) \u00e8 un'operazione piuttosto costosa, quindi \u00e8 consigliabile raggrupparle in List o List quando possibile, il che pu\u00f2 portare a un significativo miglioramento delle prestazioni. Questo vale in particolare per le operazioni di scrittura, mentre nella lettura c'\u00e8 un altro aspetto critico. Nel grafico sottostante \u00e8 mostrato il tempo di lettura di 50.000 registrazioni da MemStore. La lettura \u00e8 stata effettuata in un singolo thread e sull'asse orizzontale \u00e8 rappresentato il numero di chiavi nella richiesta. Si pu\u00f2 osservare che aumentando a mille chiavi in un'unica richiesta, il tempo di esecuzione diminuisce, ovvero la velocit\u00e0 aumenta. Tuttavia, con la modalit\u00e0 MSLAB attivata di default, dopo questa soglia inizia un drastico calo delle prestazioni, e pi\u00f9 \u00e8 ampio il volume dei dati nella registrazione, pi\u00f9 lungo \u00e8 il tempo di esecuzione. <\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di HBase\" src=\"\/wp-content\/uploads\/2020\/01\/42d3a77d66770a7fed03f83fecdca470.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI test sono stati eseguiti su una macchina virtuale, 8 core, versione HBase 2.0.0-cdh6.0.0-beta1.<\/p>\n<p>La modalit\u00e0 MSLAB \u00e8 progettata per ridurre la frammentazione dell'heap, che si verifica a causa della mescolanza di dati di nuove e vecchie generazioni. Come soluzione al problema, quando MSLAB \u00e8 attivato, i dati vengono immessi in celle (chunk) relativamente piccole e vengono elaborati a blocchi. Di conseguenza, quando il volume nel pacchetto di dati richiesto supera la dimensione allocata, le prestazioni subiscono un netto calo. D'altra parte, disattivare questa modalit\u00e0 non \u00e8 desiderabile, poich\u00e9 comporterebbe interruzioni a causa del GC nei momenti di intensa operazione con i dati. Un buon approccio potrebbe essere aumentare il volume della cella, nel caso di scrittura attiva tramite put contemporaneamente alla lettura. \u00c8 importante notare che il problema non si presenta se, dopo la scrittura, si esegue il comando flush che scarica MemStore su disco o se si utilizza il caricamento tramite BulkLoad. Nella tabella sottostante \u00e8 mostrato che le richieste da MemStore di dati di maggior volume (e quantit\u00e0 uguale) portano a un rallentamento. Tuttavia, aumentando il chunksize, si riporta il tempo di elaborazione alla normalit\u00e0.<\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di HBase\" src=\"\/wp-content\/uploads\/2020\/01\/0076215bd171257548f8a4c4d4229ba0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOltre ad aumentare il chunksize, \u00e8 utile suddividere i dati per regioni, ossia fare lo splitting delle tabelle. Questo porta a un numero inferiore di richieste per ciascuna regione e, se vengono inserite in una cella, la risposta rimane buona.<\/p>\n<h2>6. Strategia di suddivisione delle tabelle in regioni (splitting)<\/h2>\n<p>\nPoich\u00e9 HBase \u00e8 un archivio key-value e la partizione \u00e8 effettuata in base alla chiave, \u00e8 estremamente importante suddividere i dati uniformemente tra tutte le regioni. Ad esempio, partizionare questa tabella in tre parti porter\u00e0 a dati distribuiti su tre regioni:<\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di HBase\" src=\"\/wp-content\/uploads\/2020\/01\/a811ae81e77b48dbf28ed86dbdc35739.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA volte ci\u00f2 porta a un rallentamento drastico, se i dati caricati in seguito hanno valori long che iniziano per lo pi\u00f9 con la stessa cifra, per esempio:<\/p>\n<p>1000001<br \/>\n1000002<br \/>\n\u2026<br \/>\n1100003<\/p>\n<p>Poich\u00e9 le chiavi sono memorizzate come array di byte, tutte inizieranno in modo identico e apparterranno a una regione #1 che memorizza questo intervallo di chiavi. Ci sono varie strategie di suddivisione:<\/p>\n<p>HexStringSplit \u2013 Converte la chiave in una stringa con codifica esadecimale nell'intervallo \u00ab00000000\u00bb =&gt; \u00abFFFFFFFF\u00bb, riempiendo a sinistra con zeri.<\/p>\n<p>UniformSplit \u2013 Trasforma una chiave in un array di byte con codifica esadecimale nell'intervallo \"00\" =&gt; \"FF\", riempiendo gli spazi a destra con zeri.<\/p>\n<p>Inoltre, \u00e8 possibile specificare qualsiasi intervallo o insieme di chiavi per la suddivisione e configurare l'auto-split. Tuttavia, uno degli approcci pi\u00f9 semplici ed efficaci \u00e8 UniformSplit e l'uso della concatenazione dell'hash, ad esempio la coppia di byte pi\u00f9 significativa derivante dall'elaborazione della chiave tramite la funzione CRC32(rowkey) e la chiave stessa:<\/p>\n<p>hash + rowkey<\/p>\n<p>In questo modo, tutti i dati saranno distribuiti uniformemente tra le regioni. Durante la lettura, i primi due byte vengono semplicemente scartati e rimane la chiave originale. Inoltre, RS controlla la quantit\u00e0 di dati e chiavi nella regione e, al superamento dei limiti, la suddivide automaticamente in parti. <\/p>\n<h2>7. Resilienza e localit\u00e0 dei dati<\/h2>\n<p>\nPoich\u00e9 ogni insieme di chiavi \u00e8 gestito da una sola regione, la soluzione ai problemi legati ai guasti di RS o all'interruzione del servizio \u00e8 quella di memorizzare tutti i dati necessari in HDFS. In caso di guasto di un RS, il master lo rileva attraverso l'assenza di heartbeat nel nodo ZooKeeper. Allora assegna la regione a un altro RS e, poich\u00e9 gli HFiles sono archiviati nel file system distribuito, il nuovo proprietario li legge e continua a servire i dati. Tuttavia, poich\u00e9 parte dei dati potrebbe trovarsi in MemStore e non essere ancora stata trasferita in HFiles, per ripristinare la cronologia delle operazioni viene utilizzato il WAL, anch'esso archiviato in HDFS. Dopo aver applicato le modifiche, il RS \u00e8 in grado di rispondere alle richieste, ma il trasloco comporta il rischio che parte dei dati e i processi ad essi associati si trovino su nodi diversi, riducendo cos\u00ec la locality. <\/p>\n<p>La soluzione al problema \u00e8 la major compaction: questa procedura sposta i file sui nodi che li gestiscono (dove sono ubicati i loro regioni), con un conseguente aumento significativo del carico sulla rete e sui dischi durante questa operazione. Tuttavia, in seguito, l'accesso ai dati risulta notevolmente pi\u00f9 veloce. Inoltre, la major_compaction unisce tutti gli HFile in un unico file all'interno della regione e pulisce i dati in base alle impostazioni della tabella. Ad esempio, \u00e8 possibile specificare il numero di versioni di un oggetto da mantenere o il tempo di vita dopo il quale l'oggetto viene eliminato fisicamente.<\/p>\n<p>Questa procedura pu\u00f2 avere un impatto molto positivo sul funzionamento di HBase. Nella figura sottostante si pu\u00f2 vedere come le prestazioni siano deteriorate a causa della scrittura attiva di dati. Qui si pu\u00f2 osservare come 40 flussi scrivano in una tabella mentre 40 flussi leggono dati simultaneamente. I flussi di scrittura generano un numero crescente di HFiles, che vengono letti dagli altri flussi. Di conseguenza, sempre pi\u00f9 dati devono essere rimossi dalla memoria e alla fine inizia a funzionare il GC, che praticamente paralizza tutto il sistema. L'avvio di una major compaction ha portato alla pulizia delle congestioni accumulate e al ripristino delle prestazioni.<\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di HBase\" src=\"\/wp-content\/uploads\/2020\/01\/6c93b2c10c197663785d3de0bb185481.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIl test \u00e8 stato eseguito su 3 DataNode e 4 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 thread). Versione HBase 1.2.0-cdh5.14.2<\/p>\n<p>\u00c8 importante sottolineare che il processo di major compaction \u00e8 stato eseguito su una tabella \"vivente\", in cui venivano attivamente scritti e letti dati. In rete si \u00e8 sostenuto che ci\u00f2 potrebbe portare a risposte errate durante la lettura dei dati. Per verificare, \u00e8 stato avviato un processo che generava nuovi dati e li scriveva nella tabella. Successivamente, i dati venivano immediatamente letti e confrontati per vedere se il valore ottenuto corrispondesse a quello registrato. Durante l'esecuzione di questo processo, il major compaction \u00e8 stato avviato circa 200 volte senza registrare alcun errore. \u00c8 possibile che il problema si manifesti raramente e solo durante carichi elevati, quindi \u00e8 pi\u00f9 sicuro comunque fermare in modo programmato i processi di scrittura e lettura e eseguire la pulizia senza consentire tali cali di GC.<\/p>\n<p>Inoltre, il major compaction non influisce sullo stato del MemStore; per svuotarlo su disco e compattarlo, \u00e8 necessario utilizzare il flush (connection.getAdmin().flush(TableName.valueOf(tblName))).<\/p>\n<h2>8. Impostazioni e prestazioni<\/h2>\n<p>\nCome gi\u00e0 detto, HBase ha un successo maggiore quando non deve eseguire operazioni, durante il BulkLoad. Tuttavia, questo vale per la maggior parte dei sistemi e delle persone. Questo strumento \u00e8 pi\u00f9 adatto per l'inserimento massivo di dati in blocchi, mentre, se il processo richiede l'esecuzione di molte richieste concorrenti di lettura e scrittura, vengono utilizzati i comandi Get e Put descritti precedentemente. Per determinare i parametri ottimali, sono stati eseguiti test con diverse combinazioni di parametri delle tabelle e impostazioni.<\/p>\n<ul>\n<li>Sono stati avviati 10 thread contemporaneamente per 3 volte di seguito (chiamiamo questo un blocco di thread). <\/li>\n<li>Il tempo di esecuzione di tutti i thread nel blocco \u00e8 stato mediato e rappresenta il risultato finale del blocco.<\/li>\n<li>Tutti i thread lavoravano sulla stessa tabella. <\/li>\n<li>Prima di ciascun avvio del blocco di thread, veniva eseguita una major compaction.<\/li>\n<li>Ogni blocco eseguiva solo una delle seguenti operazioni: <\/li>\n<\/ul>\n<p>\n \u2014 Put<br \/>\n \u2014 Get<br \/>\n \u2014 Get+Put<\/p>\n<ul>\n<li>Ogni blocco eseguiva 50.000 ripetizioni della propria operazione.<\/li>\n<li>La dimensione della scrittura nel blocco era di 100 byte, 1000 byte o 10000 byte (random).<\/li>\n<li>I blocchi venivano avviati con un numero variabile di chiavi richieste (o una chiave o 10).<\/li>\n<li>I blocchi venivano avviati con diverse impostazioni della tabella. I parametri modificati erano:<\/li>\n<\/ul>\n<p>\n \u2014 BlockCache = attivato o disattivato<br \/>\n \u2014 BlockSize = 65 KB o 16 KB<br \/>\n \u2014 Partizioni = 1, 5 o 30<br \/>\n \u2014 MSLAB = attivato o disattivato<\/p>\n<p>In questo modo, il blocco appare cos\u00ec:<\/p>\n<p>a. La modalit\u00e0 MSLAB era attivata\/disattivata.<br \/>\nb. Veniva creata una tabella con i seguenti parametri: BlockCache = true\/none, BlockSize = 65\/16 KB, Partizioni = 1\/5\/30. <br \/>\nc. Veniva impostata la compressione GZ.<br \/>\nd. Venivano avviati 10 thread contemporaneamente che eseguivano 1\/10 operazioni put\/get\/get+put su questa tabella con registrazioni di 100\/1000\/10000 byte, effettuando 50.000 richieste consecutive (chiavi randomiche).<br \/>\ne. Il punto d veniva ripetuto tre volte.<br \/>\nf. Il tempo di esecuzione di tutti i thread veniva mediato. <\/p>\n<p>Sono state verificate tutte le possibili combinazioni. \u00c8 prevedibile che, con un aumento delle dimensioni delle registrazioni, la velocit\u00e0 diminuisca, o che disabilitare la cache porti a un rallentamento. Tuttavia, l'obiettivo era comprendere il grado e l'importanza dell'influenza di ciascun parametro, quindi i dati raccolti sono stati forniti come input a una funzione di regressione lineare, che consente di valutare l'affidabilit\u00e0 tramite la statistica t. Di seguito sono riportati i risultati degli incrementi delle operazioni Put. L'insieme completo delle combinazioni \u00e8 pari a 2*2*3*2*3 = 144 varianti + 72 poich\u00e9 alcune sono state eseguite due volte. Pertanto, in totale ci sono stati 216 esecuzioni:<\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di HBase\" src=\"\/wp-content\/uploads\/2020\/01\/7a13c7a9b3ff1859976800f5d45cd51b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIl test \u00e8 stato effettuato su un mini-cluster composto da 3 DataNode e 4 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 thread). Versione HBase 1.2.0-cdh5.14.2.<\/p>\n<p>La velocit\u00e0 di inserimento pi\u00f9 alta, 3.7 secondi, \u00e8 stata ottenuta con la modalit\u00e0 MSLAB disabilitata, su una tabella con una sola partizione, con BlockCache attivato, BlockSize = 16, registrazioni di 100 byte in pacchetti da 10.<br \/>\nLa velocit\u00e0 di inserimento pi\u00f9 bassa, 82.8 secondi, \u00e8 stata ottenuta con la modalit\u00e0 MSLAB attivata, su una tabella con una sola partizione, con BlockCache attivato, BlockSize = 16, registrazioni di 10000 byte per 1.<\/p>\n<p>Ora diamo un'occhiata al modello. Vediamo una buona qualit\u00e0 del modello secondo R2, ma \u00e8 chiaro che l'estrapolazione qui \u00e8 sconsigliata. Il comportamento reale del sistema al variare dei parametri non sar\u00e0 lineare; questo modello non \u00e8 utile per previsioni, ma per comprendere cosa \u00e8 accaduto entro i parametri stabiliti. Ad esempio, qui vediamo secondo il criterio di Student che per l'operazione Put i parametri BlockSize e BlockCache non hanno significato (cosa abbastanza prevedibile):<\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di HBase\" src=\"\/wp-content\/uploads\/2020\/01\/2fb65d1809d53f2b47f4f8829a9efc65.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTuttavia, il fatto che l'aumento del numero di partizioni porti a una diminuzione delle prestazioni \u00e8 piuttosto inaspettato (avevamo gi\u00e0 visto un impatto positivo dell'aumento delle partizioni durante il BulkLoad), sebbene sia spiegabile. In primo luogo, per l'elaborazione si devono formare richieste a 30 regioni anzich\u00e9 a una sola, e la quantit\u00e0 di dati non \u00e8 tale da giustificare un guadagno. In secondo luogo, il tempo totale di esecuzione \u00e8 determinato dal RS pi\u00f9 lento, e poich\u00e9 il numero di DataNode \u00e8 inferiore a quello degli RS, alcune regioni hanno una localit\u00e0 nulla. Andiamo a vedere i cinque leader:<\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di HBase\" src=\"\/wp-content\/uploads\/2020\/01\/8ad7e832879156eaa96e630458405cdc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOra valutiamo i risultati dell'esecuzione dei blocchi Get:<\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di HBase\" src=\"\/wp-content\/uploads\/2020\/01\/8a5dd45422c74e8815011d7e9b805ccb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIl numero di partizioni ha perso importanza, probabilmente perch\u00e9 i dati vengono ben memorizzati nella cache e la cache per la lettura \u00e8 il parametro pi\u00f9 significativo (statisticamente). Naturalmente, un aumento del numero di messaggi nella richiesta \u00e8 anch'esso molto utile per le prestazioni. I migliori risultati:<\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di HBase\" src=\"\/wp-content\/uploads\/2020\/01\/9d237f9fdbeaf5412daec2fc2fa24b01.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nE infine, diamo un'occhiata al modello del blocco che prima eseguiva il get e poi il put:<\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di HBase\" src=\"\/wp-content\/uploads\/2020\/01\/75137207a4a69acccad036882794094b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nQui tutti i parametri sono significativi. E i risultati dei leader:<\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di HBase\" src=\"\/wp-content\/uploads\/2020\/01\/c166933d81e86f36958e3af58297f876.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>9. Test di carico<\/h2>\n<p>\nInfine, eseguiremo un carico piuttosto consistente, ma \u00e8 sempre pi\u00f9 interessante avere qualcosa con cui confrontarsi. Sul sito di DataStax \u2013 il principale sviluppatore di Cassandra, c'\u00e8 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.datastax.com\/wp-content\/themes\/datastax-2014-08\/files\/NoSQL_Benchmarks_EndPoint.pdf\">i risultati<\/a><\/noindex> una gamma di archivi NoSQL, incluso HBase versione 0.98.6-1. Il caricamento \u00e8 stato effettuato con 40 thread, dimensione dei dati 100 byte, dischi SSD. Il risultato del test delle operazioni Read-Modify-Write ha mostrato questi risultati.<\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di HBase\" src=\"\/wp-content\/uploads\/2020\/01\/521e9dff60f462e6dabebc1234e028be.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n Da quanto ho capito, la lettura \u00e8 stata effettuata in blocchi da 100 record e per 16 nodi HBase il test di DataStax ha mostrato una prestazione di 10.000 operazioni al secondo. <\/p>\n<p>\u00c8 positivo che nel nostro cluster ci siano anche 16 nodi, ma non \u00e8 molto \"positivo\" che ci siano 64 core (thread) su ciascuno, mentre nel test di DataStax solo 4. D'altra parte, loro hanno dischi SSD, mentre noi HDD e una versione HBase pi\u00f9 recente, e l'utilizzo della CPU durante il carico \u00e8 aumentato solo di poco (visualmente del 5-10 percento). Tuttavia, proviamo a partire con questa configurazione. Le impostazioni delle tabelle sono quelle predefinite, e la lettura avviene nell'intervallo di chiavi da 0 a 50 milioni in modo casuale (cio\u00e8, sostanzialmente ogni volta \u00e8 nuova). La tabella contiene 50 milioni di record, suddivisi in 64 partizioni. Le chiavi sono hashate tramite crc32. Le impostazioni delle tabelle sono predefinite, MSLAB \u00e8 attivato. Avviamo 40 thread, ognuno dei quali legge un insieme di 100 chiavi casuali e immediatamente riscrive 100 byte generati su queste chiavi. <\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di HBase\" src=\"\/wp-content\/uploads\/2020\/01\/776490f01121cc434135f733311b7722.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n Stand: 16 DataNode e 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 thread). Versione HBase 1.2.0-cdh5.14.2.<\/p>\n<p>Il risultato medio si avvicina a 40.000 operazioni al secondo, che \u00e8 significativamente meglio rispetto al test di DataStax. Tuttavia, per scopi di esperimento, \u00e8 possibile modificare leggermente le condizioni. \u00c8 piuttosto improbabile che tutto il lavoro venga eseguito esclusivamente su una sola tabella e solo con chiavi uniche. Supponiamo che ci sia un certo insieme \"caldo\" di chiavi che genera il carico principale. Pertanto, proviamo a creare un carico con record pi\u00f9 grandi (10 KB), anche a batch di 100, in 4 tabelle diverse e limitando il range delle chiavi richieste a 50.000. Nel grafico qui sotto viene mostrato il lancio di 40 thread, ogni thread legge un insieme di 100 chiavi e quindi scrive immediatamente 10 KB casuali su queste chiavi. <\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di HBase\" src=\"\/wp-content\/uploads\/2020\/01\/30d29f1b98663e3c07cb2be20e93876a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nStand: 16 DataNode e 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 thread). Versione HBase 1.2.0-cdh5.14.2.<\/p>\n<p>Durante il carico, pi\u00f9 volte \u00e8 stata eseguita una major compaction; come mostrato sopra, senza questa procedura le prestazioni degraderanno gradualmente, tuttavia durante l'esecuzione si verifica anche un carico aggiuntivo. I cali di prestazione sono causati da diverse ragioni. A volte i thread terminavano il lavoro e mentre venivano riavviati si verificava una pausa, altre volte applicazioni esterne creavano un carico sul cluster.<\/p>\n<p>La lettura e la scrittura immediata sono uno dei scenari di lavoro pi\u00f9 gravosi per HBase. Se si effettuano solo richieste di put di piccole dimensioni, ad esempio di 100 byte, raggruppandole in pacchetti da 10.000 a 50.000, \u00e8 possibile ottenere centinaia di migliaia di operazioni al secondo, ed \u00e8 lo stesso per le richieste di sola lettura. \u00c8 importante notare che i risultati sono radicalmente migliori rispetto a quelli ottenuti da DataStax, principalmente grazie alle richieste in blocco da 50.000.<\/p>\n<p><img decoding=\"async\" alt=\"Teoria e pratica dell&#039;uso di HBase\" src=\"\/wp-content\/uploads\/2020\/01\/412bda50a55093224169f048ea2f863a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nStand: 16 DataNode e 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 thread). Versione HBase 1.2.0-cdh5.14.2.<\/p>\n<h2>10. Conclusioni<\/h2>\n<p>\nQuesto sistema \u00e8 abbastanza flessibile nella personalizzazione, ma rimane sconosciuto l'impatto di un gran numero di parametri. Alcuni di essi sono stati testati, ma non sono stati inclusi nel set di test risultante. Ad esempio, esperimenti preliminari hanno mostrato una significativit\u00e0 marginale di un parametro come DATA_BLOCK_ENCODING, che codifica informazioni utilizzando valori da celle vicine, cosa che \u00e8 facilmente spiegabile per dati generati casualmente. Nel caso di un grande numero di oggetti ripetuti, i guadagni possono essere significativi. In generale, si pu\u00f2 dire che HBase sembra un database piuttosto serio e ben progettato, che pu\u00f2 essere molto performante nelle operazioni con grandi blocchi di dati, specialmente se c'\u00e8 la possibilit\u00e0 di distribuire nel tempo i processi di lettura e scrittura.<\/p>\n<p>Se qualcosa non \u00e8 stato sufficientemente approfondito, sono disponibile a raccontare di pi\u00f9. Vi incoraggio a condividere la vostra esperienza o a discutere se non siete d'accordo su qualcosa.<br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/sberbank\/blog\/420425\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u0430\u043d\u0438\u043b \u041b\u0438\u043f\u043e\u0432\u043e\u0439, \u043d\u0430\u0448\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0432 \u0421\u0431\u0435\u0440\u0442\u0435\u0445\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c HBase \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0445\u043e\u0434\u0435 \u0435\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u0441\u044f \u043e\u043f\u044b\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u043f\u0438\u0441\u0430\u0442\u044c (\u043d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u0438\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e). \u0412\u0441\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u043d\u0438\u0436\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u0441 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 HBase 1.2.0-cdh5.14.2 \u0438 2.0.0-cdh6.0.0-beta1. \u041e\u0431\u0449\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0417\u0430\u043f\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 HBASE \u0427\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 HBASE [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-55302","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u0430\u043d\u0438\u043b \u041b\u0438\u043f\u043e\u0432\u043e\u0439, \u043d\u0430\u0448\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0432 \u0421\u0431\u0435\u0440\u0442\u0435\u0445\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c HBase \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0445\u043e\u0434\u0435 \u0435\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u0441\u044f \u043e\u043f\u044b\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u043f\u0438\u0441\u0430\u0442\u044c (\u043d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u0438\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e). \u0412\u0441\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u043d\u0438\u0436\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u0441 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 HBase 1.2.0-cdh5.14.2 \u0438 2.0.0-cdh6.0.0-beta1. \u041e\u0431\u0449\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0417\u0430\u043f\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 HBASE \u0427\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 HBASE\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0422\u0435\u043e\u0440\u0438\u044f \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f HBase | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u0430\u043d\u0438\u043b \u041b\u0438\u043f\u043e\u0432\u043e\u0439, \u043d\u0430\u0448\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0432 \u0421\u0431\u0435\u0440\u0442\u0435\u0445\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c HBase \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0445\u043e\u0434\u0435 \u0435\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u0441\u044f \u043e\u043f\u044b\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u043f\u0438\u0441\u0430\u0442\u044c (\u043d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u0438\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e). \u0412\u0441\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u043d\u0438\u0436\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u0441 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 HBase 1.2.0-cdh5.14.2 \u0438 2.0.0-cdh6.0.0-beta1. \u041e\u0431\u0449\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0417\u0430\u043f\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 HBASE \u0427\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 HBASE\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-01-16T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:03:24+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Teoria e pratica dell'uso di HBase | ProHoster","description":"Buongiorno! Mi chiamo Danil Lipovoy, il nostro team in Sbertech ha iniziato a utilizzare HBase come sistema di archiviazione per i dati operativi. Durante lo studio di questo strumento, abbiamo accumulato esperienza che vorremmo sistematizzare e descrivere (ci auguriamo che possa essere utile a molti). Tutti gli esperimenti riportati di seguito sono stati condotti con le versioni HBase 1.2.0-cdh5.14.2 e 2.0.0-cdh6.0.0-beta1. Architettura generale Scrittura di dati in HBase Lettura di dati da HBase","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0422\u0435\u043e\u0440\u0438\u044f \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f HBase | ProHoster","og:description":"\u0414\u043e\u0431\u0440\u044b\u0439 \u0434\u0435\u043d\u044c! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u0414\u0430\u043d\u0438\u043b \u041b\u0438\u043f\u043e\u0432\u043e\u0439, \u043d\u0430\u0448\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0432 \u0421\u0431\u0435\u0440\u0442\u0435\u0445\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c HBase \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u0445\u043e\u0434\u0435 \u0435\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u0441\u044f \u043e\u043f\u044b\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438 \u043e\u043f\u0438\u0441\u0430\u0442\u044c (\u043d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u0438\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u043e). \u0412\u0441\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u043d\u0438\u0436\u0435 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c \u0441 \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 HBase 1.2.0-cdh5.14.2 \u0438 2.0.0-cdh6.0.0-beta1. \u041e\u0431\u0449\u0430\u044f \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u0417\u0430\u043f\u0438\u0441\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 HBASE \u0427\u0442\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 HBASE","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-01-16T21:00:00+00:00","article:modified_time":"2020-02-18T11:03:24+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"55302","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:46:28","updated":"2022-09-28 08:11:41"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/55302","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=55302"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/55302\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=55302"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=55302"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=55302"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}