Este tema describe cómo utilizar la demostración de un cliente Kafka para consumir datos rastreados. La función de seguimiento de cambios de la nueva versión permite consumir los datos rastreados mediante un cliente Kafka en versiones desde la V0.11 hasta la V2.7.
Notas de uso
-
Si habilita el commit automático al usar la función de seguimiento de cambios, es posible que algunos datos se confirmen antes de consumirse, lo cual provoca pérdida de información. Se recomienda realizar el commit de los datos manualmente.
NotaSi falla el commit de los datos, reinicie el cliente para continuar consumiéndolos desde el último punto de control de consumo registrado. No obstante, durante este periodo podrían generarse datos duplicados que deberá filtrar manualmente.
-
Los datos se serializan y almacenan en formato Avro. Para obtener más información, consulte Record.avsc.
AvisoSi no utiliza el cliente Kafka descrito en este tema, debe analizar sintácticamente los datos rastreados según el esquema Avro (Ejemplo de deserialización Avro de DTS) y comprobar los datos analizados.
La unidad de búsqueda es el segundo cuando Data Transmission Service (DTS) invoca la operación
offsetForTimes. En cambio, la unidad es el milisegundo cuando un cliente Kafka nativo ejecuta esta misma operación.Pueden producirse conexiones transitorias entre un cliente Kafka y el servidor de seguimiento de cambios debido a diversos motivos, como la recuperación ante desastres. Si no emplea el cliente Kafka descrito en este tema, asegúrese de que su cliente cuente con capacidades de reconexión de red.
Al utilizar un cliente Kafka nativo para consumir datos rastreados, el módulo de recolección de datos incrementales podría modificarse en DTS. En el modo de suscripción, se elimina el punto de control de consumo que el cliente Kafka guarda en el servidor DTS. Por ello, debe especificar un punto de control de consumo acorde a sus necesidades empresariales. Si desea consumir datos en modo de suscripción, se recomienda usar la demostración del SDK proporcionada por DTS para rastrear y consumir los datos, o bien gestionar manualmente el punto de control de consumo. Para más detalles, consulte Consume subscribed data using an SDK y la sección Manage the consumption checkpoint de este tema.
Ejecución del cliente Kafka
Descargue la demostración del cliente Kafka. Para obtener más información sobre cómo usar la demostración, consulte Readme.
Haga clic en
y seleccione Download ZIP para descargar el paquete.Si utiliza un cliente Kafka versión 2.0, cambie el número de versión en el archivo subscribe_example-master/javaimpl/pom.xml a 2.0.0.
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.0.0</version>
</dependency>
|
Paso |
Directorio o archivo relacionado |
|
1. Utilice el consumidor nativo de Kafka para obtener datos incrementales de la instancia de seguimiento de cambios. |
subscribe_example-master/javaimpl/src/main/java/recordgenerator/ |
|
2. Deserialice la imagen de los datos incrementales y obtenga la imagen anterior , la imagen posterior y otros atributos. Aviso
|
subscribe_example-master/javaimpl/src/main/java/boot/RecordPrinter.java |
|
3. Convierta los valores dataTypeNumber de los datos deserializados a los tipos de datos correspondientes de la base de datos. Nota
Para obtener más información, consulte las siguientes secciones de este tema: |
subscribe_example-master/javaimpl/src/main/java/recordprocessor/mysql/ |
Procedimiento
A continuación se muestran los pasos para ejecutar el cliente Kafka y consumir datos rastreados. En este ejemplo se utiliza IntelliJ IDEA Community Edition 2018.1.4 para Windows.
Cree una instancia de seguimiento de cambios. Para más información, consulte Change tracking overview.
Cree uno o más grupos de consumidores. Para más información, consulte Add a consumer group.
-
Descargue el paquete de la demostración del cliente Kafka y descomprímalo.
NotaHaga clic en
y seleccione Download ZIP para descargar el paquete. Abra IntelliJ IDEA. En la ventana que aparece, haga clic en Open.
-
En el cuadro de diálogo que aparece, vaya al directorio donde reside la demostración descargada. Localice el archivo pom.xml.
Vaya a
kafkademo>subscribe_example-master>javaimpl, seleccionepom.xmly luego haga clic en OK. En el cuadro de diálogo que aparece, seleccione Open as Project.
En la ventana de herramientas Project de IntelliJ IDEA, navegue por las carpetas para encontrar el archivo de demostración del cliente Kafka y haga doble clic en él. El nombre del archivo es NotifyDemoDB.java.
-
Especifique los parámetros en el archivo NotifyDemoDB.java.
public static Properties getConfigs() { Properties properties = new Properties(); // user password and sid for auth properties.setProperty(USER_NAME, "dtstest"); properties.setProperty(PASSWORD_NAME, "xxx"); properties.setProperty(SID_NAME, "dtsxxx"); // kafka consumer group general same with sid properties.setProperty(GROUP_NAME, "dtsxxx"); // topic to consume, partition is 0 properties.setProperty(KAFKA_TOPIC, "cn_hangzhou_xxx"); // kafka broker url properties.setProperty(KAFKA_BROKER_URL_NAME, "dts-cn-xxx.com:18001"); // initial checkpoint for first seek(a timestamp to set, eg 1566180200 if you want (Mon Aug 19 10:03:21 CST 2019)) properties.setProperty(INITIAL_CHECKPOINT_NAME, "1583307907"); // if force use config checkpoint when start. for checkpoint reset properties.setProperty(USE_CONFIG_CHECKPOINT_NAME, "true"); // use consumer assign or subscribe interface // when use subscribe mode, group config is required. kafka consumer group is enabled properties.setProperty(SUBSCRIBE_MODE_NAME, "assign"); return properties; }Parámetro
Descripción
Método para obtener el valor del parámetro
USER_NAME
Nombre de usuario de la cuenta del grupo de consumidores.
AvisoSi no utiliza el cliente Kafka descrito en este tema, debe especificar este parámetro con el siguiente formato:
<Username>-<Consumer group ID>. Ejemplo:dtstest-dtsaebpv. De lo contrario, la conexión fallará.En la consola de DTS, localice la instancia de seguimiento de cambios que desea gestionar y haga clic en su ID. En el panel de navegación izquierdo, haga clic en Consume Data. En la página que aparece podrá consultar la información del grupo de consumidores, como su ID, nombre y cuenta.
NotaLa contraseña de la cuenta del grupo de consumidores se establece al crear dicho grupo.
PASSWORD_NAME
Contraseña de la cuenta.
SID_NAME
ID del grupo de consumidores.
GROUP_NAME
Nombre del grupo de consumidores. Establezca este parámetro con el ID del grupo de consumidores.
KAFKA_TOPIC
Nombre del tema rastreado de la instancia de seguimiento de cambios.
En la consola de DTS, localice la instancia de seguimiento de cambios que desea gestionar y haga clic en su ID. En la página Basic Information puede consultar la información del tema y de la red. En la sección Basic Information de la página de detalles de la tarea de seguimiento de cambios, obtenga el valor de Subscription Topic. En la sección Network, obtenga la VPC network address (ejemplo de formato:
xxx.aliyuncs.com:18003).KAFKA_BROKER_URL_NAME
Endpoint de la instancia de seguimiento de cambios.
NotaSi rastrea cambios de datos a través de redes internas, la latencia de red es mínima. Esto aplica cuando la instancia de Elastic Compute Service (ECS) donde despliega el cliente Kafka se encuentra en la red clásica o en la misma nube privada virtual (VPC) que la instancia de seguimiento de cambios.
INITIAL_CHECKPOINT_NAME
Punto de control de consumo de los datos consumidos. El valor es una marca de tiempo UNIX. Ejemplo: 1592269238.
Nota-
Debe guardar el punto de control de consumo por las siguientes razones:
-
Si se interrumpe el proceso de consumo, puede especificar el punto de control en el cliente Kafka para reanudar el consumo de datos y evitar su pérdida.
-
Al iniciar el cliente Kafka, puede especificar el punto de control de consumo para procesar los datos según sus necesidades empresariales.
-
-
Si el parámetro SUBSCRIBE_MODE_NAME está configurado como subscribe, el parámetro INITIAL_CHECKPOINT_NAME que especifique solo surtirá efecto la primera vez que inicie el cliente Kafka.
El punto de control de consumo de los datos consumidos debe encontrarse dentro del rango de datos de la instancia de seguimiento de cambios. Este punto de control debe convertirse a una marca de tiempo UNIX. En la lista de tareas de seguimiento de cambios de DTS, puede consultar el campo Data Range de la tarea correspondiente, el cual muestra la hora de inicio y fin de los datos disponibles para consumo. Utilice este campo para determinar el rango de valores válidos de INITIAL_CHECKPOINT_NAME.
Nota-
Puede consultar el rango de datos de la instancia de seguimiento de cambios en la columna Data Range de la página Change Tracking Tasks.
-
Puede utilizar un motor de búsqueda para encontrar un convertidor de marcas de tiempo UNIX.
USE_CONFIG_CHECKPOINT_NAME
Especifica si se debe forzar al cliente a consumir datos desde el punto de control de consumo indicado. Valor predeterminado: true. Puede establecer este parámetro en true para evitar la pérdida de datos recibidos pero aún no procesados.
Ninguna
SUBSCRIBE_MODE_NAME
Especifica si se ejecutarán dos o más clientes Kafka para un mismo grupo de consumidores. Si desea utilizar esta función, establezca este parámetro en subscribe para dichos clientes Kafka.
El valor predeterminado es assign, lo que indica que la función no se utiliza. Se recomienda desplegar solo un cliente Kafka por grupo de consumidores.
Ninguna
-
-
En la barra de menú superior de IntelliJ IDEA, vaya a para ejecutar el cliente.
NotaSi ejecuta IntelliJ IDEA por primera vez, se requerirá cierto tiempo para cargar e instalar las dependencias correspondientes.
Resultados en el cliente Kafka
El siguiente resultado muestra que el cliente Kafka puede rastrear cambios de datos desde la base de datos de origen.
[2020-03-09 10:41:52,408] INFO [Consumer clientId=consumer-1, groupId=dts_xxx] Discovered coordinator xxx (id: xxx rack: null) (org.apache.kafka.clients.consumer.internals.AbstractCoordinator)
[2020-03-09 10:41:57,203] INFO commit record with checkpoint Checkpoint[ topicPartition: cn_hangzhou_rm_xxx_dtstest-0timestamp: 1583721711, offset: 1732521, info: 1583721711] (recordprocessor.EtlRecordProcessor)
[2020-03-09 10:41:57,571] INFO EtlRecordProcessor: haven't receive records from generator for 5s (recordprocessor.EtlRecordProcessor)
[2020-03-09 10:42:02,203] INFO commit record with checkpoint Checkpoint[ topicPartition: cn_hangzhou_rm_xxx_dtstest-0timestamp: 1583721721, offset: 1732539, info: 1583721721] (recordprocessor.EtlRecordProcessor)
[2020-03-09 10:42:07,204] INFO commit record with checkpoint Checkpoint[ topicPartition: cn_hangzhou_rm_xxx_dtstest-0timestamp: 1583721726, offset: 1732544, info: 1583721726] (recordprocessor.EtlRecordProcessor)
[2020-03-09 10:42:12,205] INFO commit record with checkpoint Checkpoint[ topicPartition: cn_hangzhou_rm_xxx_dtstest-0timestamp: 1583721731, offset: 1732548, info: 1583721731] (recordprocessor.EtlRecordProcessor)
[2020-03-09 10:42:17,205] INFO commit record with checkpoint Checkpoint[ topicPartition: cn_hangzhou_rm_xxx_dtstest-0timestamp: 1583721736, offset: 1732554, info: 1583721736] (recordprocessor.EtlRecordProcessor)
[2020-03-09 10:42:22,205] INFO commit record with checkpoint Checkpoint[ topicPartition: cn_hangzhou_rm_xxx_dtstest-0timestamp: 1583721741, offset: 1732559, info: 1583721741] (recordprocessor.EtlRecordProcessor)
[2020-03-09 10:42:27,206] INFO commit record with checkpoint Checkpoint[ topicPartition: cn_hangzhou_rm_xxx_dtstest-0timestamp: 1583721746, offset: 1732569, info: 1583721746] (recordprocessor.EtlRecordProcessor)
Puede eliminar las barras diagonales dobles (//) de la cadena //log.info(ret) en la línea 25 del archivo NotifyDemoDB.java. A continuación, ejecute nuevamente el cliente para consultar la información de cambios de datos.
Preguntas frecuentes
-
P: ¿Por qué necesito registrar el punto de control de consumo del cliente Kafka?
R: El punto de control de consumo registrado por DTS corresponde al momento en que DTS recibe una operación de commit del cliente Kafka. Este punto registrado puede diferir del tiempo real de consumo. Si una aplicación empresarial o el cliente Kafka se interrumpen inesperadamente, podrá especificar un punto de control de consumo preciso para continuar el procesamiento de datos, evitando así la pérdida de información o el consumo duplicado.
Gestión del punto de control de consumo
-
Configure el cliente Kafka para que escuche el cambio del módulo de recolección de datos en DTS.
Puede configurar las propiedades del consumidor del cliente Kafka para escuchar el cambio del módulo de recolección de datos en DTS. El siguiente código muestra un ejemplo de cómo configurar dichas propiedades:
properties.setProperty(ConsumerConfig.INTERCEPTOR_CLASSES_CONFIG, ClusterSwitchListener.class.getName());El siguiente código proporciona un ejemplo de cómo implementar ClusterSwitchListener:
public class ClusterSwitchListener implements ClusterResourceListener, ConsumerInterceptor { private final static Logger LOG = LoggerFactory.getLogger(ClusterSwitchListener.class); private ClusterResource originClusterResource = null; private ClusterResource currentClusterResource = null; public ConsumerRecords onConsume(ConsumerRecords records) { return records; } public void close() { } public void onCommit(Map offsets) { } public void onUpdate(ClusterResource clusterResource) { synchronized (this) { originClusterResource = currentClusterResource; currentClusterResource = clusterResource; if (null == originClusterResource) { LOG.info("Cluster updated to " + currentClusterResource.clusterId()); } else { if (originClusterResource.clusterId().equals(currentClusterResource.clusterId())) { LOG.info("Cluster not changed on update:" + clusterResource.clusterId()); } else { LOG.error("Cluster changed"); throw new ClusterSwitchException("Cluster changed from " + originClusterResource.clusterId() + " to " + currentClusterResource.clusterId() + ", consumer require restart"); } } } } public boolean isClusterResourceChanged() { if (null == originClusterResource) { return false; } if (originClusterResource.clusterId().equals(currentClusterResource.clusterId())) { return false; } return true; } public void configure(Map<String, ?> configs) { } public static class ClusterSwitchException extends KafkaException { public ClusterSwitchException(String message, Throwable cause) { super(message, cause); } public ClusterSwitchException(String message) { super(message); } public ClusterSwitchException(Throwable cause) { super(cause); } public ClusterSwitchException() { super(); } } -
Especifique el punto de control de consumo basándose en el cambio detectado del módulo de recolección de datos en DTS.
Establezca el punto de control de inicio del próximo seguimiento de datos con la marca de tiempo de la última entrada de datos rastreada que consumió el cliente. El siguiente código muestra un ejemplo de cómo especificar el punto de control de consumo:
try{ //do some action } catch (ClusterSwitchListener.ClusterSwitchException e) { reset(); } // Reset the consumption checkpoint. public reset() { long offset = kafkaConsumer.offsetsForTimes(timestamp); kafkaConsumer.seek(tp,offset); }NotaPara obtener más información sobre los ejemplos, consulte KafkaRecordFetcher.
Asignaciones entre tipos de datos MySQL y valores dataTypeNumber
Para obtener más información, consulte Campo SQL Type.
|
Tipo de dato MySQL |
Valor de dataTypeNumber |
|
MYSQL_TYPE_DECIMAL |
0 |
|
MYSQL_TYPE_INT8 |
1 |
|
MYSQL_TYPE_INT16 |
2 |
|
MYSQL_TYPE_INT32 |
3 |
|
MYSQL_TYPE_FLOAT |
4 |
|
MYSQL_TYPE_DOUBLE |
5 |
|
MYSQL_TYPE_NULL |
6 |
|
MYSQL_TYPE_TIMESTAMP |
7 |
|
MYSQL_TYPE_INT64 |
8 |
|
MYSQL_TYPE_INT24 |
9 |
|
MYSQL_TYPE_DATE |
10 |
|
MYSQL_TYPE_TIME |
11 |
|
MYSQL_TYPE_DATETIME |
12 |
|
MYSQL_TYPE_YEAR |
13 |
|
MYSQL_TYPE_DATE_NEW |
14 |
|
MYSQL_TYPE_VARCHAR |
15 |
|
MYSQL_TYPE_BIT |
16 |
|
MYSQL_TYPE_TIMESTAMP_NEW |
17 |
|
MYSQL_TYPE_DATETIME_NEW |
18 |
|
MYSQL_TYPE_TIME_NEW |
19 |
|
MYSQL_TYPE_JSON |
245 |
|
MYSQL_TYPE_DECIMAL_NEW |
246 |
|
MYSQL_TYPE_ENUM |
247 |
|
MYSQL_TYPE_SET |
248 |
|
MYSQL_TYPE_TINY_BLOB |
249 |
|
MYSQL_TYPE_MEDIUM_BLOB |
250 |
|
MYSQL_TYPE_LONG_BLOB |
251 |
|
MYSQL_TYPE_BLOB |
252 |
|
MYSQL_TYPE_VAR_STRING |
253 |
|
MYSQL_TYPE_STRING |
254 |
|
MYSQL_TYPE_GEOMETRY |
255 |
Asignaciones entre tipos de datos Oracle y valores dataTypeNumber
|
Tipo de dato Oracle |
Valor de dataTypeNumber |
|
VARCHAR2/NVARCHAR2 |
1 |
|
NUMBER/FLOAT |
2 |
|
LONG |
8 |
|
DATE |
12 |
|
RAW |
23 |
|
LONG_RAW |
24 |
|
UNDEFINED |
29 |
|
XMLTYPE |
58 |
|
ROWID |
69 |
|
CHAR y NCHAR |
96 |
|
BINARY_FLOAT |
100 |
|
BINARY_DOUBLE |
101 |
|
CLOB/NCLOB |
112 |
|
BLOB |
113 |
|
BFILE |
114 |
|
TIMESTAMP |
180 |
|
TIMESTAMP_WITH_TIME_ZONE |
181 |
|
INTERVAL_YEAR_TO_MONTH |
182 |
|
INTERVAL_DAY_TO_SECOND |
183 |
|
UROWID |
208 |
|
TIMESTAMP_WITH_LOCAL_TIME_ZONE |
231 |
Asignaciones entre tipos de datos PostgreSQL y valores dataTypeNumber
|
Tipo de dato PostgreSQL |
Valor de dataTypeNumber |
|
INT2/SMALLINT |
21 |
|
INT4/INTEGER/SERIAL |
23 |
|
INT8/BIGINT |
20 |
|
CHARACTER |
18 |
|
CHARACTER VARYING |
1043 |
|
REAL |
700 |
|
DOUBLE PRECISION |
701 |
|
NUMERIC |
1700 |
|
MONEY |
790 |
|
DATE |
1082 |
|
TIME/TIME WITHOUT TIME ZONE |
1083 |
|
TIME WITH TIME ZONE |
1266 |
|
TIMESTAMP/TIMESTAMP WITHOUT TIME ZONE |
1114 |
|
TIMESTAMP WITH TIME ZONE |
1184 |
|
BYTEA |
17 |
|
TEXT |
25 |
|
JSON |
114 |
|
JSONB |
3082 |
|
XML |
142 |
|
UUID |
2950 |
|
POINT |
600 |
|
LSEG |
601 |
|
PATH |
602 |
|
BOX |
603 |
|
POLYGON |
604 |
|
LINE |
628 |
|
CIDR |
650 |
|
CIRCLE |
718 |
|
MACADDR |
829 |
|
INET |
869 |
|
INTERVAL |
1186 |
|
TXID_SNAPSHOT |
2970 |
|
PG_LSN |
3220 |
|
TSVECTOR |
3614 |
|
TSQUERY |
3615 |