Big Data: Hbase

Big Data: Hbase

  • ¿Qué es Hbase?

Hbase es una base de datos distribuida, extensible, NoSQL que admite almacenamiento masivo de datos, estructura de almacenamiento de estructura física (KV).

  • Si no hay Hbase

Cómo devolver cientos de millones de datos en segundos en un escenario de big data. (Condicional: datos únicos, datos de rango)

hbase.apache.org

1 estructura de Hbase y tipo de datos

  • Estructura lógica

  • Estructura fisica

Todo el reloj se cortará de acuerdo con la tecla de fila (región) en dirección horizontal. Luego presione ColumnFamily para cortar (Almacenar) en la dirección vertical,

  • Espacio de nombre: espacio de nombre

    • Similar al concepto de base de datos en una base de datos relacional, se pueden colocar varias tablas debajo de cada espacio de nombres, y hay dos espacios de nombres de forma predeterminada: hbase y default. Hbase almacena las tablas integradas de Hbase. La tabla predeterminada es el espacio de nombres predeterminado utilizado por los usuarios. (Por ejemplo, la prueba de espacio de nombres se asigna a la tabla de orden, que se puede escribir como prueba: orden)
  • Fila: fila

    • Cada fila de datos en Hbase consta de una RowKey y varias columnas.
  • Columna: Columna

    • Cada columna en Hbase está calificada por ColumnFamily (familia de columnas) y ColumnQualifier (calificador de columna) (por ejemplo: personal_info: name, personal_info: city)
  • Celda: celda

    • La unidad determinada de forma exclusiva por {RowKey, ColumnFamily, ColumnQualifier, TimeStamp}, los datos en la celda no se escriben y todos se almacenan en código de bytes.
  • Clave de fila: clave de fila

    • La clave de fila debe ser única en la tabla y debe existir.
    • Las claves de fila están ordenadas de acuerdo con el orden lexicográfico (un valor es mayor que ningún valor). Por ejemplo, row_key11 se organiza entre row_key1 y row_ley2.
    • Todos los accesos a la tabla deben pasar por Row Key. (Acceso único a RowKey, o acceso a rango RowKey, o exploración de tabla completa)
  • ColumnFamily: familia de columnas

    • Al crear una tabla Hbase, solo necesita especificar el CF. Al insertar datos, las columnas (campos) se pueden aumentar dinámicamente según sea necesario.
    • Cada CF puede tener uno o más miembros de columna (ColumnQualifier).
    • Las diferentes familias de columnas se almacenan en diferentes carpetas en hdfs.
  • TimeStamp: marca de tiempo

    • Se utiliza para identificar diferentes versiones de datos. Si no especifica una marca de tiempo, Hbase agregará automáticamente la marca de tiempo del sistema actual a este valor de campo al escribir datos.

2 arquitectura Hbase

A continuación se explican las funciones de los componentes en el diagrama anterior de pequeño a grande.

  • StoreFile

    • StoreFile es el archivo que HBase realmente almacena, y finalmente se almacena en el DataNode a través del cliente HDFS. (Es decir, en el disco de Linux)
  • Tienda

    • Se puede entender como un conjunto de familias de columnas en una región en rodajas. (Como se muestra arriba, hay varias tiendas en una Región)
    • Store contiene Mem Store (almacenamiento de memoria), StoreFile (los datos que se actualizan desde la memoria, se fusionarán más y se dividirán los datos más grandes)
  • Región

    • La región se puede entender como una porción de una tabla. La región se divide de acuerdo con el umbral de tamaño de datos y la clave de fila.
    • HBase divide automáticamente la tabla horizontalmente (por fila) en múltiples regiones (regiones), y cada región almacenará una pieza continua de datos en una tabla.
    • Al comienzo de cada tabla, solo hay una región. Con la inserción continua de datos, la región continúa aumentando. Cuando alcanza un umbral, la región se dividirá en dos nuevas regiones de acuerdo con la tecla Fila, y así sucesivamente.
    • A medida que aumenta el número de filas en la tabla, habrá más y más regiones, y los datos de una tabla se guardarán en varias regiones.
  • Amor

    • El registro previo de escritura de Hbase evita la pérdida de datos en circunstancias especiales.
  • Servidor de región

    • Operaciones de datos (DML): obtener, poner, eliminar
    • Región de gestión: SplitRegion (split), CompactRegion (fusionada)
  • Maestro

    • Operaciones a nivel de tabla (DDL): crear, eliminar, alterar
    • Administrar RegionServer: supervise el estado de RegionServer y asigne Regiones a RegionServer, (si hay máquinas rs1, rs2, rs3, los datos se escriben en Region en rs1, rs2, r3 está inactivo ---> entonces rs1 se escribe una gran cantidad de datos para alcanzar el límite superior de Region, Después de que rs1 divide la región por igual, notificará al maestro que envíe uno de ellos a rs3 para su administración).

3 Operación de línea de comando

3.1 Enlace hbase

  • Enlace hbase
hbase shell
  • Ver comandos de ayuda o usar comandos en detalle
help
help '命令'

