{"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\/fr\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase","title":{"rendered":"Th\u00e9orie et pratique de l'utilisation d'HBase","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Bonjour ! Je m'appelle Danil Lipovoy, notre \u00e9quipe chez Sbertech a commenc\u00e9 \u00e0 utiliser HBase comme stockage de donn\u00e9es op\u00e9rationnelles. Au cours de son \u00e9tude, nous avons accumul\u00e9 de l'exp\u00e9rience que nous souhaitions syst\u00e9matiser et d\u00e9crire (nous esp\u00e9rons que cela sera utile \u00e0 beaucoup). Toutes les exp\u00e9riences ci-dessous ont \u00e9t\u00e9 r\u00e9alis\u00e9es avec les versions HBase 1.2.0-cdh5.14.2 et 2.0.0-cdh6.0.0-beta1. <\/p>\n<ol>\n<li>Architecture g\u00e9n\u00e9rale <\/li>\n<li>\u00c9criture de donn\u00e9es dans HBASE<\/li>\n<li>Lecture de donn\u00e9es depuis HBASE<\/li>\n<li>Mise en cache des donn\u00e9es<\/li>\n<li>Traitement par lots des donn\u00e9es MultiGet \/ MultiPut<\/li>\n<li>Strat\u00e9gie de partitionnement des tables en r\u00e9gions (sharding)<\/li>\n<li>Tol\u00e9rance aux pannes, compactage et localit\u00e9 des donn\u00e9es<\/li>\n<li>Configurations et performances<\/li>\n<li>Test de charge<\/li>\n<li>Conclusions<\/li>\n<\/ol>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>1. Architecture g\u00e9n\u00e9rale<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Th\u00e9orie et pratique de l&#039;utilisation d&#039;HBase\" src=\"\/wp-content\/uploads\/2020\/01\/30800d8a48de4c52ff1650a4f1dec4c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nUn Master de secours \u00e9coute le heartbeat du ma\u00eetre actif sur le n\u0153ud ZooKeeper et, en cas de disparition, prend les fonctions du ma\u00eetre. <\/p>\n<h2>2. \u00c9criture de donn\u00e9es dans HBASE<\/h2>\n<p>\nCommen\u00e7ons par le cas le plus simple : \u00e9crire un objet cl\u00e9-valeur dans une table \u00e0 l'aide de put(rowkey). Le client doit d'abord d\u00e9terminer o\u00f9 se trouve le serveur de r\u00e9gion racine (Root Region Server - RRS) qui stocke la table hbase:meta. Cette information est obtenue aupr\u00e8s de ZooKeeper. Ensuite, il s'adresse au RRS et lit la table hbase:meta, d'o\u00f9 il extrait l'information sur le RegionServer (RS) responsable du stockage des donn\u00e9es selon la cl\u00e9 rowkey donn\u00e9e dans la table qui l'int\u00e9resse. Pour une utilisation ult\u00e9rieure, la m\u00e9ta-table est mise en cache par le client et donc les acc\u00e8s suivants se font plus rapidement, directement aupr\u00e8s du RS.<\/p>\n<p>Ensuite, le RS, ayant re\u00e7u la requ\u00eate, \u00e9crit d'abord celle-ci dans le WriteAheadLog (WAL), ce qui est n\u00e9cessaire pour la r\u00e9cup\u00e9ration en cas de panne. Il enregistre ensuite les donn\u00e9es dans le MemStore. C'est un tampon en m\u00e9moire qui contient un ensemble de cl\u00e9s tri\u00e9es de cette r\u00e9gion. La table peut \u00eatre divis\u00e9e en r\u00e9gions (partitions), chacune d'elles contenant un ensemble de cl\u00e9s disjointes. Cela permet, en pla\u00e7ant les r\u00e9gions sur diff\u00e9rents serveurs, d'obtenir des performances plus \u00e9lev\u00e9es. Cependant, malgr\u00e9 l'\u00e9vidence de cette affirmation, nous verrons par la suite que cela ne fonctionne pas dans tous les cas.<\/p>\n<p>Apr\u00e8s avoir plac\u00e9 l'enregistrement dans le MemStore, le client re\u00e7oit une r\u00e9ponse indiquant que l'enregistrement a \u00e9t\u00e9 enregistr\u00e9 avec succ\u00e8s. En r\u00e9alit\u00e9, il est uniquement stock\u00e9 dans le tampon et ne sera \u00e9crit sur le disque qu'apr\u00e8s un certain intervalle de temps ou lorsque celui-ci sera rempli de nouvelles donn\u00e9es. <\/p>\n<p><img decoding=\"async\" alt=\"Th\u00e9orie et pratique de l&#039;utilisation d&#039;HBase\" src=\"\/wp-content\/uploads\/2020\/01\/10f4d5d600a20882690f5cc81322bc41.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLors de l'op\u00e9ration \u00abDelete\u00bb, il n'y a pas de suppression physique des donn\u00e9es. Elles sont simplement marqu\u00e9es comme supprim\u00e9es, et la destruction effective se produit lors de l'appel \u00e0 la fonction major compact, dont les d\u00e9tails sont donn\u00e9s au point 7.<\/p>\n<p>Les fichiers au format HFile s'accumulent dans HDFS et de temps en temps, un processus de minor compact est lanc\u00e9, qui fusionne simplement les petits fichiers en de plus gros, sans rien supprimer. Au fil du temps, cela devient un probl\u00e8me qui se manifeste uniquement lors de la lecture des donn\u00e9es (nous y reviendrons un peu plus tard). <\/p>\n<p>En plus du processus de chargement d\u00e9crit ci-dessus, il existe une proc\u00e9dure beaucoup plus efficace, qui constitue sans doute le principal atout de cette base de donn\u00e9es \u2013 BulkLoad. Elle consiste \u00e0 former nous-m\u00eames des HFiles et \u00e0 les d\u00e9poser sur le disque, ce qui permet un excellent passage \u00e0 l'\u00e9chelle et d'atteindre des vitesses tr\u00e8s satisfaisantes. En fait, la limite ici n'est pas HBase, mais les capacit\u00e9s mat\u00e9rielles. Ci-dessous, vous trouverez les r\u00e9sultats de chargement sur un cluster compos\u00e9 de 16 RegionServers et de 16 NodeManagers YARN (CPU Xeon E5-2680 v4 @ 2,40 GHz * 64 threads), version HBase 1.2.0-cdh5.14.2. <\/p>\n<p><img decoding=\"async\" alt=\"Th\u00e9orie et pratique de l&#039;utilisation d&#039;HBase\" src=\"\/wp-content\/uploads\/2020\/01\/4e4452b216eda3269a364ea97c49120f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIci, on constate qu'en augmentant le nombre de partitions (r\u00e9gions) dans la table, ainsi que le nombre d'ex\u00e9cuteurs Spark, on obtient une augmentation de la vitesse de chargement. La vitesse d\u00e9pend \u00e9galement du volume d'\u00e9criture. Les gros blocs donnent un gain en termes de Mo\/s, tandis que les petits blocs augmentent le nombre d'enregistrements ins\u00e9r\u00e9s par unit\u00e9 de temps, toutes choses \u00e9gales par ailleurs. <\/p>\n<p>Il est \u00e9galement possible de lancer le chargement dans deux tables simultan\u00e9ment et de doubler la vitesse. Ci-dessous, on peut voir que l'\u00e9criture de blocs de 10 Ko dans deux tables se fait \u00e0 une vitesse d'environ 600 Mo\/s chacune (soit un total de 1275 Mo\/s), ce qui correspond \u00e0 la vitesse d'\u00e9criture dans une seule table de 623 Mo\/s (voir n\u00b011 ci-dessus).<\/p>\n<p><img decoding=\"async\" alt=\"Th\u00e9orie et pratique de l&#039;utilisation d&#039;HBase\" src=\"\/wp-content\/uploads\/2020\/01\/9f1b4fc0c80b797111494d400e9ce332.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLors du second lancement avec des \u00e9critures de 50 Ko, on constate que la vitesse de chargement n'augmente plus de mani\u00e8re significative, ce qui indique que l'on approche des valeurs limites. Il convient \u00e9galement de noter qu'il n'y a pratiquement pas de charge sur HBASE ici, tout ce qui est requis de lui est d'abord de renvoyer les donn\u00e9es de hbase:meta, puis apr\u00e8s le d\u00e9p\u00f4t des HFiles, de vider les donn\u00e9es du BlockCache et de sauvegarder le buffer MemStore sur le disque, s'il n'est pas vide.<\/p>\n<h2>3. Lecture des donn\u00e9es depuis HBASE<\/h2>\n<p>\nSi l'on consid\u00e8re que toutes les informations de hbase:meta sont d\u00e9j\u00e0 disponibles pour le client (voir point 2), la requ\u00eate est envoy\u00e9e imm\u00e9diatement au RS o\u00f9 la cl\u00e9 d\u00e9sir\u00e9e est stock\u00e9e. Tout d'abord, la recherche s'effectue dans MemCache. Que des donn\u00e9es y soient pr\u00e9sentes ou non, la recherche s'effectue \u00e9galement dans le tampon BlockCache et, si n\u00e9cessaire, dans HFiles. Si des donn\u00e9es sont trouv\u00e9es dans le fichier, elles sont plac\u00e9es dans BlockCache et seront retourn\u00e9es plus rapidement lors de la prochaine requ\u00eate. La recherche dans HFile se fait relativement rapidement gr\u00e2ce \u00e0 l'utilisation du filtre de Bloom, c'est-\u00e0-dire qu'en lisant un petit volume de donn\u00e9es, il d\u00e9termine imm\u00e9diatement si ce fichier contient la cl\u00e9 recherch\u00e9e, et si ce n'est pas le cas, il passe au suivant.<\/p>\n<p><img decoding=\"async\" alt=\"Th\u00e9orie et pratique de l&#039;utilisation d&#039;HBase\" src=\"\/wp-content\/uploads\/2020\/01\/a21b1b825a84cfd02507ec334e9452fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nApr\u00e8s avoir obtenu des donn\u00e9es de ces trois sources, le RS forme une r\u00e9ponse. En particulier, il peut transmettre plusieurs versions trouv\u00e9es d'un objet si le client a demand\u00e9 la gestion des versions.<\/p>\n<h2>4. Mise en cache des donn\u00e9es<\/h2>\n<p>\nLes tampons MemStore et BlockCache occupent jusqu'\u00e0 80 % de la m\u00e9moire on-heap allou\u00e9e au RS (le reste \u00e9tant r\u00e9serv\u00e9 aux t\u00e2ches de service du RS). Si le mode d'utilisation typique est tel que les processus \u00e9crivent et lisent imm\u00e9diatement ces m\u00eames donn\u00e9es, il est judicieux de r\u00e9duire BlockCache et d'augmenter MemStore, puisque lors de l'\u00e9criture, les donn\u00e9es ne sont pas mises en cache pour la lecture, rendant l'utilisation de BlockCache moins fr\u00e9quente. Le tampon BlockCache se compose de deux parties : LruBlockCache (toujours on-heap) et BucketCache (g\u00e9n\u00e9ralement off-heap ou sur SSD). BucketCache doit \u00eatre utilis\u00e9 lorsque les requ\u00eates de lecture sont tr\u00e8s nombreuses et qu'elles ne tiennent pas dans LruBlockCache, ce qui conduit \u00e0 un travail actif du Garbage Collector. Cependant, il ne faut pas attendre une augmentation radicale des performances gr\u00e2ce \u00e0 l'utilisation du cache de lecture, mais cela sera discut\u00e9 plus en d\u00e9tail au point 8.<\/p>\n<p><img decoding=\"async\" alt=\"Th\u00e9orie et pratique de l&#039;utilisation d&#039;HBase\" src=\"\/wp-content\/uploads\/2020\/01\/17d7791a998dd7da747cb7089dce1f10.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nBlockCache est unique pour tout le RS, tandis que MemStore est sp\u00e9cifique \u00e0 chaque table (un par Column Family).<\/p>\n<p>Comment <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.cloudera.com\/blog\/2012\/06\/hbase-write-path\/\">est d\u00e9crit<\/a><\/noindex> En th\u00e9orie, lors de l'\u00e9criture, les donn\u00e9es ne vont pas dans le cache et en effet, les param\u00e8tres CACHE_DATA_ON_WRITE pour la table et \u00ab Cache DATA on Write \u00bb pour le RS sont d\u00e9finis sur false. Cependant, en pratique, si l'on \u00e9crit des donn\u00e9es dans MemStore, puis que l'on les vide sur disque (effa\u00e7ant ainsi ce qu'il y a), puis que l'on supprime le fichier r\u00e9sultant, en effectuant la requ\u00eate get, nous obtenons avec succ\u00e8s les donn\u00e9es. M\u00eame si l'on d\u00e9sactive compl\u00e8tement BlockCache et que l'on remplit la table avec de nouvelles donn\u00e9es, ensuite pour provoquer la vidange de MemStore sur disque, les supprimer et les requ\u00e9rir d'une autre session, elles seront quand m\u00eame extraites de quelque part. Ainsi, HBase conserve non seulement des donn\u00e9es, mais aussi des myst\u00e8res myst\u00e9rieux.<\/p>\n<pre><code class=\"bash\">hbase(main):001:0&gt; create 'ns:magic', 'cf'\nTable ns:magic cr\u00e9\u00e9e\nTemps d'ex\u00e9cution 1.1533 secondes\nhbase(main):002:0&gt; put 'ns:magic', 'key1', 'cf:c', 'try_to_delete_me'\nTemps d'ex\u00e9cution 0.2610 secondes\nhbase(main):003:0&gt; flush 'ns:magic'\nTemps d'ex\u00e9cution 0.6161 secondes\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>\nLe param\u00e8tre \u00ab Cache DATA on Read \u00bb est d\u00e9fini sur false. Si vous avez des id\u00e9es, n'h\u00e9sitez pas \u00e0 en discuter dans les commentaires.<\/p>\n<h2>5. Traitement par lots de donn\u00e9es MultiGet\/MultiPut<\/h2>\n<p>\nLe traitement des requ\u00eates individuelles (Get\/Put\/Delete) est une op\u00e9ration assez co\u00fbteuse, il est donc recommand\u00e9 de les regrouper autant que possible dans une liste, ce qui permet d'obtenir un gain de performance significatif. Cela est particuli\u00e8rement vrai pour les op\u00e9rations d'\u00e9criture, tandis qu'il existe un inconv\u00e9nient lors de la lecture. Le graphique ci-dessous montre le temps de lecture de 50 000 enregistrements depuis MemStore. La lecture a \u00e9t\u00e9 effectu\u00e9e en un seul thread et l'axe horizontal montre le nombre de cl\u00e9s dans la requ\u00eate. Nous pouvons voir qu'en augmentant jusqu'\u00e0 mille cl\u00e9s dans une requ\u00eate, le temps d'ex\u00e9cution diminue, c'est-\u00e0-dire que la vitesse augmente. Cependant, en mode MSLAB par d\u00e9faut, apr\u00e8s ce seuil, il y a une chute radicale des performances, et plus le volume de donn\u00e9es dans l'enregistrement est important, plus le temps d'ex\u00e9cution augmente. <\/p>\n<p><img decoding=\"async\" alt=\"Th\u00e9orie et pratique de l&#039;utilisation d&#039;HBase\" src=\"\/wp-content\/uploads\/2020\/01\/42d3a77d66770a7fed03f83fecdca470.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLes tests ont \u00e9t\u00e9 r\u00e9alis\u00e9s sur une machine virtuelle, 8 c\u0153urs, version HBase 2.0.0-cdh6.0.0-beta1.<\/p>\n<p>Le mode MSLAB vise \u00e0 r\u00e9duire la fragmentation du tas, qui se produit \u00e0 cause du m\u00e9lange des donn\u00e9es de g\u00e9n\u00e9rations nouvelles et anciennes. Comme solution \u00e0 ce probl\u00e8me, lorsque MSLAB est activ\u00e9, les donn\u00e9es sont plac\u00e9es dans des cellules relativement petites (chunks) et trait\u00e9es par lots. En cons\u00e9quence, lorsque le volume du paquet de donn\u00e9es demand\u00e9 d\u00e9passe la taille allou\u00e9e, les performances chutent rapidement. D'autre part, la d\u00e9sactivation de ce mode n'est pas souhaitable non plus, car cela entra\u00eenera des pauses dues au GC lors de moments de travail intensif avec les donn\u00e9es. Une bonne solution consiste \u00e0 augmenter les volumes des cellules, en cas d'\u00e9criture active par put en m\u00eame temps que la lecture. Il convient de noter que le probl\u00e8me ne se pose pas si, apr\u00e8s l'\u00e9criture, nous ex\u00e9cutons la commande flush qui pousse MemStore sur le disque ou si un chargement est effectu\u00e9 par BulkLoad. Le tableau ci-dessous montre que les requ\u00eates provenant de MemStore de volumes de donn\u00e9es plus importants (et d'un nombre identique) entra\u00eenent un ralentissement. Cependant, en augmentant la taille des chunks, nous ramenons le temps de traitement \u00e0 la normale.<\/p>\n<p><img decoding=\"async\" alt=\"Th\u00e9orie et pratique de l&#039;utilisation d&#039;HBase\" src=\"\/wp-content\/uploads\/2020\/01\/0076215bd171257548f8a4c4d4229ba0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEn plus d'augmenter le chunksize, le partitionnement des donn\u00e9es par r\u00e9gions, c'est-\u00e0-dire le splitting des tables, aide. Cela signifie qu'un nombre r\u00e9duit de requ\u00eates est envoy\u00e9 \u00e0 chaque r\u00e9gion, et si elles sont toutes plac\u00e9es dans une cellule, la r\u00e9ponse reste bonne.<\/p>\n<h2>6. Strat\u00e9gie de partitionnement des tables par r\u00e9gions (splitting)<\/h2>\n<p>\n\u00c9tant donn\u00e9 qu'HBase est un stockage cl\u00e9-valeur et que le partitionnement s'effectue selon la cl\u00e9, il est essentiel de r\u00e9partir les donn\u00e9es de mani\u00e8re uniforme sur toutes les r\u00e9gions. Par exemple, le partitionnement d'une telle table en trois parties aura pour r\u00e9sultat que les donn\u00e9es seront r\u00e9parties sur trois r\u00e9gions :<\/p>\n<p><img decoding=\"async\" alt=\"Th\u00e9orie et pratique de l&#039;utilisation d&#039;HBase\" src=\"\/wp-content\/uploads\/2020\/01\/a811ae81e77b48dbf28ed86dbdc35739.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIl arrive que cela entra\u00eene un ralentissement drastique si les donn\u00e9es charg\u00e9es par la suite se pr\u00e9sentent sous la forme de valeurs long, majoritairement commen\u00e7ant par un m\u00eame chiffre, par exemple :<\/p>\n<p>1000001<br \/>\n1000002<br \/>\n\u2026<br \/>\n1100003<\/p>\n<p>Comme les cl\u00e9s sont stock\u00e9es sous forme de tableau d'octets, toutes commenceront de la m\u00eame mani\u00e8re et iront \u00e0 la r\u00e9gion #1 qui contient cette plage de cl\u00e9s. Il existe plusieurs strat\u00e9gies de partitionnement :<\/p>\n<p>HexStringSplit \u2013 Transforme la cl\u00e9 en une cha\u00eene avec un encodage hexad\u00e9cimal dans la plage \u00ab00000000\u00bb \u21d2 \u00abFFFFFFFF\u00bb, en remplissant avec des z\u00e9ros \u00e0 gauche.<\/p>\n<p>UniformSplit \u2013 Transforme la cl\u00e9 en un tableau d'octets avec un encodage hexad\u00e9cimal dans la plage \u00ab00\u00bb \u21d2 \u00abFF\u00bb, en remplissant avec des z\u00e9ros \u00e0 droite.<\/p>\n<p>De plus, il est possible de sp\u00e9cifier n'importe quelle plage ou ensemble de cl\u00e9s pour le partitionnement et de configurer le splitting automatique. Cependant, l'une des approches les plus simples et efficaces est UniformSplit et l'utilisation de la concat\u00e9nation de hachage, par exemple, la paire d'octets la plus significative provenant du passage de la cl\u00e9 par la fonction CRC32(rowkey) et la cl\u00e9 elle-m\u00eame :<\/p>\n<p>hash + rowkey<\/p>\n<p>Ainsi, toutes les donn\u00e9es seront r\u00e9parties uniform\u00e9ment sur les r\u00e9gions. Lors de la lecture, les deux premiers octets sont simplement ignor\u00e9s, et la cl\u00e9 d'origine reste. De plus, le RS contr\u00f4le le nombre de donn\u00e9es et de cl\u00e9s dans une r\u00e9gion et, si les limites sont d\u00e9pass\u00e9es, divise automatiquement celle-ci en parties. <\/p>\n<h2>7. R\u00e9silience et localit\u00e9 des donn\u00e9es<\/h2>\n<p>\n\u00c9tant donn\u00e9 qu'un seul r\u00e9gion est responsable de chaque ensemble de cl\u00e9s, la solution aux probl\u00e8mes li\u00e9s aux pannes de RS ou \u00e0 la mise hors service consiste \u00e0 stocker toutes les donn\u00e9es n\u00e9cessaires dans HDFS. En cas de panne de RS, le ma\u00eetre le d\u00e9tecte par l'absence de heartbeat sur le n\u0153ud ZooKeeper. Il assigne alors la r\u00e9gion \u00e0 un autre RS, et comme les HFiles sont stock\u00e9s dans un syst\u00e8me de fichiers distribu\u00e9, le nouveau propri\u00e9taire les lit et continue \u00e0 g\u00e9rer les donn\u00e9es. Cependant, comme certaines donn\u00e9es peuvent \u00eatre dans MemStore et n'ont pas encore \u00e9t\u00e9 \u00e9crites dans HFiles, l'historique des op\u00e9rations est restaur\u00e9 \u00e0 l'aide de WAL, qui sont \u00e9galement stock\u00e9s dans HDFS. Apr\u00e8s l'application des modifications, le RS peut r\u00e9pondre aux requ\u00eates, mais le transfert entra\u00eene une s\u00e9paration des donn\u00e9es et des processus de gestion sur diff\u00e9rents n\u0153uds, ce qui diminue la locality. <\/p>\n<p>La solution au probl\u00e8me est la compaction majeure \u2013 cette proc\u00e9dure d\u00e9place les fichiers vers les n\u0153uds responsables (l\u00e0 o\u00f9 se trouvent leurs r\u00e9gions), ce qui entra\u00eene une augmentation brutale de la charge sur le r\u00e9seau et les disques durant cette proc\u00e9dure. Cependant, par la suite, l'acc\u00e8s aux donn\u00e9es s'acc\u00e9l\u00e8re consid\u00e9rablement. De plus, la major_compaction fusionne tous les HFiles en un seul fichier au sein de la r\u00e9gion, et nettoie les donn\u00e9es en fonction des param\u00e8tres de la table. Par exemple, il est possible de d\u00e9finir le nombre de versions d'objet \u00e0 conserver ou la dur\u00e9e de vie apr\u00e8s laquelle l'objet est physiquement supprim\u00e9.<\/p>\n<p>Cette proc\u00e9dure peut avoir un impact tr\u00e8s positif sur le fonctionnement d'HBase. L'image ci-dessous montre comment la performance a \u00e9t\u00e9 d\u00e9grad\u00e9e en raison de l'\u00e9criture active de donn\u00e9es. On voit ici 40 threads \u00e9crivant dans une table et 40 threads lisant des donn\u00e9es simultan\u00e9ment. Les threads d'\u00e9criture g\u00e9n\u00e8rent de plus en plus de HFiles, qui sont ensuite lus par d'autres threads. En cons\u00e9quence, de plus en plus de donn\u00e9es doivent \u00eatre supprim\u00e9es de la m\u00e9moire, et finalement, le GC commence \u00e0 s'ex\u00e9cuter, paralysant pratiquement tout le processus. Le lancement de la compaction majeure a permis de nettoyer les encombrements g\u00e9n\u00e9r\u00e9s et de restaurer la performance.<\/p>\n<p><img decoding=\"async\" alt=\"Th\u00e9orie et pratique de l&#039;utilisation d&#039;HBase\" src=\"\/wp-content\/uploads\/2020\/01\/6c93b2c10c197663785d3de0bb185481.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLe test a \u00e9t\u00e9 r\u00e9alis\u00e9 sur 3 DataNodes et 4 RS (CPU Xeon E5-2680 v4 @ 2,40 GHz * 64 threads). Version HBase 1.2.0-cdh5.14.2<\/p>\n<p>Il convient de noter que le lancement de la compaction majeure a \u00e9t\u00e9 effectu\u00e9 sur une table \"vivante\", o\u00f9 des donn\u00e9es \u00e9taient activement lues et \u00e9crites. Il a \u00e9t\u00e9 avanc\u00e9 sur le r\u00e9seau que cela pourrait entra\u00eener une r\u00e9ponse incorrecte lors de la lecture des donn\u00e9es. Un processus a \u00e9t\u00e9 lanc\u00e9 pour g\u00e9n\u00e9rer de nouvelles donn\u00e9es et les \u00e9crire dans la table. Ensuite, il lisait imm\u00e9diatement et v\u00e9rifiait si la valeur obtenue correspondait \u00e0 celle qui avait \u00e9t\u00e9 enregistr\u00e9e. Pendant le fonctionnement de ce processus, la compaction majeure a \u00e9t\u00e9 lanc\u00e9e environ 200 fois sans aucun \u00e9chec enregistr\u00e9. Il est possible que le probl\u00e8me se manifeste rarement et uniquement lors de charges \u00e9lev\u00e9es, il est donc pr\u00e9f\u00e9rable d'arr\u00eater le processus d'\u00e9criture et de lecture de mani\u00e8re planifi\u00e9e et d'effectuer l'entretien sans permettre de telles baisses du GC.<\/p>\n<p>De plus, la compaction majeure n'affecte pas l'\u00e9tat du MemStore, pour le vider sur disque et le compacter, il faut utiliser flush (connection.getAdmin().flush(TableName.valueOf(tblName))).<\/p>\n<h2>8. Param\u00e8tres et performance<\/h2>\n<p>\nComme mentionn\u00e9 pr\u00e9c\u00e9demment, HBase montre le plus de succ\u00e8s l\u00e0 o\u00f9 il n'a rien \u00e0 faire, lors de l'ex\u00e9cution du BulkLoad. Cela s'applique d'ailleurs \u00e0 la plupart des syst\u00e8mes et des personnes. Cependant, cet outil est plus adapt\u00e9 \u00e0 l'insertion massive de donn\u00e9es par gros blocs, alors que si le processus n\u00e9cessite l'ex\u00e9cution de plusieurs requ\u00eates concurrentes de lecture et d'\u00e9criture, les commandes Get et Put d\u00e9crites ci-dessus sont utilis\u00e9es. Afin de d\u00e9terminer les param\u00e8tres optimaux, des ex\u00e9cutions ont \u00e9t\u00e9 r\u00e9alis\u00e9es avec diff\u00e9rentes combinaisons de param\u00e8tres de tables et de configurations :<\/p>\n<ul>\n<li>10 threads ont \u00e9t\u00e9 lanc\u00e9s simultan\u00e9ment 3 fois de suite (appelons cela un bloc de threads). <\/li>\n<li>Le temps de fonctionnement de tous les threads dans le bloc \u00e9tait moyen et constituait le r\u00e9sultat final du bloc.<\/li>\n<li>Tous les threads travaillaient avec la m\u00eame table. <\/li>\n<li>Avant chaque lancement du bloc de threads, une compaction majeure \u00e9tait effectu\u00e9e.<\/li>\n<li>Chaque bloc ne r\u00e9alisait qu'une des op\u00e9rations suivantes : <\/li>\n<\/ul>\n<p>\n \u2014 Put<br \/>\n \u2014 Get<br \/>\n \u2014 Get+Put<\/p>\n<ul>\n<li>Chaque bloc ex\u00e9cutait 50 000 r\u00e9p\u00e9titions de son op\u00e9ration.<\/li>\n<li>La taille d'enregistrement dans le bloc \u00e9tait de 100 octets, 1000 octets ou 10000 octets (al\u00e9atoire).<\/li>\n<li>Les blocs \u00e9taient lanc\u00e9s avec un nombre variable de cl\u00e9s demand\u00e9es (soit une cl\u00e9 ou 10).<\/li>\n<li>Les blocs \u00e9taient lanc\u00e9s avec diff\u00e9rentes configurations de table. Les param\u00e8tres ont \u00e9t\u00e9 modifi\u00e9s :<\/li>\n<\/ul>\n<p>\n \u2014 BlockCache = activ\u00e9 ou d\u00e9sactiv\u00e9<br \/>\n \u2014 BlockSize = 65 Ko ou 16 Ko<br \/>\n \u2014 Partitions = 1, 5 ou 30<br \/>\n \u2014 MSLAB = activ\u00e9 ou d\u00e9sactiv\u00e9<\/p>\n<p>Ainsi, le bloc se pr\u00e9sente comme suit :<\/p>\n<p>a. Le mode MSLAB \u00e9tait activ\u00e9\/d\u00e9sactiv\u00e9.<br \/>\nb. Un tableau a \u00e9t\u00e9 cr\u00e9\u00e9, pour lequel les param\u00e8tres suivants ont \u00e9t\u00e9 d\u00e9finis : BlockCache = true\/none, BlockSize = 65\/16 Ko, Partitions = 1\/5\/30. <br \/>\nc. La compression GZ a \u00e9t\u00e9 configur\u00e9e.<br \/>\nd. 10 threads \u00e9taient lanc\u00e9s simultan\u00e9ment, effectuant 1\/10 op\u00e9rations put\/get\/get+put dans ce tableau avec des enregistrements de 100\/1000\/10000 octets, ex\u00e9cutant 50 000 requ\u00eates cons\u00e9cutives (cl\u00e9s al\u00e9atoires).<br \/>\ne. Le point d a \u00e9t\u00e9 r\u00e9p\u00e9t\u00e9 trois fois.<br \/>\nf. Le temps de fonctionnement de tous les threads a \u00e9t\u00e9 moyenn\u00e9. <\/p>\n<p>Toutes les combinaisons possibles ont \u00e9t\u00e9 v\u00e9rifi\u00e9es. Il est pr\u00e9visible qu'en augmentant la taille de l'enregistrement, la vitesse diminuera ou que la d\u00e9sactivation du cache entra\u00eenera un ralentissement. Cependant, l'objectif \u00e9tait de comprendre l'ampleur et l'importance de l'influence de chaque param\u00e8tre, donc les donn\u00e9es collect\u00e9es ont \u00e9t\u00e9 soumises \u00e0 une fonction de r\u00e9gression lin\u00e9aire, ce qui permet d'\u00e9valuer la fiabilit\u00e9 \u00e0 l'aide de la statistique t. Ci-dessous sont les r\u00e9sultats des blocs ex\u00e9cutant des op\u00e9rations Put. L'ensemble complet de combinaisons est de 2*2*3*2*3 = 144 variantes + 72 car certaines ont \u00e9t\u00e9 ex\u00e9cut\u00e9es deux fois. Ainsi, au total, il y a eu 216 ex\u00e9cutions :<\/p>\n<p><img decoding=\"async\" alt=\"Th\u00e9orie et pratique de l&#039;utilisation d&#039;HBase\" src=\"\/wp-content\/uploads\/2020\/01\/7a13c7a9b3ff1859976800f5d45cd51b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLes tests ont \u00e9t\u00e9 r\u00e9alis\u00e9s sur un mini-cluster compos\u00e9 de 3 DataNodes et 4 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 threads). Version HBase 1.2.0-cdh5.14.2.<\/p>\n<p>La vitesse d'insertion la plus \u00e9lev\u00e9e de 3,7 secondes a \u00e9t\u00e9 obtenue en mode MSLAB d\u00e9sactiv\u00e9, sur une table avec une seule partition, avec BlockCache activ\u00e9, BlockSize = 16, des enregistrements de 100 octets en paquet de 10.<br \/>\nLa vitesse d'insertion la plus basse de 82,8 secondes a \u00e9t\u00e9 obtenue en mode MSLAB activ\u00e9, sur une table avec une seule partition, avec BlockCache activ\u00e9, BlockSize = 16, des enregistrements de 10000 octets par unit\u00e9.<\/p>\n<p>Voyons maintenant le mod\u00e8le. Nous voyons une bonne qualit\u00e9 de mod\u00e8le selon R2, mais il est clair que l'extrapolation est d\u00e9conseill\u00e9e ici. Le comportement r\u00e9el du syst\u00e8me lors de la variation des param\u00e8tres ne sera pas lin\u00e9aire, ce mod\u00e8le n'est pas destin\u00e9 \u00e0 des pr\u00e9visions, mais \u00e0 comprendre ce qui s'est produit dans les limites des param\u00e8tres donn\u00e9s. Par exemple, ici nous voyons selon le crit\u00e8re de Student, que pour l'op\u00e9ration Put, les param\u00e8tres BlockSize et BlockCache n'ont pas d'importance (ce qui est assez pr\u00e9visible) :<\/p>\n<p><img decoding=\"async\" alt=\"Th\u00e9orie et pratique de l&#039;utilisation d&#039;HBase\" src=\"\/wp-content\/uploads\/2020\/01\/2fb65d1809d53f2b47f4f8829a9efc65.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nIl est quelque peu inattendu que l'augmentation du nombre de partitions entra\u00eene une baisse des performances (nous avons d\u00e9j\u00e0 vu un impact positif de l'augmentation du nombre de partitions lors de BulkLoad), bien que cela soit explicable. Premi\u00e8rement, le traitement n\u00e9cessite de former des requ\u00eates pour 30 r\u00e9gions au lieu d'une seule, et le volume de donn\u00e9es n'est pas tel que cela en apporte un gain. Deuxi\u00e8mement, le temps d'ex\u00e9cution total est d\u00e9termin\u00e9 par le RS le plus lent, et comme le nombre de DataNode est inf\u00e9rieur \u00e0 celui des RS, certaines r\u00e9gions n'ont aucune localit\u00e9. Regardons donc les cinq leaders :<\/p>\n<p><img decoding=\"async\" alt=\"Th\u00e9orie et pratique de l&#039;utilisation d&#039;HBase\" src=\"\/wp-content\/uploads\/2020\/01\/8ad7e832879156eaa96e630458405cdc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00c9valuons maintenant les r\u00e9sultats des blocs Get :<\/p>\n<p><img decoding=\"async\" alt=\"Th\u00e9orie et pratique de l&#039;utilisation d&#039;HBase\" src=\"\/wp-content\/uploads\/2020\/01\/8a5dd45422c74e8815011d7e9b805ccb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLe nombre de partitions a perdu de son importance, ce qui s'explique probablement par le fait que les donn\u00e9es sont bien mises en cache et que le cache pour la lecture est le param\u00e8tre le plus significatif (statistiquement). \u00c9videmment, l'augmentation du nombre de messages dans la requ\u00eate est \u00e9galement tr\u00e8s b\u00e9n\u00e9fique pour les performances. Meilleurs r\u00e9sultats :<\/p>\n<p><img decoding=\"async\" alt=\"Th\u00e9orie et pratique de l&#039;utilisation d&#039;HBase\" src=\"\/wp-content\/uploads\/2020\/01\/9d237f9fdbeaf5412daec2fc2fa24b01.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEnfin, examinons le mod\u00e8le de bloc qui a d'abord ex\u00e9cut\u00e9 get, puis put :<\/p>\n<p><img decoding=\"async\" alt=\"Th\u00e9orie et pratique de l&#039;utilisation d&#039;HBase\" src=\"\/wp-content\/uploads\/2020\/01\/75137207a4a69acccad036882794094b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nTous les param\u00e8tres ici sont significatifs. Et les r\u00e9sultats des leaders :<\/p>\n<p><img decoding=\"async\" alt=\"Th\u00e9orie et pratique de l&#039;utilisation d&#039;HBase\" src=\"\/wp-content\/uploads\/2020\/01\/c166933d81e86f36958e3af58297f876.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>9. Tests de charge<\/h2>\n<p>\nEnfin, ex\u00e9cutons une charge plus ou moins cons\u00e9quente, mais c'est toujours plus int\u00e9ressant quand il y a quelque chose \u00e0 comparer. Sur le site de DataStax \u2013 le d\u00e9veloppeur cl\u00e9 de Cassandra, il y a <noindex><a rel=\"nofollow\" href=\"https:\/\/www.datastax.com\/wp-content\/themes\/datastax-2014-08\/files\/NoSQL_Benchmarks_EndPoint.pdf\">des r\u00e9sultats<\/a><\/noindex> des NT d'une s\u00e9rie de stockages NoSQL, y compris HBase version 0.98.6-1. Le chargement s'est fait avec 40 flux, taille des donn\u00e9es 100 octets, disques SSD. Le r\u00e9sultat des tests d'op\u00e9rations Read-Modify-Write a montr\u00e9 tels r\u00e9sultats.<\/p>\n<p><img decoding=\"async\" alt=\"Th\u00e9orie et pratique de l&#039;utilisation d&#039;HBase\" src=\"\/wp-content\/uploads\/2020\/01\/521e9dff60f462e6dabebc1234e028be.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n D'apr\u00e8s ce que j'ai compris, la lecture \u00e9tait effectu\u00e9e par blocs de 100 enregistrements et pour 16 n\u0153uds, le test DataStax sur HBase a montr\u00e9 une performance de 10 000 op\u00e9rations par seconde. <\/p>\n<p>Il est heureux que notre cluster dispose \u00e9galement de 16 n\u0153uds, mais il n'est pas tr\u00e8s \"heureux\" que chacun ait 64 c\u0153urs (flux), tandis que dans le test de DataStax, il n'y en avait que 4. D'un autre c\u00f4t\u00e9, ils ont des disques SSD, tandis que nous avons des HDD et une version HBase plus r\u00e9cente, et l'utilisation du CPU pendant la charge n'augmentait pratiquement pas (visuellement de 5 \u00e0 10 pour cent). Cependant, nous essayerons tout de m\u00eame de d\u00e9marrer avec cette configuration. Les param\u00e8tres des tables sont par d\u00e9faut, la lecture se fait sur une plage de cl\u00e9s de 0 \u00e0 50 millions de mani\u00e8re al\u00e9atoire (c'est-\u00e0-dire \u00e0 chaque fois un nouveau). Il y a 50 millions d'enregistrements dans la table, r\u00e9partis sur 64 partitions. Les cl\u00e9s sont hach\u00e9es par crc32. Les param\u00e8tres des tables sont par d\u00e9faut, MSLAB est activ\u00e9. D\u00e9marrage de 40 flux, chaque flux lit un ensemble de 100 cl\u00e9s al\u00e9atoires et \u00e9crit imm\u00e9diatement 100 octets g\u00e9n\u00e9r\u00e9s sur ces cl\u00e9s. <\/p>\n<p><img decoding=\"async\" alt=\"Th\u00e9orie et pratique de l&#039;utilisation d&#039;HBase\" src=\"\/wp-content\/uploads\/2020\/01\/776490f01121cc434135f733311b7722.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n Stand: 16 DataNodes et 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 flux). Version HBase 1.2.0-cdh5.14.2.<\/p>\n<p>Le r\u00e9sultat moyen est proche de 40 000 op\u00e9rations par seconde, ce qui est nettement mieux que dans le test de DataStax. Cependant, dans un souci d'exp\u00e9rimentation, il est possible de modifier l\u00e9g\u00e8rement les conditions. Il est peu probable que tout le travail se fasse uniquement avec une seule table et seulement avec des cl\u00e9s uniques. Supposons qu'il existe un certain ensemble \"chaud\" de cl\u00e9s qui g\u00e9n\u00e8re la principale charge. Nous allons donc essayer de cr\u00e9er une charge avec des enregistrements plus volumineux (10 Ko), \u00e9galement en paquets de 100, dans 4 tables diff\u00e9rentes et en limitant la plage des cl\u00e9s demand\u00e9es \u00e0 50 000. Le graphique ci-dessous montre le d\u00e9marrage de 40 flux, chaque flux lit un ensemble de 100 cl\u00e9s et \u00e9crit imm\u00e9diatement des 10 Ko al\u00e9atoires sur ces cl\u00e9s. <\/p>\n<p><img decoding=\"async\" alt=\"Th\u00e9orie et pratique de l&#039;utilisation d&#039;HBase\" src=\"\/wp-content\/uploads\/2020\/01\/30d29f1b98663e3c07cb2be20e93876a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nStand: 16 DataNodes et 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 flux). Version HBase 1.2.0-cdh5.14.2.<\/p>\n<p>Au cours de la charge, plusieurs ex\u00e9cutions de la compaction majeure ont \u00e9t\u00e9 lanc\u00e9es, comme indiqu\u00e9 ci-dessus, sans cette proc\u00e9dure la performance se d\u00e9grade progressivement, mais durant l'ex\u00e9cution, une charge suppl\u00e9mentaire se produit \u00e9galement. Les baisses de performance sont caus\u00e9es par diff\u00e9rentes raisons. Parfois, des flux terminaient leur travail et pendant qu'ils red\u00e9marraient, une pause survenait, parfois des applications tierces cr\u00e9aient une charge sur le cluster.<\/p>\n<p>La lecture et l'\u00e9criture simultan\u00e9es constituent l'un des sc\u00e9narios de travail les plus exigeants pour HBase. Si vous faites uniquement des requ\u00eates put de petite taille, par exemple de 100 octets, en les regroupant en lots de 10 \u00e0 50 000, vous pouvez obtenir des centaines de milliers d'op\u00e9rations par seconde, et il en va de m\u00eame pour les requ\u00eates en lecture seule. Il convient de noter que les r\u00e9sultats sont radicalement meilleurs que ceux obtenus avec DataStax, principalement gr\u00e2ce aux requ\u00eates en blocs de 50 000.<\/p>\n<p><img decoding=\"async\" alt=\"Th\u00e9orie et pratique de l&#039;utilisation d&#039;HBase\" src=\"\/wp-content\/uploads\/2020\/01\/412bda50a55093224169f048ea2f863a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nStand: 16 DataNodes et 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 flux). Version HBase 1.2.0-cdh5.14.2.<\/p>\n<h2>10. Conclusions<\/h2>\n<p>\nCe syst\u00e8me est suffisamment flexible, mais l'influence d'un grand nombre de param\u00e8tres demeure encore inconnue. Certains d'entre eux ont \u00e9t\u00e9 test\u00e9s, mais n'ont pas \u00e9t\u00e9 inclus dans l'ensemble de tests final. Par exemple, des exp\u00e9riences pr\u00e9liminaires ont montr\u00e9 que le param\u00e8tre DATA_BLOCK_ENCODING, qui code les informations en utilisant les valeurs des cellules voisines, a une signification l\u00e9g\u00e8rement insignifiante, ce qui est tout \u00e0 fait explicable pour des donn\u00e9es g\u00e9n\u00e9r\u00e9es de mani\u00e8re al\u00e9atoire. Dans le cas o\u00f9 un grand nombre d'objets r\u00e9p\u00e9titifs est utilis\u00e9, le gain peut \u00eatre significatif. En g\u00e9n\u00e9ral, on peut dire qu'HBase donne l'impression d'\u00eatre une base de donn\u00e9es assez s\u00e9rieuse et r\u00e9fl\u00e9chie, qui peut \u00eatre suffisamment performante lors de l'ex\u00e9cution d'op\u00e9rations sur de gros blocs de donn\u00e9es, en particulier lorsqu'il est possible d'\u00e9talonner dans le temps les processus de lecture et d'\u00e9criture.<\/p>\n<p>Si quelque chose ne vous semble pas assez clair, je suis pr\u00eat \u00e0 en parler plus en d\u00e9tail. Nous vous invitons \u00e0 partager vos exp\u00e9riences ou \u00e0 discuter si vous n'\u00eates pas d'accord avec certains points.<br \/>\n<br \/>Source : <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 5.0.2 - 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.\" \/>\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\/fr\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/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\udd47 Th\u00e9orie et pratique de l'utilisation de HBase | ProHoster","description":"Bonjour ! Je m'appelle Danil Lipovoy, notre \u00e9quipe chez Sbertech a commenc\u00e9 \u00e0 utiliser HBase comme stockage de donn\u00e9es op\u00e9rationnelles.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","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.","og:url":"https:\/\/prohoster.info\/fr\/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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/55302","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=55302"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/55302\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=55302"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=55302"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=55302"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}