Este tema describe cómo usar el conector de ApsaraDB for HBase.
Contexto
ApsaraDB for HBase es un servicio NoSQL inteligente basado en la nube y rentable que ofrece alta escalabilidad y compatibilidad con HBase de código abierto. ApsaraDB for HBase proporciona beneficios como bajos costos de almacenamiento, alto throughput y escalabilidad, además de procesamiento inteligente de datos. ApsaraDB for HBase admite servicios centrales de Alibaba, como las recomendaciones de Taobao, el control de riesgos de Ant Credit Pay, publicidad, paneles de datos, seguimiento logístico de Cainiao, registros de transacciones de Alipay y mensajes de Taobao Mobile. ApsaraDB for HBase es un servicio totalmente administrado que ofrece capacidades empresariales, como el procesamiento de petabytes de datos, alta concurrencia, escalado rápido en segundos, baja latencia de respuesta en milisegundos, alta disponibilidad entre centros de datos y distribución global.
La siguiente tabla describe las funciones compatibles con el conector de ApsaraDB for HBase.
Elemento | Descripción |
Tipo de tabla | Tabla de dimensiones y tabla sink |
Modo de ejecución | Modo streaming |
Formato de datos | N/A |
Métrica | |
Tipo de API | API SQL |
Actualización o eliminación de datos en una tabla sink | Compatible |
Requisitos previos
Debe adquirir un clúster de ApsaraDB for HBase y crear una tabla de ApsaraDB for HBase. Para obtener más información sobre cómo adquirir un clúster de ApsaraDB for HBase, consulte Purchase a cluster.
Configure una lista de permitidos para el clúster de ApsaraDB for HBase. Para obtener más información, consulte Configure a whitelist.
Notas de uso
Antes de usar el conector de ApsaraDB for HBase, confirme el tipo de su instancia de base de datos y asegúrese de que el tipo de conector seleccionado sea el correcto. Si usa el conector de forma inadecuada, pueden surgir problemas inesperados.
El conector de ApsaraDB for HBase descrito en este tema está diseñado para instancias de ApsaraDB for HBase.
Las instancias de Lindorm son compatibles con Apache HBase. Use el conector de Lindorm para las instancias de Lindorm. Para obtener más información, consulte Lindorm.
Si usa el conector de ApsaraDB for HBase para conectar Realtime Compute for Apache Flink a una base de datos HBase de código abierto, no se puede garantizar la validez de los datos.
Sintaxis
CREATE TABLE hbase_table(
rowkey INT,
family1 ROW<q1 INT>,
family2 ROW<q2 STRING, q3 BIGINT>,
family3 ROW<q4 DOUBLE, q5 BOOLEAN, q6 STRING>
) WITH (
'connector'='cloudhbase',
'table-name'='<yourTableName>',
'zookeeper.quorum'='<yourZookeeperQuorum>'
);
Las familias de columnas de una tabla de ApsaraDB for HBase deben declararse con el tipo ROW. El nombre de cada familia de columnas corresponde al nombre de campo de una fila. En la sintaxis DDL se declaran las siguientes familias de columnas: family1, family2 y family3.
Una columna dentro de una familia de columnas corresponde a un campo en una fila. El nombre de la columna es el nombre del campo. En la sintaxis DDL, las columnas q2 y q3 se declaran en la familia de columnas family2.
Además de los campos de tipo ROW, solo puede existir un campo de tipo atómico, como STRING o BIGINT, en una tabla de ApsaraDB for HBase. El campo de tipo atómico se considera la clave de fila de la tabla, como rowkey en la sentencia DDL.
La clave de fila de una tabla de ApsaraDB for HBase debe definirse como la clave primaria de la tabla sink. Si no se define ninguna clave primaria, la clave de fila se usa como tal.
Solo es necesario declarar en la tabla sink las familias de columnas y las columnas requeridas de la tabla de ApsaraDB for HBase.
Opciones del conector
-
Generales
Opción
Descripción
Tipo de dato
Obligatorio
Valor predeterminado
Observaciones
connector
El tipo de la tabla.
String
Sí
Sin valor predeterminado
Establezca el valor en
cloudhbase.table-name
El nombre de la tabla de ApsaraDB for HBase.
String
Sí
Sin valor predeterminado
N/A.
zookeeper.znode.quorum
La URL usada para acceder al servicio ZooKeeper de ApsaraDB for HBase.
String
Sí
Sin valor predeterminado
N/A.
zookeeper.znode.parent
El directorio raíz de ApsaraDB for HBase en el servicio ZooKeeper.
String
No
/hbaseEste parámetro solo surte efecto en ApsaraDB for HBase Standard Edition.
userName
El nombre de usuario usado para acceder a la base de datos.
String
No
Sin valor predeterminado
Este parámetro solo surte efecto en ApsaraDB for HBase Performance-enhanced Edition.
password
La contraseña usada para acceder a la base de datos.
String
No
Sin valor predeterminado
Este parámetro solo surte efecto en ApsaraDB for HBase Performance-enhanced Edition.
haclient.cluster.id
El ID del clúster de ApsaraDB for HBase en modo de alta disponibilidad (HA).
String
No
Sin valor predeterminado
Este parámetro solo es obligatorio cuando se accede a clústeres de recuperación ante desastres por zona. Este parámetro solo surte efecto en ApsaraDB for HBase Performance-enhanced Edition.
retires.number
El número de reintentos permitidos para que el cliente de ApsaraDB for HBase se conecte a la base de datos de ApsaraDB for HBase.
Integer
No
31
N/A.
null-string-literal
Si el tipo de dato de un campo de ApsaraDB for HBase es STRING y los datos del campo en Realtime Compute for Apache Flink son nulos, se asigna
null-string-literalal campo de ApsaraDB for HBase y se escribe en la base de datos de ApsaraDB for HBase.String
No
null
N/A.
-
Específicas de sink
Opción
Descripción
Tipo de dato
Obligatorio
Valor predeterminado
Observaciones
sink.buffer-flush.max-size
El tamaño de los datos en bytes almacenados en caché en la memoria antes de escribirlos en la base de datos de ApsaraDB for HBase. Un valor mayor mejora el rendimiento de escritura de ApsaraDB for HBase, pero aumenta la latencia de escritura y consume más memoria.
String
No
2 MB
Unidad: B, KB, MB o GB. La unidad no distingue entre mayúsculas y minúsculas. Si establece este parámetro en 0, no se almacenan datos en caché.
sink.buffer-flush.max-rows
El número de registros de datos almacenados en caché en la memoria antes de escribirlos en la base de datos de ApsaraDB for HBase. Un valor mayor mejora el rendimiento de escritura de ApsaraDB for HBase, pero aumenta la latencia de escritura y consume más memoria.
Integer
No
1000
Si establece este parámetro en 0, no se almacenan datos en caché.
sink.buffer-flush.interval
El intervalo en el que los datos en caché se escriben en la base de datos de ApsaraDB for HBase. Este parámetro controla la latencia de escritura de datos en la base de datos de ApsaraDB for HBase.
Duration
No
1 s
Unidad: ms, s, min, h o d. Si establece este parámetro en 0, se deshabilita la escritura periódica de datos.
dynamic.table
Especifica si se debe usar una tabla de ApsaraDB for HBase que admita columnas dinámicas.
Boolean
No
false
Valores válidos:
true
false
sink.ignore-delete
Especifica si se deben ignorar los mensajes de retractación.
Boolean
No
false
Si un flujo contiene eventos
DELETEoUPDATE_BEFORE, y varias tareas sink actualizan simultáneamente diferentes campos de una tabla, puede producirse inconsistencia en los datos.Por ejemplo, después de eliminar un registro, otra tarea actualiza algunos campos. Los campos no actualizados pasarán a ser nulos o se rellenarán con valores predeterminados, lo que provocará errores en los datos.
Para evitar este problema, establezca
sink.ignore-deleteentruepara ignorar los eventosDELETEyUPDATE_BEFOREprovenientes del flujo de entrada.NotaUPDATE_BEFOREforma parte del mecanismo de retractación de Flink y se usa para retractar el valor anterior durante una operación de actualización.Si
ignoreDeletese establece entrue, se omiten todos los eventosDELETEyUPDATE_BEFORE. Solo se procesan los registrosINSERTyUPDATE_AFTER.
sink.sync-write
Especifica si se deben escribir datos en ApsaraDB for HBase en modo síncrono.
Boolean
No
true
Valores válidos:
true: Los datos se escriben en modo síncrono. En este modo, los datos se escriben en secuencia, pero el rendimiento de escritura se ve afectado.
false: Los datos se escriben en modo asíncrono. En este modo, es posible que los datos no se escriban en secuencia, pero el rendimiento de escritura mejora.
sink.buffer-flush.batch-rows
El número de registros de datos que se almacenan en caché en la memoria cuando los datos se escriben en ApsaraDB for HBase en modo síncrono. Un valor mayor mejora el rendimiento de escritura de ApsaraDB for HBase, pero aumenta la latencia de escritura y el uso de memoria.
Integer
No
100
Este parámetro solo surte efecto cuando el parámetro sink.sync-write se establece en true.
sink.ignore-null
Especifica si se deben ignorar los valores nulos.
Boolean
No
false
NotaSi establece este parámetro en true, el parámetro
null-string-literalno surte efecto.Solo Realtime Compute for Apache Flink con VVR 8.0.9 o posterior admite este parámetro.
-
Opciones específicas de tablas de dimensiones (relacionadas con caché)
Opción
Descripción
Tipo de dato
Obligatorio
Valor predeterminado
Observaciones
cache
La directiva de caché.
String
No
ALL
Valores válidos:
None: No se almacenan datos en caché.
LRU: Solo se almacenan en caché datos específicos de la tabla de dimensiones. Cada vez que el sistema recibe un registro de datos, busca en la caché. Si el sistema no encuentra el registro en la caché, busca el registro de datos en la tabla de dimensiones física.
NotaSi usa esta directiva de caché, configure los parámetros cacheSize y cacheTTLMs.
ALL: Se almacenan en caché todos los datos de la tabla de dimensiones. Este es el valor predeterminado. Antes de que se ejecute un trabajo, el sistema carga todos los datos de la tabla de dimensiones en la caché. De este modo, todas las consultas posteriores en la tabla de dimensiones se buscan en la caché. Si el sistema no encuentra el registro de datos en la caché, significa que la clave de unión no existe. El sistema recarga todos los datos en la caché después de que expiren las entradas de la caché.
NotaSi la cantidad de datos en una tabla remota es pequeña y existe un gran número de claves faltantes, se recomienda establecer este parámetro en ALL. La tabla origen y la tabla de dimensiones no se pueden asociar mediante la cláusula ON. Si usa esta directiva de caché, configure los parámetros cacheTTLMs y cacheReloadTimeBlackList.
Si todos los datos de la tabla de dimensiones se cargan en la caché, la velocidad de inicio del despliegue puede disminuir. Configure la directiva de caché de manera flexible según sus requisitos empresariales.
Si establece el parámetro cache en ALL, aumente la memoria del nodo para la unión de tablas, ya que el sistema carga datos de forma asíncrona desde la tabla de dimensiones. El tamaño de memoria adicional equivale al doble del tamaño de la tabla remota.
cacheSize
El número máximo de filas de datos que se pueden almacenar en caché.
Long
No
10000
Configure este parámetro cuando establezca el parámetro cache en LRU.
cacheTTLMs
El periodo de tiempo de espera de la caché. Unidad: milisegundos.
Long
No
Sin valor predeterminado
La configuración del parámetro cacheTTLMs varía según el parámetro cache.
Si establece el parámetro cache en None, el parámetro cacheTTLMs puede dejarse vacío. Esto indica que las entradas de la caché no caducan.
Si establece el parámetro cache en LRU, el parámetro cacheTTLMs especifica el periodo de tiempo de espera de la caché. De forma predeterminada, las entradas de la caché no caducan.
Si establece el parámetro cache en ALL, el parámetro cacheTTLMs especifica el intervalo en el que el sistema recarga la caché. De forma predeterminada, la caché no se recarga.
cacheEmpty
Especifica si se deben almacenar en caché los resultados vacíos.
Boolean
No
true
N/A.
cacheReloadTimeBlackList
Los periodos de tiempo durante los cuales no se actualiza la caché. Este parámetro surte efecto cuando el parámetro cache se establece en ALL. La caché no se actualiza durante los periodos de tiempo que especifique para este parámetro. Este parámetro es adecuado para eventos promocionales en línea a gran escala, como el Double 11.
String
No
Sin valor predeterminado
El siguiente ejemplo muestra el formato de los valores: 2017-10-24 14:00 -> 2017-10-24 15:00, 2017-11-10 23:30 -> 2017-11-11 08:00. Use delimitadores según las siguientes reglas:
Separe varios periodos de tiempo con comas (,).
Separe la hora de inicio y la hora de finalización de cada periodo de tiempo con una flecha (->) que es una combinación de un guion (-) y un signo de mayor que (>).
cacheScanLimit
El número de filas que el servidor de llamada a procedimiento remoto (RPC) devuelve a un cliente cuando el servidor lee todos los datos de una tabla de dimensiones de ApsaraDB for HBase.
Integer
No
100
Este parámetro solo está disponible cuando establece el parámetro cache en ALL.
Asignaciones de tipos de datos
Un valor de un tipo de dato de Realtime Compute for Apache Flink se convierte en una matriz de bytes mediante org.apache.hadoop.hbase.util.Bytes en una tabla de ApsaraDB for HBase. El proceso de decodificación varía según los siguientes escenarios:
Si el tipo de dato de Realtime Compute for Apache Flink no es STRING y un valor en la tabla de ApsaraDB for HBase es una matriz de bytes vacía, el valor se decodifica como nulo.
Si el tipo de dato de Realtime Compute for Apache Flink es STRING y un valor en la tabla de dimensiones de ApsaraDB for HBase es la matriz de bytes especificada por
null-string-literal, el valor se decodifica como nulo.
Tipo de Flink SQL | Función para convertir un valor en bytes para ApsaraDB for HBase | Función para leer bytes desde ApsaraDB for HBase |
CHAR | byte[] toBytes(String s) | String toString(byte[] b) |
VARCHAR | ||
STRING | ||
BOOLEAN | byte[] toBytes(boolean b) | boolean toBoolean(byte[] b) |
BINARY | byte[] | byte[] |
VARBINARY | ||
DECIMAL | byte[] toBytes(BigDecimal v) | BigDecimal toBigDecimal(byte[] b) |
TINYINT | new byte[] { val } | bytes[0] |
SMALLINT | byte[] toBytes(short val) | short toShort(byte[] bytes) |
INT | byte[] toBytes(int val) | int toInt(byte[] bytes) |
BIGINT | byte[] toBytes(long val) | long toLong(byte[] bytes) |
FLOAT | byte[] toBytes(float val) | float toFloat(byte[] bytes) |
DOUBLE | byte[] toBytes(double val) | double toDouble(byte[] bytes) |
DATE | Convierte una fecha en un valor INT que representa el número de días desde el 1 de enero de 1970 y luego en una matriz de bytes mediante | Convierte una matriz de bytes de la base de datos de ApsaraDB for HBase en el tipo de dato INT mediante |
TIME | Convierte una hora en un valor INT que representa el número de milisegundos desde las 00:00:00 y luego en una matriz de bytes mediante | Convierte una matriz de bytes de la base de datos de ApsaraDB for HBase en el tipo de dato INT mediante |
TIMESTAMP | Convierte una marca de tiempo en un valor LONG que representa el número de milisegundos desde las 00:00:00 del 1 de enero de 1970 y luego en una matriz de bytes mediante | Convierte una matriz de bytes de la base de datos de ApsaraDB for HBase en el tipo de dato LONG mediante |
Código de ejemplo
-
Código de ejemplo para una tabla de dimensiones
CREATE TEMPORARY TABLE datagen_source ( a INT, b BIGINT, c STRING, `proc_time` AS PROCTIME() ) WITH ( 'connector'='datagen' ); CREATE TEMPORARY TABLE hbase_dim ( rowkey INT, family1 ROW<col1 INT>, family2 ROW<col1 STRING, col2 BIGINT>, family3 ROW<col1 DOUBLE, col2 BOOLEAN, col3 STRING> ) WITH ( 'connector' = 'cloudhbase', 'table-name' = '<yourTableName>', 'zookeeper.quorum' = '<yourZookeeperQuorum>' ); CREATE TEMPORARY TABLE blackhole_sink( a INT, f1c1 INT, f3c3 STRING ) WITH ( 'connector' = 'blackhole' ); INSERT INTO blackhole_sink SELECT a, family1.col1 as f1c1, family3.col3 as f3c3 FROM datagen_source JOIN hbase_dim FOR SYSTEM_TIME AS OF datagen_source.`proc_time` as h ON datagen_source.a = h.rowkey; -
Código de ejemplo para una tabla sink
CREATE TEMPORARY TABLE datagen_source ( rowkey INT, f1q1 INT, f2q1 STRING, f2q2 BIGINT, f3q1 DOUBLE, f3q2 BOOLEAN, f3q3 STRING ) WITH ( 'connector'='datagen' ); CREATE TEMPORARY TABLE hbase_sink ( rowkey INT, family1 ROW<q1 INT>, family2 ROW<q1 STRING, q2 BIGINT>, family3 ROW<q1 DOUBLE, q2 BOOLEAN, q3 STRING>, PRIMARY KEY (rowkey) NOT ENFORCED ) WITH ( 'connector'='cloudhbase', 'table-name'='<yourTableName>', 'zookeeper.quorum'='<yourZookeeperQuorum>' ); INSERT INTO hbase_sink SELECT rowkey, ROW(f1q1), ROW(f2q1, f2q2), ROW(f3q1, f3q2, f3q3) FROM datagen_source; -
Código de ejemplo para una tabla sink que admite columnas dinámicas
CREATE TEMPORARY TABLE datagen_source ( id INT, f1hour STRING, f1deal BIGINT, f2day STRING, f2deal BIGINT ) WITH ( 'connector'='datagen' ); CREATE TEMPORARY TABLE hbase_sink ( rowkey INT, f1 ROW<`hour` STRING, deal BIGINT>, f2 ROW<`day` STRING, deal BIGINT> ) WITH ( 'connector'='cloudhbase', 'table-name'='<yourTableName>', 'zookeeper.quorum'='<yourZookeeperQuorum>', 'dynamic.table'='true' ); INSERT INTO hbase_sink SELECT id, ROW(f1hour, f1deal), ROW(f2day, f2deal) FROM datagen_source;Si dynamic.table se establece en true, se usa una tabla de ApsaraDB for HBase que admite columnas dinámicas.
Declare dos campos en las filas que corresponden a cada familia de columnas. El valor del primer campo indica la columna dinámica, y el valor del segundo campo indica el valor de la columna dinámica.
Por ejemplo, la tabla datagen_source contiene una fila de datos. La fila de datos indica que el ID del producto es 1, el monto de la transacción del producto entre las 10:00 y las 11:00 es 100, y el monto de la transacción del producto el 26 de julio de 2020 es 10000. En este caso, se inserta una fila cuya rowkey es 1 en la tabla de ApsaraDB for HBase. f1:10 es 100, y f2:2020-7-26 es 10000.