3.2 Operaciones de espacio de nombres

3.2.1 Consultar el espacio de nombres

list_namespace

3.2.2 Consultar la tabla debajo del espacio de nombres

list_namespace_tables '命名空间名'

3.2.3 Crear espacio de nombres

create_namespace '命名空间名'

3.2.4 Eliminar espacio de nombres (requiere que el espacio de nombres esté vacío)

drop_namespace '命名空间名'

3.3 Operación DDL

3.3.1 Consultar todas las tablas de usuario

list

3.3.2 Crear tabla

create '命名空间:表', '列族1', '列族2', '列族3','列族4'... 

Como se muestra en la figura, hay una serie de carpetas desordenadas. Esta serie de carpetas desordenadas representa el número de Región.

3.3.3 Ver detalles de la tabla

describe '命名空间:表'

Se puede ver que VERSIONS es 1, lo que significa que esta tabla solo puede almacenar una versión de datos.

3.3.4 Cambiar información de la tabla

Se utiliza principalmente para modificar la información de guardado de la versión de la tabla, y también se puede especificar cuando se crea la tabla, pero el comando de shell es complicado, por lo que generalmente se usa el comando de cambio.

alter '命名空间:表',{NAME=>'列族名',VERSIONS=>3}

3.3.5 Modificar el estado de la tabla (la tabla debe ser inválida antes de la eliminación)

  • Tabla de fallas
disable '表'
  • Habilitar tabla
enable '表'

3.3.6 Eliminar tabla

delete '表'

3.4 Operación DML

3.4.1 Insertar datos

put '命名空间:表','RowKey','列族:列','值'
put '命名空间:表','RowKey','列族:列','值',时间戳(版本控制) 

image-20200407233815062

Como se muestra en la figura, no se genera ningún archivo de datos, ya que los datos están en la memoria, debe vaciar la 'tabla' y luego puede ver el aterrizaje de datos. (Flush es generar un StoreFile una vez)

3.4.2 Tabla de escaneo

#全表扫描
scan '命名空间:表'
#范围扫描(左闭右开)
scan '命名空间:表',{STARTROW => 'RowKey',STOPROW=>'RowKey'} #扫描N个版本的数据 scan '命名空间:表',{RAW=>true,VERSIONS=>10} 

3.4.3 Descarga

flush '命名空间:表'
  • Mecanismo de retención de versión de datos

De lo anterior, se sabe que flush generará un StoreFile una vez, luego los datos almacenarán los datos más recientes de acuerdo con el número de versiones de la reserva de la tabla.

Por ejemplo: si el número de versiones reservadas es 2, entonces si inserta v1, v2, v3 tres datos, después del vaciado, solo quedan dos datos v2, v3, luego inserte v4, v5, v6 tres datos, después del vaciado, quedando Los siguientes datos son cuatro versiones de v2, v3, v5 y v6 (en este caso, dos archivos StoreFile). Si se produce una fusión o división de Región, los archivos StoreFile se fusionarán y colocarán en la Región correspondiente. Se eliminará de acuerdo con el número de versiones reservadas, y v2, v3, v5, v6 se convertirán en v5, v6. (Si no hay descarga manual, o el tiempo de descarga automático establecido, los datos no se eliminarán de acuerdo con el número de versiones) (Por defecto, se fusionarán más de 3 archivos StoreFile)

  • Una familia de columnas corresponde a un MemStore
  • Cada MemStore genera un StoreFile independiente cuando se actualiza a HDFS
  • Tiempo de actualización de MemStore global de RegionServer: hbase.regionserver.global.memstore.size

  • Tiempo de actualización de Memstore único: hbase.hregion.memstore.flush.size

3.4.3 Consulta de datos

get '命名空间:表','RowKey'
get '命名空间:表','RowKey','列族' get '命名空间:表','RowKey','列族:列' #获取N个版本的数据 get '命名空间:表','RowKey',{COLUMN=>'列族:列',VERSIONS=>10} 

3.4.4 Vaciar la mesa

truncate '命名空间:表'

3.4.5 Eliminar datos

#delete '命名空间:表','RowKey','列族'(此命令行删除有问题,但是API可以)
delete '命名空间:表','RowKey','列族:列'
deleteall  '命名空间:表','RowKey' 

4 Proceso de lectura y escritura.

4.1 Proceso de escritura

  1. El cliente consulta la ubicación del RegionServer donde se encuentra la tabla de almacenamiento de metadatos a través de ZK y devuelve

  1. Consultar metadatos y devolver el RegionServer que necesita la tabla

  1. El cliente almacena información en caché para facilitar su uso la próxima vez

  2. Envíe una solicitud PUT al RegionServer, escriba el registro de operaciones (WAL), luego escriba en la memoria y luego sincronice wal con HDFS, luego se termina. (En este paso, la transacción se revierte para garantizar que los registros y la memoria se escriben correctamente)

4.2 Proceso de lectura

Al leer datos, MemStore y StoreFile leen juntos, coloque los datos en StoreFile en BlockCache, luego combine los datos de la memoria y la marca de tiempo BlockCache, y obtenga los últimos datos y regrese.

