Teor铆a y pr谩ctica del uso de HBase

Buenas tardes Mi nombre es Danil Lipova, nuestro equipo en Sbertech comenz贸 a usar HBase como dep贸sito de datos operativos. Durante su estudio, se gan贸 experiencia que quer铆a sistematizar y describir (esperamos que sea 煤til para muchos). Todos los experimentos a continuaci贸n se realizaron con versiones de HBase 1.2.0-cdh5.14.2 y 2.0.0-cdh6.0.0-beta1.

  1. Arquitectura general
  2. Escribir datos en HBASE
  3. Lectura de datos de HBASE
  4. Almacenamiento en cach茅 de datos
  5. Procesamiento por lotes MultiGet / MultiPut
  6. Estrategia para dividir tablas en regiones (derrames)
  7. Tolerancia a fallos, compactaci贸n y localidad de datos
  8. Configuraciones y rendimiento
  9. Prueba de carga
  10. Conclusiones

1. Arquitectura general



El maestro en espera escucha los latidos activos en el nodo ZooKeeper y, en caso de desaparici贸n, se hace cargo de las funciones del maestro.

2. Escribir datos en HBASE


Primero, considere el caso m谩s simple: escribir un objeto clave-valor en una tabla determinada usando put (rowkey). El cliente primero debe averiguar d贸nde se encuentra el servidor de regi贸n ra铆z (RRS) que almacena la hbase: meta table. Recibe esta informaci贸n de ZooKeeper. Luego recurre a RRS y lee la tabla hbase: meta, de la que recupera la informaci贸n que RegionServer (RS) es responsable de almacenar los datos para la clave de fila dada en la tabla que le interesa. Para uso futuro, el cliente almacena en cach茅 la metatabla y, por lo tanto, las llamadas posteriores van m谩s r谩pido, directamente a RS.

Luego, RS, despu茅s de recibir la solicitud, primero la escribe en WriteAheadLog (WAL), que es necesaria para la recuperaci贸n en caso de un bloqueo. Luego guarda los datos en MemStore. Este es un b煤fer en la memoria que contiene un conjunto ordenado de claves para una regi贸n determinada. La tabla se puede dividir en regiones (particiones), cada una de las cuales contiene un conjunto disuelto de claves. Esto permite colocar regiones en diferentes servidores para obtener un mayor rendimiento. Sin embargo, a pesar de lo obvio de esta declaraci贸n, veremos m谩s adelante que esto no funciona en todos los casos.

Despu茅s de colocar el registro en MemStore, el cliente recibe una respuesta de que el registro se guard贸 correctamente. Al mismo tiempo, realmente se almacena solo en el b煤fer y llega al disco solo despu茅s de un cierto per铆odo de tiempo o cuando se llena con nuevos datos.


Cuando se realiza la operaci贸n "Eliminar", no se produce la eliminaci贸n de datos f铆sicos. Simplemente se marcan como eliminados, y la destrucci贸n en s铆 ocurre cuando se llama a la funci贸n compacta principal, que se describe con m谩s detalle en la Secci贸n 7.

Los archivos en formato HFile se acumulan en HDFS y, de vez en cuando, se inicia el proceso compacto menor, que simplemente pega archivos peque帽os en archivos m谩s grandes sin eliminar nada. Con el tiempo, esto se convierte en un problema que se manifiesta solo al leer datos (volveremos a esto m谩s adelante).

Adem谩s del proceso de arranque descrito anteriormente, existe un procedimiento mucho m谩s eficiente, que es probablemente el lado m谩s poderoso de esta base de datos: BulkLoad. Consiste en el hecho de que creamos HFiles de forma independiente y lo colocamos en el disco, lo que nos permite escalar perfectamente y alcanzar velocidades muy decentes. De hecho, la limitaci贸n aqu铆 no es HBase, sino las posibilidades de hierro. A continuaci贸n se muestran los resultados de la carga en un cl煤ster que consta de 16 RegionServers y 16 NodeManager YARN (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 hilos), versi贸n HBase 1.2.0-cdh5.14.2.



