Reescriba NiFi PutDatabaseRecord para implementar Oracle Merge/Upsert

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
    , comente nifi-standard-processorsel 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-processorsEste 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

Supongo que te gusta

Origin blog.csdn.net/zdsx1104/article/details/124418818
Recomendado
Clasificación