{"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\/es\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase","title":{"rendered":"Teor\u00eda y pr\u00e1ctica del uso de HBase","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>\u00a1Buenos d\u00edas! Me llamo Danil Lipovoy y nuestro equipo en Sbertech ha comenzado a utilizar HBase como almac\u00e9n de datos en tiempo real. A lo largo de su estudio, hemos acumulado experiencia que nos gustar\u00eda sistematizar y describir (esperamos que sea \u00fatil para muchos). Todos los experimentos mencionados a continuaci\u00f3n se realizaron con las versiones HBase 1.2.0-cdh5.14.2 y 2.0.0-cdh6.0.0-beta1. <\/p>\n<ol>\n<li>Arquitectura general <\/li>\n<li>Escritura de datos en HBASE<\/li>\n<li>Lectura de datos de HBASE<\/li>\n<li>Cach\u00e9 de datos<\/li>\n<li>Procesamiento por lotes de datos MultiGet\/MultiPut<\/li>\n<li>Estrategia de partici\u00f3n de tablas en regiones (splitting)<\/li>\n<li>Tolerancia a fallos, compactaci\u00f3n y localizaci\u00f3n de datos<\/li>\n<li>Configuraciones y rendimiento<\/li>\n<li>Pruebas de carga<\/li>\n<li>Conclusiones<\/li>\n<\/ol>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>1. Arquitectura general<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Teor\u00eda y pr\u00e1ctica del uso de HBase\" src=\"\/wp-content\/uploads\/2020\/01\/30800d8a48de4c52ff1650a4f1dec4c8.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEl Master de respaldo escucha el heartbeat del activo en el nodo de ZooKeeper y, en caso de que el activo desaparezca, toma las funciones del maestro. <\/p>\n<h2>2. Escritura de datos en HBASE<\/h2>\n<p>\nPrimero, consideremos el caso m\u00e1s simple: escribir un objeto clave-valor en una tabla utilizando put(rowkey). El cliente debe averiguar primero d\u00f3nde se encuentra el servidor de regi\u00f3n ra\u00edz (Root Region Server \u2014 RRS), que almacena la tabla hbase:meta. Esta informaci\u00f3n la obtiene de ZooKeeper. Luego, se dirige a RRS y lee la tabla hbase:meta, de la cual extrae informaci\u00f3n sobre qu\u00e9 RegionServer (RS) es responsable de almacenar los datos para la clave rowkey en la tabla de inter\u00e9s. Para un uso posterior, el cliente almacena en cach\u00e9 la meta-tabla y, por lo tanto, las solicitudes subsecuentes son m\u00e1s r\u00e1pidas, y van directamente a RS.<\/p>\n<p>Luego, el RS, al recibir la solicitud, primero la escribe en el WriteAheadLog (WAL), lo que es necesario para la recuperaci\u00f3n en caso de fallo. Luego guarda los datos en MemStore. Este es un b\u00fafer en memoria que contiene un conjunto ordenado de claves de esa regi\u00f3n. La tabla puede estar dividida en regiones (particiones), cada una de las cuales contiene un conjunto de claves no superpuestas. Esto permite, al ubicar las regiones en diferentes servidores, obtener un mayor rendimiento. Sin embargo, a pesar de la obviedad de esta afirmaci\u00f3n, m\u00e1s adelante veremos que esto no funciona en todos los casos.<\/p>\n<p>Despu\u00e9s de colocar el registro en MemStore, el cliente recibe una respuesta indicando que el registro se ha guardado correctamente. Sin embargo, en realidad, solo se almacena en el b\u00fafer y se almacenar\u00e1 en el disco solo despu\u00e9s de que haya transcurrido un cierto intervalo de tiempo o al llenarlo con nuevos datos. <\/p>\n<p><img decoding=\"async\" alt=\"Teor\u00eda y pr\u00e1ctica del uso de HBase\" src=\"\/wp-content\/uploads\/2020\/01\/10f4d5d600a20882690f5cc81322bc41.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAl realizar la operaci\u00f3n \u00abEliminar\u00bb, no se produce la eliminaci\u00f3n f\u00edsica de los datos. Simplemente se marcan como eliminados, y la destrucci\u00f3n real ocurre en el momento en que se llama a la funci\u00f3n major compact, sobre la cual se detalla m\u00e1s en el punto 7.<\/p>\n<p>Los archivos en formato HFile se acumulan en HDFS y de vez en cuando se inicia el proceso minor compact, que simplemente une archivos peque\u00f1os en uno m\u00e1s grande, sin eliminar nada. Con el tiempo, esto se convierte en un problema que se manifiesta solo al leer los datos (volveremos a esto m\u00e1s adelante). <\/p>\n<p>Adem\u00e1s del proceso de carga descrito anteriormente, hay un procedimiento mucho m\u00e1s eficiente, que representa quiz\u00e1s la mayor fortaleza de esta base de datos: BulkLoad. Consiste en que nosotros mismos formamos HFiles y los colocamos en el disco, lo que permite una excelente escalabilidad y alcanzar velocidades bastante razonables. De hecho, aqu\u00ed la limitaci\u00f3n no es HBase, sino la capacidad del hardware. A continuaci\u00f3n, se presentan los resultados de carga en un cl\u00faster compuesto por 16 RegionServers y 16 NodeManager YARN (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 hilos), versi\u00f3n HBase 1.2.0-cdh5.14.2. <\/p>\n<p><img decoding=\"async\" alt=\"Teor\u00eda y pr\u00e1ctica del uso de HBase\" src=\"\/wp-content\/uploads\/2020\/01\/4e4452b216eda3269a364ea97c49120f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAqu\u00ed se observa que al aumentar la cantidad de particiones (regiones) en la tabla, as\u00ed como los ejecutores de Spark, se obtiene un incremento en la velocidad de carga. Adem\u00e1s, la velocidad depende del volumen de las escrituras. Los bloques grandes dan un aumento en la medida de MB\/s, mientras que los peque\u00f1os aumentan el n\u00famero de registros insertados por unidad de tiempo, manteniendo todo lo dem\u00e1s constante. <\/p>\n<p>Tambi\u00e9n se puede iniciar la carga en dos tablas simult\u00e1neamente y obtener el doble de velocidad. A continuaci\u00f3n se muestra que la escritura de bloques de 10 KB simult\u00e1neamente en dos tablas se realiza a una velocidad de alrededor de 600 MB\/s en cada una (un total de 1275 MB\/s), lo que coincide con la velocidad de escritura en una tabla de 623 MB\/s (ver n\u00ba 11 arriba).<\/p>\n<p><img decoding=\"async\" alt=\"Teor\u00eda y pr\u00e1ctica del uso de HBase\" src=\"\/wp-content\/uploads\/2020\/01\/9f1b4fc0c80b797111494d400e9ce332.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nPor otro lado, el segundo lanzamiento con escrituras de 50 KB muestra que la velocidad de carga ya no crece significativamente, lo que indica que se est\u00e1 acercando a los valores limites. Sin embargo, es importante tener en cuenta que la carga de trabajo en HBASE es pr\u00e1cticamente nula, todo lo que se requiere es que primero entregue los datos de hbase:meta, y despu\u00e9s, al colocar los HFiles, vac\u00ede los datos de BlockCache y guarde el buffer MemStore en disco, si no est\u00e1 vac\u00edo.<\/p>\n<h2>3. Lectura de datos desde HBASE<\/h2>\n<p>\nSi se considera que toda la informaci\u00f3n de hbase:meta ya est\u00e1 en posesi\u00f3n del cliente (ver p.2), la solicitud se env\u00eda inmediatamente al RS que almacena la clave necesaria. Primero, la b\u00fasqueda se lleva a cabo en MemCache. Independientemente de si hay datos all\u00ed o no, la b\u00fasqueda tambi\u00e9n se realiza en el b\u00fafer BlockCache y, si es necesario, en HFiles. Si los datos se encuentran en el archivo, se colocan en BlockCache y en la siguiente solicitud se devolver\u00e1n m\u00e1s r\u00e1pido. La b\u00fasqueda en HFile se realiza relativamente r\u00e1pido gracias al uso del filtro de Bloom, es decir, al leer un peque\u00f1o volumen de datos, se determina de inmediato si este archivo contiene la clave necesaria y, si no, se pasa al siguiente.<\/p>\n<p><img decoding=\"async\" alt=\"Teor\u00eda y pr\u00e1ctica del uso de HBase\" src=\"\/wp-content\/uploads\/2020\/01\/a21b1b825a84cfd02507ec334e9452fb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAl recibir datos de estas tres fuentes, el RS forma la respuesta. En particular, puede enviar varias versiones encontradas del objeto si el cliente solicita versionado.<\/p>\n<h2>4. Cacheo de datos<\/h2>\n<p>\nLos b\u00faferes MemStore y BlockCache ocupan hasta el 80% de la memoria on-heap asignada al RS (el resto se reserva para tareas de servicio del RS). Si el modo t\u00edpico de uso es tal que los procesos escriben y luego leen esos mismos datos, tiene sentido reducir BlockCache y aumentar MemStore, ya que al escribir los datos no entran en el cach\u00e9 de lectura, lo que har\u00e1 que el uso de BlockCache sea menos frecuente. El b\u00fafer BlockCache consta de dos partes: LruBlockCache (siempre on-heap) y BucketCache (generalmente off-heap o en SSD). Se debe utilizar BucketCache cuando hay muchas solicitudes de lectura que no caben en LruBlockCache, lo que lleva a una actividad intensa del Garbage Collector. Sin embargo, no se debe esperar un aumento radical en el rendimiento por el uso del cach\u00e9 de lectura, aunque volveremos a esto en la p. 8.<\/p>\n<p><img decoding=\"async\" alt=\"Teor\u00eda y pr\u00e1ctica del uso de HBase\" src=\"\/wp-content\/uploads\/2020\/01\/17d7791a998dd7da747cb7089dce1f10.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nBlockCache es \u00fanico para todo el RS, mientras que MemStore es \u00fanico para cada tabla (uno por cada Family de Columnas).<\/p>\n<p>\u00bfC\u00f3mo <noindex><a rel=\"nofollow\" href=\"https:\/\/blog.cloudera.com\/blog\/2012\/06\/hbase-write-path\/\">descrito<\/a><\/noindex> en teor\u00eda, al escribir, los datos no van al cach\u00e9 y de hecho, estos par\u00e1metros CACHE_DATA_ON_WRITE para la tabla y 'Cache DATA on Write' para el RS est\u00e1n configurados en false. Sin embargo, en la pr\u00e1ctica, si se escriben datos en MemStore, luego se vac\u00eda en disco (limpi\u00e1ndolo de esta manera), luego se elimina el archivo resultante, al ejecutar una solicitud get obtendremos los datos con \u00e9xito. Y lo que es m\u00e1s, incluso si se desactiva completamente BlockCache y se llena la tabla con nuevos datos, luego se logra el vaciado de MemStore en disco, al eliminarlos y solicitarlos desde otra sesi\u00f3n, a\u00fan se extraer\u00e1n de alguna parte. As\u00ed que HBase almacena no solo datos, sino tambi\u00e9n misterios intrigantes.<\/p>\n<pre><code class=\"bash\">hbase(main):001:0&gt; crear 'ns:magic', 'cf'\nTabla ns:magic creada\nTard\u00f3 1.1533 segundos\nhbase(main):002:0&gt; poner 'ns:magic', 'key1', 'cf:c', 'intenta_borrarme'\nTard\u00f3 0.2610 segundos\nhbase(main):003:0&gt; vaciar 'ns:magic'\nTard\u00f3 0.6161 segundos\nhdfs dfs -mv \/data\/hbase\/data\/ns\/magic\/* \/tmp\/trash\nhbase(main):002:0&gt; obtener 'ns:magic', 'key1'\n cf:c      timestamp=1534440690218, valor=intenta_borrarme\n<\/code><\/pre>\n<p>\nEl par\u00e1metro \u00abCache DATA on Read\u00bb est\u00e1 configurado en falso. Si tienes ideas, bienvenido a discutirlo en los comentarios.<\/p>\n<h2>5. Procesamiento en lote de datos MultiGet\/MultiPut<\/h2>\n<p>\nEl procesamiento de solicitudes individuales (Get\/Put\/Delete) es una operaci\u00f3n bastante costosa, por lo que se deben agrupar siempre que sea posible en List o List, lo que permite obtener un aumento significativo en el rendimiento. Especialmente se refiere a la operaci\u00f3n de escritura, mientras que en la lectura existe una trampa. En el gr\u00e1fico a continuaci\u00f3n se muestra el tiempo de lectura de 50,000 registros desde MemStore. La lectura se realiz\u00f3 en un solo hilo y en el eje horizontal se muestra la cantidad de claves en la solicitud. Se observa que al aumentar hasta mil claves en una solicitud, el tiempo de ejecuci\u00f3n disminuye, es decir, la velocidad aumenta. Sin embargo, con el modo MSLAB habilitado por defecto, despu\u00e9s de este umbral se produce un dr\u00e1stico descenso en el rendimiento, y cuanto mayor sea el volumen de datos en el registro, mayor ser\u00e1 el tiempo de ejecuci\u00f3n. <\/p>\n<p><img decoding=\"async\" alt=\"Teor\u00eda y pr\u00e1ctica del uso de HBase\" src=\"\/wp-content\/uploads\/2020\/01\/42d3a77d66770a7fed03f83fecdca470.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLas pruebas se realizaron en una m\u00e1quina virtual, 8 n\u00facleos, versi\u00f3n HBase 2.0.0-cdh6.0.0-beta1.<\/p>\n<p>El modo MSLAB est\u00e1 dise\u00f1ado para reducir la fragmentaci\u00f3n del heap, que ocurre debido a la mezcla de datos de generaciones nuevas y viejas. Como soluci\u00f3n al problema, al habilitar MSLAB, los datos se colocan en celdas (chunks) relativamente peque\u00f1as y se procesan en lotes. Como resultado, cuando el volumen en el paquete de datos solicitado supera el tama\u00f1o asignado, la rendimiento disminuye dr\u00e1sticamente. Por otro lado, desactivar este modo tambi\u00e9n es indeseable, ya que conducir\u00e1 a interrupciones debido a GC en momentos de intensa actividad con datos. Una buena salida es aumentar el tama\u00f1o de la celda, en caso de escritura activa a trav\u00e9s de put al mismo tiempo que la lectura. Cabe se\u00f1alar que el problema no surge si despu\u00e9s de escribir se ejecuta el comando flush que vac\u00eda MemStore en el disco o si se realiza la carga mediante BulkLoad. En la tabla a continuaci\u00f3n se muestra que las solicitudes desde MemStore de datos de mayor volumen (y igual cantidad) conducen a un descenso en la velocidad. Sin embargo, al aumentar el chunksize, se devuelve el tiempo de procesamiento a la normalidad.<\/p>\n<p><img decoding=\"async\" alt=\"Teor\u00eda y pr\u00e1ctica del uso de HBase\" src=\"\/wp-content\/uploads\/2020\/01\/0076215bd171257548f8a4c4d4229ba0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAdem\u00e1s de aumentar el chunksize, ayuda dividir los datos por regiones, es decir, hacer el spliteo de tablas. Esto hace que para cada regi\u00f3n lleguen menos solicitudes y, si se colocan en una celda, la respuesta se mantiene buena.<\/p>\n<h2>6. Estrategia de divisi\u00f3n de tablas por regiones (spliteo)<\/h2>\n<p>\nDado que HBase es un almacenamiento de clave-valor y la partici\u00f3n se realiza por clave, es crucial distribuir los datos de manera uniforme entre todas las regiones. Por ejemplo, la partici\u00f3n de una tabla de este tipo en tres partes dar\u00e1 lugar a que los datos se dividan en tres regiones:<\/p>\n<p><img decoding=\"async\" alt=\"Teor\u00eda y pr\u00e1ctica del uso de HBase\" src=\"\/wp-content\/uploads\/2020\/01\/a811ae81e77b48dbf28ed86dbdc35739.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nA veces, esto puede llevar a una ralentizaci\u00f3n dr\u00e1stica si los datos futuros cargados son, por ejemplo, valores long que en su mayor\u00eda comienzan con el mismo d\u00edgito, por ejemplo:<\/p>\n<p>1000001<br \/>\n1000002<br \/>\n\u2026<br \/>\n1100003<\/p>\n<p>Dado que las claves se almacenan como un array de bytes, todas comenzar\u00e1n igual y pertenecer\u00e1n a una regi\u00f3n #1 que almacena este rango de claves. Existen varias estrategias de divisi\u00f3n:<\/p>\n<p>HexStringSplit \u2013 Convierte la clave en una cadena con codificaci\u00f3n hexadecimal en el rango \u00ab00000000\u00bb =&gt; \u00abFFFFFFFF\u00bb y rellenando a la izquierda con ceros.<\/p>\n<p>UniformSplit \u2013 Convierte la clave en un array de bytes con codificaci\u00f3n hexadecimal en el rango \u00ab00\u00bb =&gt; \u00abFF\u00bb y rellenando a la derecha con ceros.<\/p>\n<p>Adem\u00e1s, se puede especificar cualquier rango o conjunto de claves para la divisi\u00f3n y configurar el auto-spliteo. Sin embargo, uno de los enfoques m\u00e1s simples y efectivos es UniformSplit y la concatenaci\u00f3n del hash, por ejemplo, el par de bytes m\u00e1s significativos de ejecutar la clave a trav\u00e9s de la funci\u00f3n CRC32(rowkey) y, efectivamente, la rowkey:<\/p>\n<p>hash + rowkey<\/p>\n<p>Entonces todos los datos se distribuir\u00e1n uniformemente entre las regiones. Al leer, simplemente se desechan los primeros dos bytes y queda la clave original. Adem\u00e1s, el RS controla la cantidad de datos y claves en la regi\u00f3n y, al superar los l\u00edmites, autom\u00e1ticamente lo divide en partes. <\/p>\n<h2>7. Tolerancia a fallos y localizaci\u00f3n de datos<\/h2>\n<p>\nDado que cada conjunto de claves solo est\u00e1 a cargo de una regi\u00f3n, la soluci\u00f3n a los problemas relacionados con las ca\u00eddas de RS o el desmantelamiento es almacenar todos los datos necesarios en HDFS. Cuando un RS cae, el maestro lo detecta a trav\u00e9s de la falta de latidos en el nodo de ZooKeeper. Luego, asigna la regi\u00f3n afectada a otro RS y, dado que los HFiles se almacenan en un sistema de archivos distribuido, el nuevo propietario los lee y contin\u00faa administrando los datos. Sin embargo, dado que parte de los datos puede estar en MemStore y no ha tenido tiempo de ser grabada en HFiles, se utiliza el WAL para recuperar el historial de operaciones, que tambi\u00e9n se almacena en HDFS. Despu\u00e9s de aplicar los cambios, el RS puede responder a las solicitudes, sin embargo, el traslado implica que parte de los datos y los procesos que los gestionan se encuentran en diferentes nodos, es decir, se reduce la localizaci\u00f3n. <\/p>\n<p>La soluci\u00f3n al problema es la compactaci\u00f3n mayor: este procedimiento mueve los archivos a los nodos que est\u00e1n a cargo de ellos (donde se encuentran sus regiones), lo que provoca un aumento brusco de la carga en la red y en los discos durante esta operaci\u00f3n. Sin embargo, el acceso a los datos se acelera notablemente posteriormente. Adem\u00e1s, la major_compaction combina todos los HFiles en un solo archivo dentro de la regi\u00f3n, y tambi\u00e9n limpia los datos seg\u00fan la configuraci\u00f3n de la tabla. Por ejemplo, se puede especificar la cantidad de versiones de un objeto que se deben conservar o el tiempo de vida, despu\u00e9s del cual el objeto se elimina f\u00edsicamente.<\/p>\n<p>Este procedimiento puede tener un impacto muy positivo en el funcionamiento de HBase. En la imagen a continuaci\u00f3n se puede ver c\u00f3mo ha disminuido el rendimiento debido a la actividad intensa de escritura de datos. Se observa c\u00f3mo 40 hilos estaban escribiendo en una tabla y 40 hilos le\u00edan datos al mismo tiempo. Los hilos de escritura generan cada vez m\u00e1s HFiles, que son le\u00eddos por otros hilos. Como resultado, se necesita eliminar cada vez m\u00e1s datos de la memoria y, al final, se activa el GC, que pr\u00e1cticamente paraliza todo el trabajo. La ejecuci\u00f3n de una compactaci\u00f3n mayor condujo a la limpieza de los atascos formados y a la recuperaci\u00f3n del rendimiento.<\/p>\n<p><img decoding=\"async\" alt=\"Teor\u00eda y pr\u00e1ctica del uso de HBase\" src=\"\/wp-content\/uploads\/2020\/01\/6c93b2c10c197663785d3de0bb185481.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLa prueba se realiz\u00f3 en 3 DataNodes y 4 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 hilos). Versi\u00f3n de HBase 1.2.0-cdh5.14.2<\/p>\n<p>Es importante destacar que la ejecuci\u00f3n de la compactaci\u00f3n mayor se realiz\u00f3 en una tabla \"viva\", en la que se estaban escribiendo y leyendo datos activamente. En la red aparec\u00eda la afirmaci\u00f3n de que esto podr\u00eda conducir a una respuesta incorrecta al leer datos. Para comprobarlo, se inici\u00f3 un proceso que generaba nuevos datos y los escrib\u00eda en la tabla. Despu\u00e9s, inmediatamente le\u00eda y verificaba si el valor obtenido coincid\u00eda con el que se hab\u00eda registrado. Durante el funcionamiento de este proceso, se ejecut\u00f3 la compactaci\u00f3n mayor aproximadamente 200 veces y no se registr\u00f3 ning\u00fan fallo. Es posible que el problema se manifieste raramente y solo durante una alta carga, por lo que es m\u00e1s seguro detener programadamente los procesos de escritura y lectura y realizar la limpieza evitando tales ca\u00eddas del GC.<\/p>\n<p>Adem\u00e1s, la compactaci\u00f3n mayor no afecta al estado de MemStore; para vaciarlo en disco y compactarlo, se debe utilizar flush (connection.getAdmin().flush(TableName.valueOf(tblName))).<\/p>\n<h2>8. Configuraci\u00f3n y rendimiento<\/h2>\n<p>\nComo se mencion\u00f3 anteriormente, HBase muestra el mayor \u00e9xito donde no necesita hacer nada, durante la ejecuci\u00f3n de BulkLoad. Sin embargo, esto se aplica a la mayor\u00eda de los sistemas y personas. Este instrumento es m\u00e1s adecuado para la inserci\u00f3n masiva de datos en bloques grandes, mientras que si el proceso requiere realizar muchas solicitudes concurrentes de lectura y escritura, se utilizan los comandos descritos anteriormente, Get y Put. Para determinar los par\u00e1metros \u00f3ptimos, se realizaron ejecuciones con diversas combinaciones de par\u00e1metros de tablas y configuraciones:<\/p>\n<ul>\n<li>Se lanzaron 10 hilos simult\u00e1neamente 3 veces consecutivas (llamaremos a esto un bloque de hilos). <\/li>\n<li>El tiempo de trabajo de todos los hilos en el bloque se promedi\u00f3 y fue el resultado final del trabajo del bloque.<\/li>\n<li>Todos los hilos trabajaron con la misma tabla. <\/li>\n<li>Antes de cada ejecuci\u00f3n del bloque de hilos, se realiz\u00f3 una compactaci\u00f3n mayor.<\/li>\n<li>Cada bloque realiz\u00f3 solo una de las siguientes operaciones: <\/li>\n<\/ul>\n<p>\n \u2014 Put<br \/>\n \u2014 Get<br \/>\n \u2014 Get+Put<\/p>\n<ul>\n<li>Cada bloque realiz\u00f3 50,000 repeticiones de su operaci\u00f3n.<\/li>\n<li>El tama\u00f1o de la escritura en el bloque fue de 100 bytes, 1000 bytes o 10000 bytes (aleatorio).<\/li>\n<li>Los bloques se lanzaron con diferentes cantidades de claves solicitadas (ya sea una clave o 10).<\/li>\n<li>Los bloques se lanzaron con diversas configuraciones de tabla. Se modificaron los par\u00e1metros:<\/li>\n<\/ul>\n<p>\n \u2014 BlockCache = activado o desactivado<br \/>\n \u2014 BlockSize = 65 KB o 16 KB<br \/>\n \u2014 Particiones = 1, 5 o 30<br \/>\n \u2014 MSLAB = activado o desactivado<\/p>\n<p>As\u00ed es como se ve el bloque:<\/p>\n<p>a. Se activaba\/desactivaba el modo MSLAB.<br \/>\nb. Se cre\u00f3 una tabla, para la cual se establecieron los siguientes par\u00e1metros: BlockCache = true\/none, BlockSize = 65\/16 Kb, Particiones = 1\/5\/30. <br \/>\nc. Se estableci\u00f3 la compresi\u00f3n GZ.<br \/>\nd. Se lanzaron 10 hilos simult\u00e1neamente realizando 1\/10 operaciones put\/get\/get+put en esta tabla con registros de 100\/1000\/10000 bytes, ejecutando 50,000 solicitudes consecutivas (las claves son aleatorias).<br \/>\ne. El punto d se repiti\u00f3 tres veces.<br \/>\nf. Se promedi\u00f3 el tiempo de trabajo de todos los hilos. <\/p>\n<p>Se verificaron todas las combinaciones posibles. Era predecible que al aumentar el tama\u00f1o del registro la velocidad disminuir\u00eda o que desactivar la cach\u00e9 llevar\u00eda a una desaceleraci\u00f3n. Sin embargo, el objetivo era entender el grado y la importancia de la influencia de cada par\u00e1metro, por lo que los datos recopilados se ingresaron en una funci\u00f3n de regresi\u00f3n lineal, lo que permite evaluar la validez mediante la estad\u00edstica t. A continuaci\u00f3n se presentan los resultados de los bloques que realizan operaciones Put. El conjunto completo de combinaciones 2*2*3*2*3 = 144 variantes + 72, ya que algunas se realizaron dos veces. Por lo tanto, en total hubo 216 ejecuciones:<\/p>\n<p><img decoding=\"async\" alt=\"Teor\u00eda y pr\u00e1ctica del uso de HBase\" src=\"\/wp-content\/uploads\/2020\/01\/7a13c7a9b3ff1859976800f5d45cd51b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLas pruebas se realizaron en un mini-cl\u00faster compuesto por 3 DataNodes y 4 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 hilos). Versi\u00f3n HBase 1.2.0-cdh5.14.2.<\/p>\n<p>La mayor velocidad de inserci\u00f3n de 3.7 segundos se obtuvo con el modo MSLAB desactivado, en una tabla con una partici\u00f3n, con BlockCache activado, BlockSize = 16, registros de 100 bytes en grupos de 10.<br \/>\nLa menor velocidad de inserci\u00f3n 82.8 segundos se obtuvo con el modo MSLAB activado, en una tabla con una partici\u00f3n, con BlockCache activado, BlockSize = 16, registros de 10000 bytes uno por uno.<\/p>\n<p>Ahora veamos el modelo. Vemos una buena calidad del modelo por R2, pero est\u00e1 claro que la extrapolaci\u00f3n aqu\u00ed es contraproducente. El comportamiento real del sistema al cambiar los par\u00e1metros no ser\u00e1 lineal; este modelo no es para pron\u00f3sticos, sino para comprender qu\u00e9 ocurri\u00f3 dentro de los par\u00e1metros establecidos. Por ejemplo, aqu\u00ed vemos por el criterio de Student que para la operaci\u00f3n Put, los par\u00e1metros BlockSize y BlockCache no tienen relevancia (lo cual es bastante predecible):<\/p>\n<p><img decoding=\"async\" alt=\"Teor\u00eda y pr\u00e1ctica del uso de HBase\" src=\"\/wp-content\/uploads\/2020\/01\/2fb65d1809d53f2b47f4f8829a9efc65.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSorprendentemente, el aumento en el n\u00famero de particiones lleva a una disminuci\u00f3n del rendimiento (ya hemos visto un impacto positivo al aumentar el n\u00famero de particiones en BulkLoad), aunque es explicable. En primer lugar, para procesar se deben formar consultas para 30 regiones en lugar de una, y el volumen de datos no es tal que esto traiga beneficios. En segundo lugar, el tiempo total de trabajo se determina por el RS m\u00e1s lento, y dado que el n\u00famero de DataNode es menor que el de RS, algunas regiones tienen una localidad nula. Veamos a los cinco l\u00edderes:<\/p>\n<p><img decoding=\"async\" alt=\"Teor\u00eda y pr\u00e1ctica del uso de HBase\" src=\"\/wp-content\/uploads\/2020\/01\/8ad7e832879156eaa96e630458405cdc.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAhora evaluemos los resultados de la ejecuci\u00f3n de los bloques Get:<\/p>\n<p><img decoding=\"async\" alt=\"Teor\u00eda y pr\u00e1ctica del uso de HBase\" src=\"\/wp-content\/uploads\/2020\/01\/8a5dd45422c74e8815011d7e9b805ccb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEl n\u00famero de particiones ha perdido relevancia, lo que probablemente se explica por el hecho de que los datos se almacenan en cach\u00e9 de forma efectiva, y la cach\u00e9 para lectura es el par\u00e1metro m\u00e1s significativo (estad\u00edsticamente). Por supuesto, aumentar la cantidad de mensajes en la consulta tambi\u00e9n es muy beneficioso para el rendimiento. Mejores resultados:<\/p>\n<p><img decoding=\"async\" alt=\"Teor\u00eda y pr\u00e1ctica del uso de HBase\" src=\"\/wp-content\/uploads\/2020\/01\/9d237f9fdbeaf5412daec2fc2fa24b01.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nY finalmente, veamos el modelo del bloque que realiz\u00f3 primero el get y luego el put:<\/p>\n<p><img decoding=\"async\" alt=\"Teor\u00eda y pr\u00e1ctica del uso de HBase\" src=\"\/wp-content\/uploads\/2020\/01\/75137207a4a69acccad036882794094b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nAqu\u00ed todos los par\u00e1metros son significativos. Y los resultados de los l\u00edderes:<\/p>\n<p><img decoding=\"async\" alt=\"Teor\u00eda y pr\u00e1ctica del uso de HBase\" src=\"\/wp-content\/uploads\/2020\/01\/c166933d81e86f36958e3af58297f876.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h2>9. Pruebas de carga<\/h2>\n<p>\nY por \u00faltimo, ejecutaremos una carga m\u00e1s o menos decente, pero siempre es m\u00e1s interesante cuando hay con qu\u00e9 comparar. En el sitio web de DataStax, el desarrollador clave de Cassandra, hay <noindex><a rel=\"nofollow\" href=\"https:\/\/www.datastax.com\/wp-content\/themes\/datastax-2014-08\/files\/NoSQL_Benchmarks_EndPoint.pdf\">resultados<\/a><\/noindex> de una serie de almacenes NoSQL, incluyendo HBase versi\u00f3n 0.98.6-1. La carga se realiz\u00f3 con 40 hilos, tama\u00f1o de datos 100 bytes, discos SSD. El resultado de las pruebas de las operaciones Read-Modify-Write mostr\u00f3 estos resultados.<\/p>\n<p><img decoding=\"async\" alt=\"Teor\u00eda y pr\u00e1ctica del uso de HBase\" src=\"\/wp-content\/uploads\/2020\/01\/521e9dff60f462e6dabebc1234e028be.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n Seg\u00fan entend\u00ed, la lectura se realiz\u00f3 en bloques de 100 registros y para 16 nodos, la prueba de DataStax para HBase mostr\u00f3 un rendimiento de 10,000 operaciones por segundo. <\/p>\n<p>Es afortunado que en nuestro cl\u00faster tambi\u00e9n haya 16 nodos, pero no tan \"afortunado\" que cada uno tenga 64 n\u00facleos (hilos), mientras que en la prueba de DataStax solo hay 4. Por otro lado, ellos tienen discos SSD, mientras que nosotros tenemos HDD y una versi\u00f3n m\u00e1s nueva de HBase, y la utilizaci\u00f3n de CPU durante la carga pr\u00e1cticamente no aument\u00f3 significativamente (visualmente entre un 5-10 por ciento). Sin embargo, intentaremos iniciar con esta configuraci\u00f3n. Los ajustes de las tablas son predeterminados, la lectura se realiza en un rango de claves de 0 a 50 millones de forma aleatoria (es decir, cada vez un nuevo). La tabla tiene 50 millones de registros, dividida en 64 particiones. Las claves est\u00e1n hasheadas por crc32. Los ajustes de tablas son por defecto, MSLAB est\u00e1 habilitado. Se lanzan 40 hilos, cada hilo lee un conjunto de 100 claves aleatorias y escribe inmediatamente 100 bytes generados en esas claves de nuevo. <\/p>\n<p><img decoding=\"async\" alt=\"Teor\u00eda y pr\u00e1ctica del uso de HBase\" src=\"\/wp-content\/uploads\/2020\/01\/776490f01121cc434135f733311b7722.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n Stand: 16 DataNodes y 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 hilos). Versi\u00f3n de HBase 1.2.0-cdh5.14.2.<\/p>\n<p>El resultado promedio est\u00e1 m\u00e1s cerca de 40 mil operaciones por segundo, lo que es significativamente mejor que en la prueba de DataStax. Sin embargo, en aras del experimento, se pueden modificar un poco las condiciones. Es bastante poco probable que todo el trabajo se realice exclusivamente con una tabla y solo con claves \u00fanicas. Supongamos que hay un conjunto \"caliente\" de claves que genera la carga principal. Por lo tanto, intentamos crear carga con registros m\u00e1s grandes (10 KB), en lotes de 100, en 4 tablas diferentes y limitando el rango de claves solicitadas a 50 mil. En el gr\u00e1fico a continuaci\u00f3n se muestra el lanzamiento de 40 hilos, cada hilo lee un conjunto de 100 claves y escribe inmediatamente 10 KB aleatorios en esas claves de vuelta. <\/p>\n<p><img decoding=\"async\" alt=\"Teor\u00eda y pr\u00e1ctica del uso de HBase\" src=\"\/wp-content\/uploads\/2020\/01\/30d29f1b98663e3c07cb2be20e93876a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nStand: 16 DataNodes y 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 hilos). Versi\u00f3n de HBase 1.2.0-cdh5.14.2.<\/p>\n<p>Durante la carga, se ejecut\u00f3 varias veces la compactaci\u00f3n mayor, como se mostr\u00f3 anteriormente, sin este procedimiento, el rendimiento comenzar\u00e1 a degradarse gradualmente; sin embargo, tambi\u00e9n se genera carga adicional durante la ejecuci\u00f3n. Las ca\u00eddas se deben a diversas razones. A veces, los hilos terminaban su trabajo y mientras se reiniciaban, surg\u00eda una pausa; a veces, las aplicaciones externas generaban carga en el cl\u00faster.<\/p>\n<p>La lectura y escritura simult\u00e1neas es uno de los escenarios de trabajo m\u00e1s dif\u00edciles para HBase. Si se realizan solo solicitudes de tipo put de tama\u00f1o peque\u00f1o, por ejemplo, de 100 bytes, agrup\u00e1ndolas en lotes de 10 a 50 mil, se pueden lograr cientos de miles de operaciones por segundo, y lo mismo ocurre con las solicitudes solo de lectura. Es importante se\u00f1alar que los resultados son radicalmente mejores que los obtenidos por DataStax, en gran medida gracias a las solicitudes en bloques de 50 mil.<\/p>\n<p><img decoding=\"async\" alt=\"Teor\u00eda y pr\u00e1ctica del uso de HBase\" src=\"\/wp-content\/uploads\/2020\/01\/412bda50a55093224169f048ea2f863a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nStand: 16 DataNodes y 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 hilos). Versi\u00f3n de HBase 1.2.0-cdh5.14.2.<\/p>\n<h2>10. Conclusiones<\/h2>\n<p>\nEste sistema es bastante flexible en su configuraci\u00f3n, sin embargo, el impacto de una gran cantidad de par\u00e1metros sigue siendo desconocido. Algunos de ellos han sido probados, pero no se incluyeron en el conjunto de pruebas final. Por ejemplo, experimentos preliminares mostraron que el par\u00e1metro DATA_BLOCK_ENCODING, que codifica informaci\u00f3n utilizando valores de celdas adyacentes, tiene una importancia m\u00ednima, lo cual es bastante explicable para datos generados aleatoriamente. En el caso de usar una gran cantidad de objetos repetidos, las ganancias pueden ser significativas. En general, se puede decir que HBase parece una base de datos bastante seria y bien dise\u00f1ada, que puede ser bastante eficiente en operaciones con grandes bloques de datos, especialmente si hay posibilidad de desfasar en el tiempo los procesos de lectura y escritura.<\/p>\n<p>Si sientes que algo no se ha explicado lo suficiente, estoy dispuesto a dar m\u00e1s detalles. Te invitamos a compartir tu experiencia o discutir si no est\u00e1s de acuerdo con algo.<br \/>\n<br \/>Fuente: <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\/es\/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=\"es_ES\" \/>\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\/es\/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\udd47Teor\u00eda y pr\u00e1ctica del uso de HBase | ProHoster","description":"\u00a1Buenas tardes! Me llamo Danil Lipovoy, y nuestro equipo en Sbertech ha comenzado a utilizar HBase como un almac\u00e9n de datos operacionales.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/teoriya-i-praktika-ispolzovaniya-hbase","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/55302","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=55302"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/55302\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=55302"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=55302"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=55302"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}