Se puede ver que al aumentar el n煤mero de particiones (regiones) en la tabla, as铆 como los ejecutables Spark, obtenemos un aumento en la velocidad de descarga. Adem谩s, la velocidad depende de la cantidad de grabaci贸n. Los bloques grandes aumentan la medici贸n de MB / seg, los peque帽os en el n煤mero de registros insertados por unidad de tiempo, todas las dem谩s cosas son iguales.

Tambi茅n puede comenzar a cargar en dos tablas al mismo tiempo y duplicar la velocidad. Se puede ver a continuaci贸n que los bloques de 10 KB se escriben en dos tablas a la vez a una velocidad de aproximadamente 600 Mb / s cada una (un total de 1275 Mb / s), lo que coincide con la velocidad de escritura de 623 MB / s en una tabla (ver No. 11 arriba)


Pero el segundo lanzamiento con registros de 50 KB muestra que la velocidad de descarga ya est谩 creciendo ligeramente, lo que indica una aproximaci贸n a los valores l铆mite. Debe tenerse en cuenta que pr谩cticamente no hay carga en HBASE en s铆, todo lo que se requiere de 茅l es primero proporcionar los datos de hbase: meta, y despu茅s de alinear HFiles, vaciar los datos de BlockCache y guardar el b煤fer MemStore en el disco si no es as铆. Vac铆o

3. Lectura de datos de HBASE


Si suponemos que toda la informaci贸n de hbase: meta ya tiene un cliente (consulte la secci贸n 2), la solicitud va inmediatamente al RS donde se almacena la clave deseada. Primero la b煤squeda se realiza en MemCache. Independientemente de si hay datos all铆 o no, la b煤squeda tambi茅n se lleva a cabo en el b煤fer BlockCache y, si es necesario, en HFiles. Si los datos se encontraron en un archivo, se colocan en BlockCache y se devolver谩n m谩s r谩pido en la pr贸xima solicitud. Las b煤squedas de archivos H son relativamente r谩pidas debido al uso del filtro Bloom, es decir Despu茅s de leer una peque帽a cantidad de datos, determina de inmediato si este archivo contiene la clave deseada y, de lo contrario, pasa a la siguiente.


Habiendo recibido datos de estas tres fuentes, RS forma una respuesta. En particular, puede transferir varias versiones del objeto encontrado a la vez si el cliente solicit贸 el control de versiones.

4. Almacenamiento en cach茅 de datos


Las memorias intermedias MemStore y BlockCache ocupan hasta el 80% de la memoria RS asignada en el mont贸n (el resto est谩 reservado para tareas de servicio RS). Si el modo de uso t铆pico es tal que los procesos escriben e inmediatamente leen los mismos datos, entonces tiene sentido reducir BlockCache y aumentar MemStore, porque cuando la escritura de datos en la memoria cach茅 de lectura no cae, entonces el uso de BlockCache ocurrir谩 con menos frecuencia. El b煤fer BlockCache consta de dos partes: LruBlockCache (siempre en el mont贸n) y BucketCache (generalmente fuera del mont贸n o en SSD). BucketCache debe usarse cuando hay muchas solicitudes de lectura y no encajan en LruBlockCache, lo que conduce al trabajo activo de Garbage Collector. Al mismo tiempo, no debe esperar un aumento radical en el rendimiento del uso de la memoria cach茅 de lectura, pero volveremos a esto en la Secci贸n 8


BlockCache es uno para todo el RS, y MemStore tiene el suyo para cada tabla (uno para cada familia de columnas).

Como se describe en teor铆a, cuando la escritura de datos no ingresa en la memoria cach茅, y de hecho, dichos par谩metros CACHE_DATA_ON_WRITE para la tabla y "Datos de cach茅 en escritura" para RS se establecen en falso. Sin embargo, en la pr谩ctica, si escribe datos en MemStore, luego los vac铆a en el disco (limpi谩ndolo de esta manera), luego elimina el archivo resultante y luego, al ejecutar una solicitud de obtenci贸n, recibiremos los datos con 茅xito. E incluso si deshabilita completamente BlockCache y llena la tabla con nuevos datos, luego obtenga MemStore en el disco, elim铆nelos y solicite de otra sesi贸n, a煤n se obtendr谩n de alguna parte. Entonces HBase almacena no solo datos, sino tambi茅n misteriosos rompecabezas.