5 Fusionar y dividir

  • Compactación

Debido a que Memstore generará un nuevo HFile cada vez que se actualiza, y diferentes versiones y diferentes tipos del mismo campo pueden distribuirse en diferentes HFiles, por lo que es necesario atravesar todos los HFiles al realizar consultas. Para reducir la cantidad de archivos H y limpiar los datos caducados y eliminados, se realizará la fusión de StoreFile.

La compactación se divide en compactación menor y compactación mayor.

La compactación menor fusionará varios archivos H adyacentes más pequeños en un archivo H más grande, pero no limpiará los datos caducados y eliminados.

Major Compaction fusionará todos los archivos H de una tienda en un archivo H grande y limpiará los datos caducados y eliminados.

Ajuste de parámetros:

hbase.hregion.majorcompaction = 0

hbase.hregion.majorcompaction.jitter = 0

hbase.hstore.compactionThreshold = 3

  • Split

Por defecto, solo hay una Región al comienzo de cada Tabla. A medida que los datos continúan siendo escritos, la Región se dividirá automáticamente. Cuando se divide, las dos subregiones se ubican en el Servidor de Región actual, pero por consideraciones de equilibrio de carga, HMaster Una región puede transferirse a otro servidor de región.

Ajuste de parámetros:

hbase.hregion.max.filesize = 5G (Max1 en la siguiente fórmula) (este valor se puede reducir para aumentar la concurrencia)

hbase.hregion.memstore.flush.size = 258M (Max2 en la siguiente fórmula)

Cada división comparará el valor de Max1 y Max2, el que sea menor. [min (Max1, Max2 * Número de Regiones * 2)], donde el número de Regiones es el número de Regiones de la Tabla en el Servidor de Región actual.

Dado que la segmentación automática no puede evitar los puntos calientes, a menudo utilizamos la partición previa y el diseño de RowKey para evitar los puntos calientes en la producción.

6 Optimización

6.1 Intente no usar varias familias de columnas

Para evitar generar múltiples archivos pequeños durante el vaciado.

6.2 Optimización de memoria

La función principal es almacenar en caché los datos de la tabla, pero GC se usará cuando se vacíe, no demasiado grande, de acuerdo con los recursos del clúster, generalmente asigna el 70% de la memoria completa del clúster Hbase, 16-> 48G

6.3 Permitir contenido adicional en HDFS

dfs.support.append = true (hdfs-site.xml 、 hbase-site.xml)

6.4 Optimizar DataNode permite la cantidad máxima de archivos abiertos

dfs.datanode.max.transfer.threads = 4096 (HDFS 配置)

En una operación de fusión a nivel de Servidor de región, el Servidor de región no está disponible. Puede ajustar este valor de acuerdo con los recursos del clúster para aumentar la concurrencia.

6.5 Aumentar el número de monitores RPC

hbase.regionserver.handler.count = 30

De acuerdo con la situación del clúster, este valor se puede aumentar adecuadamente, la decisión principal es el número de solicitudes de clientes.

6.6 Optimizar el caché del cliente

hbase.client.write.buffer = 100M (buffer de escritura)

Aumentar este valor puede reducir la cantidad de llamadas RPC, singular consumirá más memoria, configurada de acuerdo con la situación de los recursos del clúster.

6.7 Optimización de fusión y segmentación

Referencia 5 fusionar y dividir

6.8 Prepartición

  • Agregue el parámetro SPLITS al crear la tabla
create '命名空间:表', '列族1', '列族2', '列族3','列族4'...,SPLITS=>['分区号','分区号','分区号','分区号'] 

El número de particiones previas se selecciona en función de la cantidad de datos estimados de medio año a un año, y el valor máximo de Región.

6.9 RowKey

  • Hashability: dividido uniformemente en diferentes regiones
  • Singularidad: no se repetirá
  • Longitud: 70-100

Opción 1: números aleatorios, valores hash, pero esto no puede consultarse por rango y no hay concentración de datos.

Opción 2: inversión de cadena, por ejemplo, la capacidad de hash se logra después de que se invierte la marca de tiempo, pero la concentración solo es mejor que la primera cuando se visualiza.

  • Plan de producción recomendado:
#设计预分区键(如比如200个区) | ASCLL码为124只有 } 和 ~ 比它大,那么不管以后的RowKey使用什么字符,都是小于这个字符的,所以可以有效的得到RowKey规律
000|
001|
......
199|


# 1 设计RowKey键_ASCLL码为95
000_
001_
......
199_
# 2 根据业务唯一标识(如用户ID,手机号,身份证)和时间维度(比如按月:202004)计算后根据分区数取余(13408657784^202004)%199=分区号
# 想以什么时间进行查询就把什么往前提,如下数据需要查1月数据范围就是 000_13408657784_2020-04  -> 000_13408657784_2020-04|
000_13408657784_2020-04-01 12:12:12
......
199_13408657784_2020-04-01 24:12:12

Supongo que te gusta

Origin www.cnblogs.com/554552f/p/12705423.html
Recomendado
Clasificación