necesidad
Cuando se utiliza Apache NiFi para distribuir datos maestros empresariales a sistemas comerciales posteriores en tiempo real, los sistemas posteriores incluyen MySQL, PostgreSQL, Oracle y otros sistemas comerciales, entre ellos, NiFi no admite directamente la semántica Oracle Upsert, lo que genera errores de inserción. cuando se actualiza una gran cantidad de datos maestros, como productos y materiales, el método de actualización distribuye datos de Orace en sentido descendente, pero el rendimiento es insuficiente. Por lo tanto, planeamos implementar la función Upsert personalizando el Procesador y utilizando la sintaxis Merge into integrada de Oracle.
En Apache NiFi Custom Processor ,
se presenta el proceso de configuración del entorno del procesador de desarrollo personalizado Apache NiFi. Este artículo presenta cómo lograr el soporte de NiFi para la función integrada de fusión de Oracle modificando la clase PutDatabaseRecord.java en el código fuente de NiFi.
Preparación del entorno de desarrollo.
Consulte los pasos introducidos en el procesador personalizado Apache NiFi en detalle para completar la configuración del entorno de desarrollo.
Procesador upsert personalizado de Oracle
VS Code Ver el código fuente de NiFi
Al autor le gusta utilizar IDEA como IDE de desarrollo de Java y VS Code como una simple recuperación de código o almacén de datos, front-end, Rust y otras herramientas de desarrollo. La velocidad de inicio de VS Code parece mucho más rápida que la de IDEA.
Al explorar el código fuente de NiFi, busque el archivo PutDatabaseRecord.java.
- Github descarga el último código de NiFi
- Explorando el código fuente de NiFi, busque el archivo PutDatabaseRecord.java
Construir el entorno de desarrollo IDEA
Paso 1: comente todo el archivo de clase MyProcessor.java
Paso 2: Copie PutDatabaseRecord.java al entorno de desarrollo de IDEA
Después de copiar directamente el código fuente en IDEA, puede haber errores como se muestra en la imagen de arriba. El método de corrección es el siguiente:
- En el archivo pom del proyecto principal, es necesario modificar 1.4.0 a 15.3
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.apache.nifi</groupId>
<artifactId>nifi-nar-bundles</artifactId>
<version>1.15.3</version>
</parent>
<groupId>com</groupId>
<artifactId>cvte</artifactId>
<version>1.0</version>
<packaging>pom</packaging>
<modules>
<module>nifi-cvte-processors</module>
<module>nifi-cvte-nar</module>
</modules>
</project>
- subproyecto de procesador pom, introducir paquetes de dependencia
<!-- DB控件服务相关包,数据库链接之类的配置-->
<dependency>
<groupId>org.apache.nifi</groupId>
<artifactId>nifi-standard-services-api-nar</artifactId>
<version>1.15.3</version>
<type>nar</type>
</dependency>
<!-- PutDatabaseRecord相关包 注释掉以下包,重写 DatabaseAdapter类,否则会生成1.0版本的标准Processor,详见源码-->
<dependency>
<groupId>org.apache.nifi</groupId>
<artifactId>nifi-standard-processors</artifactId>
<version>1.15.3</version>
<scope>provided</scope>
</dependency>
<!-- org.apache.nifi.serialization.RecordReaderFactory -->
<dependency>
<groupId>org.apache.nifi</groupId>
<artifactId>nifi-record-serialization-service-api</artifactId>
<version>1.15.3</version>
<scope>provided</scope>
</dependency>
Paso 3: modificar el nombre de la clase
Para evitar el conflicto entre el nombre del archivo de clase personalizado PutDatabaseRecord y el nombre de clase del procesador estándar NiFi, use el cambio de nombre de Idea para modificar el nombre de la clase a: PutOracleDatabaseRecordMerge. Después de la modificación, debe modificar el nombre de la clase al que se hace referencia en el archivo de recursos.
Agregar clase de adaptador de base de datos de operación
- Copie el código fuente de NiFi DatabaseAdapter y modifique el nombre de la clase a CvteDatabaseAdapter sin modificar el contenido del código.
- Copie el código fuente de NiFi PostgreSQLDatabaseAdapter y modifique el nombre de la clase a CvteOracleDatabaseAdapter, el código modificado es el siguiente:
Modificar el código PutDatabaseRecordMerge
Modificar metainformación
https://github.com/dawsongzhao1104/nifi/tree/main/nifi-processor https://github.com/dawsongzhao1104/nifi/tree/main/nifi-processor
Paso 4: empaquetar y ejecutar
⚠️Problema: A una gran cantidad de componentes estándar se les ha agregado la versión 1.0. Esto parece ser introducido por nosotros. Consulte el paquete PutDatabaseRecordMerge.nar que compilamos, que tiene más de 58 MB. El paquete nar del procesador estándar es de aproximadamente 12 MB. Supongo que debería deberse a que nuestra herramienta de empaquetado copia el Procesador estándar en su propio Procesador.
- Para resolver el problema de agregar la versión 1.0 de componentes estándar
, comentenifi-standard-processors
el paquete Jar dependiente. Anular la clase DatabaseAdapter
Prueba de verificación
Configurar el servicio de base de datos
Configurar JsonTreeReader
Configurar JsonRecordSetWriter
ConfigurarExecuteSQLRecord
Configurar el entorno de verificación
Referencias
[1] https://community.cloudera.com/t5/Community-Articles/Build-Custom-Nifi-Processor/ta-p/244734
[2] https://www.youtube.com/watch?v=v2u0WsPs2Ac
Resumir
nifi-standard-processors
Este artículo explica cómo implementar la combinación de Oracle reescribiendo el código fuente de PutDatabaseRecord y explora el problema estándar del Procesador de generar un número de versión personalizado reescribiendo el DatabaseAdapter y comentando las dependencias para evitarlo.
Si tiene alguna pregunta sobre este artículo, no dude en agregar Q para discusión: 568072887