hbase(main):001:0> create 'ns:magic', 'cf' Created table ns:magic Took 1.1533 seconds hbase(main):002:0> put 'ns:magic', 'key1', 'cf:c', 'try_to_delete_me' Took 0.2610 seconds hbase(main):003:0> flush 'ns:magic' Took 0.6161 seconds hdfs dfs -mv /data/hbase/data/ns/magic/* /tmp/trash hbase(main):002:0> get 'ns:magic', 'key1' cf:c timestamp=1534440690218, value=try_to_delete_me 

La DATOS de la cach茅 en lectura se establece en falso. Si tiene alguna idea, bienvenido a discutir esto en los comentarios.

5. Procesamiento por lotes de datos MultiGet / MultiPut


El procesamiento de solicitudes individuales (Get / Put / Delete) es una operaci贸n bastante costosa, por lo que debe combinarlas tanto como sea posible en una Lista o Lista, lo que le permite obtener un aumento significativo del rendimiento. Esto es especialmente cierto en la operaci贸n de escritura, pero cuando se lee hay el siguiente escollo. El siguiente gr谩fico muestra el tiempo de lectura de 50,000 registros de MemStore. La lectura se realiz贸 en una secuencia y el eje horizontal muestra el n煤mero de claves en la solicitud. Se puede ver que cuando aumenta a mil claves en una solicitud, el tiempo de ejecuci贸n disminuye, es decir la velocidad aumenta Sin embargo, cuando el modo MSLAB est谩 activado de forma predeterminada, despu茅s de este umbral, comienza una ca铆da dram谩tica en el rendimiento, y cuanto mayor es la cantidad de datos en el registro, mayor es el tiempo de ejecuci贸n.



Las pruebas se realizaron en una m谩quina virtual, 8 n煤cleos, HBase versi贸n 2.0.0-cdh6.0.0-beta1.

El modo MSLAB est谩 dise帽ado para reducir la fragmentaci贸n del almacenamiento din谩mico, que ocurre debido a la mezcla de datos de generaci贸n nueva y antigua. Como soluci贸n al problema cuando MSLAB est谩 habilitado, los datos se colocan en celdas relativamente peque帽as (trozos) y se procesan en lotes. Como resultado, cuando el volumen en el paquete de datos solicitado excede el tama帽o asignado, el rendimiento cae bruscamente. Por otro lado, desactivar este modo tampoco es aconsejable, ya que provocar谩 paradas debido a GC durante los momentos de trabajo intensivo con datos. Una buena salida es aumentar el volumen de la celda, en el caso de la escritura activa a trav茅s de la colocaci贸n simult谩nea con la lectura. Vale la pena se帽alar que el problema no ocurre si, despu茅s de la grabaci贸n, ejecuta el comando flush que descarga MemStore en el disco o si la carga se realiza utilizando BulkLoad. La siguiente tabla muestra que las consultas de los datos de MemStore de un volumen mayor (y la misma cantidad) conducen a una desaceleraci贸n. Sin embargo, aumentar el tama帽o del fragmento vuelve el tiempo de procesamiento a la normalidad.


Adem谩s de aumentar el tama帽o del fragmento, la fragmentaci贸n de datos por regi贸n ayuda, es decir Mesa dividida. Esto lleva al hecho de que llegan menos solicitudes a cada regi贸n y si se colocan en una celda, la respuesta sigue siendo buena.

6. La estrategia de dividir tablas en regiones (corte)


Dado que HBase es un almacenamiento de valor clave y la partici贸n se realiza por clave, es extremadamente importante compartir datos de manera uniforme en todas las regiones. Por ejemplo, dividir dicha tabla en tres partes dar谩 como resultado que los datos se dividan en tres regiones:


Sucede que esto conduce a una fuerte desaceleraci贸n si los datos cargados en el futuro se ver谩n, por ejemplo, como valores largos, la mayor铆a de los cuales comienzan con el mismo d铆gito, por ejemplo:

1000001
1000002
...
1100003

Dado que las claves se almacenan como una matriz de bytes, todas ellas comenzar谩n de la misma manera y pertenecer谩n a la misma regi贸n # 1 que almacena este rango de claves. Hay varias estrategias divididas:

HexStringSplit: convierte la clave en una cadena con codificaci贸n hexadecimal en el rango "00000000" => "FFFFFFFF" y la llena con ceros a la izquierda.

UniformSplit: convierte una clave en una matriz de bytes con codificaci贸n hexadecimal en el rango "00" => "FF" y la llena con ceros a la derecha.

Adem谩s, puede especificar cualquier rango o conjunto de teclas para dividir y configurar la divisi贸n autom谩tica. Sin embargo, uno de los enfoques m谩s simples y efectivos es UniformSplit y el uso de concatenaci贸n de hash, por ejemplo, un alto par de bytes para ejecutar una clave a trav茅s de la funci贸n CRC32 (rowkey) y rowkey en s铆:

hash + rowkey

Luego, todos los datos se distribuir谩n de manera uniforme en todas las regiones. Al leer, los primeros dos bytes simplemente se descartan y la clave original permanece. RS tambi茅n controla la cantidad de datos y claves en la regi贸n y cuando se exceden los l铆mites, se divide autom谩ticamente en pedazos.

7. Tolerancia a fallos y localidad de datos


Dado que solo una regi贸n es responsable de cada conjunto de claves, la soluci贸n a los problemas asociados con fallas de RS o desmantelamiento es almacenar todos los datos necesarios en HDFS. Cuando RS falla, el maestro detecta esto a trav茅s de la ausencia de un latido en el nodo ZooKeeper. Luego asigna la regi贸n servida a otro RS y, dado que los archivos H se almacenan en un sistema de archivos distribuido, el nuevo host los lee y contin煤a sirviendo los datos. Sin embargo, dado que algunos de los datos pueden estar en MemStore y no tuvieron tiempo de ingresar a HFiles, los WAL, que tambi茅n se almacenan en HDFS, se utilizan para restaurar el historial de operaciones. Despu茅s de la transferencia de los cambios, RS puede responder a las solicitudes, sin embargo, el movimiento lleva al hecho de que parte de los datos y sus procesos est谩n en nodos diferentes, es decir. Disminuci贸n de la localidad.

La soluci贸n al problema es una compactaci贸n importante: este procedimiento mueve los archivos a los nodos que son responsables de ellos (donde se encuentran sus regiones), como resultado de lo cual la carga en la red y los discos aumenta considerablemente durante este procedimiento. Sin embargo, en el futuro, el acceso a los datos se acelera notablemente. Adem谩s, major_compaction combina todos los archivos H en un archivo dentro de la regi贸n, y tambi茅n limpia los datos seg煤n la configuraci贸n de la tabla. Por ejemplo, puede especificar el n煤mero de versiones de un objeto que desea guardar o su duraci贸n, despu茅s de lo cual el objeto se elimina f铆sicamente.

Este procedimiento puede tener un efecto muy positivo en HBase. La siguiente imagen muestra c贸mo se degrad贸 el rendimiento como resultado de la grabaci贸n activa de datos. Aqu铆 puede ver c贸mo se escribieron 40 secuencias en una tabla y 40 secuencias leyeron datos al mismo tiempo. Las secuencias de escritura forman cada vez m谩s archivos H, que otras secuencias leen. Como resultado, es necesario eliminar m谩s y m谩s datos de la memoria y al final el GC comienza a funcionar, lo que pr谩cticamente paraliza todo el trabajo. El lanzamiento de una gran compactaci贸n condujo a la limpieza de los bloqueos resultantes y la restauraci贸n del rendimiento.


La prueba se realiz贸 en 3 DataNode y 4 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 hilos). HBase Versi贸n 1.2.0-cdh5.14.2

Vale la pena se帽alar que el lanzamiento de la compactaci贸n mayor se realiz贸 en una tabla "en vivo", en la que los datos se escribieron y leyeron activamente. Hubo una declaraci贸n en la red de que esto podr铆a conducir a una respuesta incorrecta al leer los datos. Para verificar, se lanz贸 un proceso que gener贸 nuevos datos y los escribi贸 en la tabla. Despu茅s de lo cual le铆 inmediatamente y verifiqu茅 si el valor obtenido coincid铆a con lo que se registr贸. Durante este proceso, se lanz贸 una compactaci贸n importante unas 200 veces y no se registr贸 una sola falla. Quiz谩s el problema aparece raramente y solo durante una carga alta, por lo que es m谩s seguro detener de forma programada los procesos de escritura y lectura y realizar la limpieza sin permitir tales reducciones de GC.

Adem谩s, la compactaci贸n principal no afecta el estado de MemStore, para vaciarlo en el disco y compactar, debe usar flush (connection.getAdmin (). Flush (TableName.valueOf (tblName))).

8. Configuraci贸n y rendimiento


Como ya se mencion贸, HBase muestra el mayor 茅xito donde no necesita hacer nada al ejecutar BulkLoad. Sin embargo, esto se aplica a la mayor铆a de los sistemas y personas. Sin embargo, esta herramienta es m谩s adecuada para el apilamiento masivo de datos en bloques grandes, mientras que si el proceso requiere muchas solicitudes de lectura y escritura de la competencia, se utilizan los comandos Get y Put descritos anteriormente. Para determinar los par谩metros 贸ptimos, se realizaron lanzamientos con varias combinaciones de par谩metros y configuraciones de la tabla:

  • Se iniciaron 10 hilos al mismo tiempo 3 veces seguidas (llam茅moslo un bloque de hilos).
  • El tiempo de operaci贸n de todos los flujos en el bloque se promedi贸 y fue el resultado final de la operaci贸n del bloque.
  • Todos los hilos trabajaron con la misma tabla.
  • Antes de cada inicio del bloque de subprocesos, se ejecut贸 una compactaci贸n importante.
  • Cada bloque realiz贸 solo una de las siguientes operaciones:

- Poner
- obtener
- Obtener + poner

  • Cada bloque realiz贸 50,000 repeticiones de su operaci贸n.
  • El tama帽o del registro en el bloque es de 100 bytes, 1000 bytes o 10000 bytes (aleatorio).
  • Los bloques se lanzaron con un n煤mero diferente de claves solicitadas (una clave o 10).
  • Los bloques se lanzaron en varias configuraciones de tabla. Par谩metros cambiados:

- BlockCache = activado o desactivado
- Tama帽o de bloque = 65 Kb o 16 Kb
- Particiones = 1, 5 o 30
- MSLAB = encendido o apagado

Por lo tanto, el bloque se ve as铆:

a. Modo MSLAB activado / desactivado.
b. Se cre贸 una tabla para la cual se establecieron los siguientes par谩metros: BlockCache = true / none, BlockSize = 65/16 Kb, Partitions = 1/5/30.
c. Establecer compresi贸n GZ.
d. Se lanzaron 10 subprocesos simult谩neamente haciendo 1/10 de las operaciones put / get / get + put en esta tabla con registros de 100/1000/10000 bytes, ejecutando 50,000 consultas seguidas (claves aleatorias).
e. El punto d se repiti贸 tres veces.
f. Se promedi贸 el tiempo de funcionamiento de todos los hilos.

Se verificaron todas las combinaciones posibles. Es predecible que a medida que aumenta el tama帽o de la grabaci贸n, la velocidad disminuir谩 o que la desactivaci贸n del almacenamiento en cach茅 disminuir谩. Sin embargo, el objetivo era comprender el grado y la importancia de la influencia de cada par谩metro, por lo tanto, los datos recopilados se alimentaron a la entrada de la funci贸n de regresi贸n lineal, lo que permite evaluar la confiabilidad utilizando estad铆sticas t. A continuaci贸n se muestran los resultados de los bloques que realizan operaciones Put. Un conjunto completo de combinaciones 2 * 2 * 3 * 2 * 3 = 144 opciones + 72 desde algunos se realizaron dos veces. Por lo tanto, un total de 216 lanzamientos:


Las pruebas se llevaron a cabo en un mini-cluster que consta de 3 DataNode y 4 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 flujos). HBase versi贸n 1.2.0-cdh5.14.2.

La velocidad de inserci贸n m谩s alta de 3.7 segundos se obtuvo cuando el modo MSLAB estaba apagado, en una tabla con una partici贸n, con BlockCache habilitado, BlockSize = 16, registros de 100 bytes de 10 piezas por paquete.
La velocidad de inserci贸n m谩s baja de 82.8 segundos se obtuvo cuando se habilit贸 el modo MSLAB, en una tabla con una partici贸n, con BlockCache habilitado, BlockSize = 16, registros de 10,000 bytes cada uno.

Ahora veamos el modelo. Vemos un modelo de buena calidad para R2, pero est谩 claro que la extrapolaci贸n est谩 contraindicada aqu铆. El comportamiento real del sistema al cambiar los par谩metros no ser谩 lineal, este modelo no es necesario para los pron贸sticos, sino para comprender lo que sucedi贸 dentro de los par谩metros dados. Por ejemplo, aqu铆 vemos seg煤n el criterio de Student que para la operaci贸n Put, los par谩metros BlockSize y BlockCache no importan (lo que generalmente es predecible):


Pero el hecho de que un aumento en el n煤mero de particiones conduzca a una disminuci贸n en el rendimiento es algo inesperado (ya hemos visto el efecto positivo de un aumento en el n煤mero de particiones con BulkLoad), aunque es comprensible. Primero, para el procesamiento, es necesario formar consultas en 30 regiones en lugar de una, y la cantidad de datos no es tal que proporcione una ganancia. En segundo lugar, el tiempo de operaci贸n total est谩 determinado por el RS m谩s lento, y dado que el n煤mero de DataNode es menor que el n煤mero de RS, algunas regiones tienen cero localidades. Bueno, echemos un vistazo a los cinco primeros:


Ahora vamos a evaluar los resultados de la ejecuci贸n de los bloques Get:


El n煤mero de particiones ha perdido importancia, lo que probablemente se deba al hecho de que los datos est谩n bien almacenados en cach茅 y el cach茅 de lectura es el par谩metro m谩s significativo (estad铆sticamente). Naturalmente, aumentar el n煤mero de mensajes en una solicitud tambi茅n es muy 煤til para el rendimiento. Los mejores resultados:


Bueno, finalmente, mire el modelo del bloque que ejecut贸 primero, y luego ponga:


Aqu铆 todos los par谩metros son significativos. Y los resultados de los l铆deres:


9. Prueba de carga


Bueno, finalmente, lanzaremos una carga m谩s o menos decente, pero siempre es m谩s interesante cuando hay algo para comparar. El sitio de DataStax, un desarrollador clave de Cassandra, tiene los resultados de NT de varios repositorios NoSQL, incluida HBase versi贸n 0.98.6-1. La carga se realiz贸 mediante 40 flujos, tama帽o de datos de 100 bytes, discos SSD. El resultado de probar las operaciones de Lectura-Modificaci贸n-Escritura mostr贸 estos resultados.


Seg煤n tengo entendido, la lectura se realiz贸 en bloques de 100 registros y para 16 nodos HBase, la prueba DataStax mostr贸 un rendimiento de 10 mil operaciones por segundo.

Es una suerte que nuestro cl煤ster tambi茅n tenga 16 nodos, pero no es muy "afortunado" que cada uno tenga 64 n煤cleos (subprocesos), mientras que en la prueba DataStax solo tiene 4. Por otro lado, tienen discos SSD, y tenemos HDD y m谩s La nueva versi贸n de HBase y la utilizaci贸n de la CPU durante la carga pr谩cticamente no aument贸 significativamente (visualmente en un 5-10 por ciento). Sin embargo, intentaremos comenzar con esta configuraci贸n. Configuraci贸n de la tabla de forma predeterminada, la lectura se realiza en un rango de teclas de 0 a 50 millones al azar (es decir, cada vez que hay una nueva). En la tabla, 50 millones de entradas se dividen en 64 particiones. Las claves son crc32 hash. La configuraci贸n de la tabla est谩 predeterminada, MSLAB est谩 habilitado. Comenzando 40 subprocesos, cada subproceso lee un conjunto de 100 claves aleatorias e inmediatamente escribe los 100 bytes generados en estas claves.


Soporte: 16 DataNode y 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 flujos). HBase versi贸n 1.2.0-cdh5.14.2.

El resultado promedio es m谩s cercano a 40 mil operaciones por segundo, lo cual es significativamente mejor que en la prueba DataStax. Sin embargo, para los fines del experimento, las condiciones pueden cambiar ligeramente. Es bastante improbable que todo el trabajo se realice exclusivamente con una tabla, y solo con claves 煤nicas. Suponga que hay un cierto conjunto de teclas "activas" que genera la carga principal. Por lo tanto, trataremos de crear una carga con registros m谩s grandes (10 KB), tambi茅n en paquetes de 100 cada uno, en 4 tablas diferentes y limitando el rango de claves solicitadas a 50 mil. El siguiente gr谩fico muestra el inicio de 40 hilos, cada secuencia lee un conjunto de 100 claves y escribe inmediatamente 10 al azar. KB en estas teclas de nuevo.


Soporte: 16 DataNode y 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 flujos). HBase versi贸n 1.2.0-cdh5.14.2.

Durante la carga, se lanz贸 una compactaci贸n importante varias veces, como se muestra arriba sin este procedimiento, el rendimiento se degradar谩 gradualmente, sin embargo, tambi茅n se produce una carga adicional durante la ejecuci贸n. Las reducciones son causadas por varias razones. Algunas veces los subprocesos terminaron y mientras se reiniciaron hubo una pausa, a veces las aplicaciones de terceros crearon una carga en el cl煤ster.

Leer y escribir de inmediato es uno de los escenarios de trabajo m谩s dif铆ciles para HBase. Si solo coloca solicitudes de colocaci贸n de un tama帽o peque帽o, por ejemplo, 100 bytes cada una, combin谩ndolas en lotes de 10-50 mil piezas, puede obtener cientos de miles de operaciones por segundo y la situaci贸n es similar con las solicitudes de solo lectura. Vale la pena se帽alar que los resultados son radicalmente mejores que los que se obtuvieron en DataStax, sobre todo debido a las solicitudes en bloques de 50 mil.


Soporte: 16 DataNode y 16 RS (CPU Xeon E5-2680 v4 @ 2.40GHz * 64 flujos). HBase versi贸n 1.2.0-cdh5.14.2.

10. Conclusiones


Este sistema es lo suficientemente flexible como para configurarlo, pero a煤n se desconoce el efecto de una gran cantidad de par谩metros. Algunos de ellos fueron probados, pero no se incluyeron en el conjunto de pruebas resultante. Por ejemplo, los experimentos preliminares mostraron la insignificancia de un par谩metro como DATA_BLOCK_ENCODING, que codifica la informaci贸n utilizando valores de celdas vecinas, lo cual es bastante comprensible para los datos generados aleatoriamente. En el caso de utilizar una gran cantidad de objetos repetidos, la ganancia puede ser significativa. En general, podemos decir que HBase da la impresi贸n de una base de datos bastante seria y bien pensada, que puede ser bastante productiva cuando se trata de grandes bloques de datos. Especialmente si es posible difundir los procesos de lectura y escritura a tiempo.

Si algo en su opini贸n no se divulga lo suficiente, estoy listo para contarle m谩s. Sugerimos compartir su experiencia o debatir si no est谩 de acuerdo con algo.

Source: https://habr.com/ru/post/es420425/


All Articles