Apache NIFI使用实践

场景一:从Postgresql数据库,同步数据到Mysql数据库

  1. 鼠标右键页面,弹出配置框,进入【Controller Services】:
  2. 点击右侧➕,弹出Controller选择框,在输入框输入目标名称:
  3. 创建【PostgresqlDBCPController】,配置如图:
    1. 配置完成之后,点击右上角的√,测试配置是否链接正常:
    2. 结果如图所示为成功,点击下方【Apply】。
    3. 点击右侧的启用按钮:
    4. 至此,该Controller已经配置为可用状态;
  4. 按照和上面的Postgresql一样的Controller一样的方式,配置一个Mysql Controller。区别在于配置的时候选择mysql驱动即可;需要注意:配置url的时候一定要注意合理的参数值,尤其是超时时间等,不然很容易导致超时,如图
  5. 添加【QueryDatabaseTable】Processor
    1. 双击组件,进入配置页面,选择之前配置好的Postgresql数据库链接Controller,配置数据库表格名称。然后同样的可以点击右侧的➕进行测试,通过之后点击应用。
  6. 按照同样的方式,添加【PutDatabaseRecord】Processor,配置页面如下,选择之前配置好的mysql数据库链接Controller。注意,表格一定要预先创建好。
  7. 之后拖追中间的箭头,链接两个Processor:
  8. 点击左侧的三角按钮,启动整个流程,右侧红色按钮会变为绿色三角:
  9. 可以右键点击组件,查看结果:
  10. 如果你需要修改从Postgresql获取的原始字段内容,比如截取某个字段字符串子串,配置如下
    1. 使用【UpdateRecord】processor:
    2. 注意,【Replacement Value Strategy】一定要选择【Rrcord Path Value】,另外一个【Literal Value】会直接把下面的配置当成字符串直接赋值,不会走公式计算。
    3. 结果对比,
      1. 原来字段内容为:
      2. 更新后字段内容为:
    4. 其他参考转换方法:
      1. replaceRegex(toString(/field_name, ''), '^[\s\n\r]+|[\s\n\r]+$', '')  # 删除前后空格及换行
      2. replaceRegex(toString(/field_name, ''), '[^\d]', '')  # 抽取数字
  11. 如果存在主键重复问题,可以在【PutDatabaseRecord】再加一个【PutDatabaseRecord】,设置为【UPDATE】类型,实现更新操作;相比【INSERT】需要多配置一个更新字段,一般是表格主键;
  12. 注意,预先配置的读写数据库记录相关的Controller,配置参考如图:
  13. 坑一:按照上面的流程实现了个数据迁移流程配置,本来按照预期应该是在【QueryDatabaseTable】设置好【Maximum-value Columns】【Initial Load Strategy】,同时在【PutDatabaseRecord】里面配置了【INSERT】和【UPDATE】策略,就可以一直实时保持增量,但是却发现一直存在数据对不上问题。
    1. 经过各种排查,发现【QueryDatabaseTable】数据拉取是没问题的;
    2. 问题就出现在【PutDatabaseRecord】往目标数据库表格插入的时候出现问题。问题就在于对【Batch Size】批量处理流程的理解。
      1. 一开始,我一直以为我设置的【Batch Size】为【500】,每次往Mysql插入的时候,会自动把可以直接【INSERT】的插入,存在逐渐重复的部分,才会去走【Update】;
      2. 经排查,才发现我理解错了,原来实际的逻辑是:如果一个批次里面,但凡存在一条【INSERT】不成功,整个批次,也就是整个500条,都会算作失败,按照流程,被传递给后面的【UPDATE】;但是按照同样的逻辑,部分之前没有的,直接【UPDATE】也会报错,所以导致最终整个批次都会被丢弃;
    3. 优化方案:
      1. 当【PutDatabaseRecord】因为主键重复失败后,后面接一个【SplitRecord】组件,把批量转化为单个;
      2. 再后面接【INSERT】->【UPDATE】;
    4. 经实践,可以实现实时同步;
  14. 坑二:因为我的源表格数据存在一定的存量插入,所以针对更新时间字段分布不均匀的情况,具体来说就是源表格【updated_time】字段存在十几万条历史数据的相同值。这种情况下,在首次全量时,仅仅配置【Maximum-value Columns】为【updated_time】一个字段,【Batch Size=10000】就会出现问题,所以我联合主键配置了多个【Maximum-value Columns】,即【updated_time,id】,这就给增量流程造成了一个很大的问题:
    1. 【QueryDatabaseTable】组件在已经存在状态后,下一次拉取数据的逻辑如下:
    2. SELECT * FROM getvae1
      WHERE 
        updated_time > '2025-04-18 14:25:00'
        OR (updated_time = '2025-04-18 14:25:00' AND id > 123456789)
      ORDER BY updated_time ASC, vae01 ASC
      LIMIT ...
    3. 可以看到,当出现updated_time字段等于当前状态,但是id小于当前状态时,不会被拉取到,所以,就会出现增量数据被遗漏的情况。

    4. 所以,需要在完成全量后,针对增量进行配置调整,如果后面的新数据updated_time更新合理,可以把【Maximum-value Columns】直接设置为【updated_time】即可。

  15. 坑三【大坑】【增量遗漏数据问题】:按照上面的配置设置了增量,但是监控一段时间之后,发现还是存在目标表数据和源表数据一致性问题。

    1. 仔细梳理NIFI【QueryDatabaseTable】组件拉取数据流程,猜测大概率是【边界值问题导致】。因为我的源数据表格的时间字段updated_time字段是到【秒】,所以一旦发生当前批次拉取之后,state记录为当前时间t1,但是后面源表格出现更新记录的更新时间也是当前时间t1,那么下次就会从大于t1的时间开始拉取,这就出现数据丢失的情况。如果数据更新不频繁,这种情况出现概率较低,但是如果一旦数据更新频繁,这种情况出现的概率就会很大,从我的实际监控来看,隔段时间就会出现十几条的数据遗漏。

    2. 更新方案:

      1. 把数据库更新时间字段精确到微妙,我的不好更新,所以弃了;

      2. 【采用】使用【QueryDatabaseTableRecord】组件:

        1. 该组件和【QueryDatabaseTable】的区别是,如果不配置【Maximum-value Columns】参数,是不会主动记录state状态。可以通过【Custom Query】配置自定义的sql查询语句。

        2. select * from *** where updated_time >= '${now():toNumber():minus(20000):format("yyyy-MM-dd HH:mm:ss")}'

        3. 同时在【Scheduling】配置1个线程,每5秒刷一次。

        4. 最终实现的效果时,每5秒刷一次前20秒的增量数据。会重复,但是能确保不会丢失数据。注意,具体退后多少时间,要根据具体情况来定,如果表格数据量比较大,建议增加时间范围,比如2分钟。

      3. 【候选方案】:正在尝试个人认为更好的方案,即每次拉取的时间从上一次拉取到的最新时间开始,或者为了保证不丢数据,从上次拉取到的最新updated_time-20s开始。问题就在于怎么获取上次拉取到的最新时间。正在尝试,成功后更新。

<think>好的,用户想了解如何部署和使用Apache NiFi 2.3。首先,我需要回忆一下Apache NiFi的基本概念和主要功能。Apache NiFi是一个强大的数据流管理工具,用于自动化数据在系统间的传输和处理。版本2.3可能包含一些新特性或改进,需要确认是否有特别的部署要求。 接下来,部署步骤。通常,部署Apache NiFi可以通过下载二进制包、解压、配置然后启动。可能需要提到系统要求,比如Java环境,因为NiFi是基于Java的。用户可能需要安装JDK 8或更高版本,并设置JAVA_HOME环境变量。另外,配置文件的调整,比如nifi.properties,可能需要调整端口、内存设置等。 然后,配置部分。用户可能需要了解如何配置数据流处理器、连接控制器服务、设置安全(比如SSL/TLS、用户认证)等。NiFi的Web界面是主要的操作入口,所以需要说明如何访问界面,默认端口是8443,但可能需要修改。 使用指南部分,应该包括创建数据流、添加处理器、配置处理器属性、连接处理器、启动数据流等步骤。可能需要举例说明一个常见的数据流,比如从文件系统读取数据,处理后上传到数据库或另一个系统。 此外,用户可能关心集群部署,因为NiFi支持集群模式以提高可用性和扩展性。需要解释如何配置集群节点,ZooKeeper的作用,以及如何管理集群状态。 安全性也是一个重要方面,特别是如果用户处理的是敏感数据。需要提及如何启用HTTPS,设置用户权限,集成LDAP或Kerberos等认证方式。 最后,常见问题及故障排除。比如服务无法启动、端口冲突、性能调优等。可能需要给出日志查看的位置,如何调整JVM参数优化性能,以及如何监控数据流的运行状态。 还需要检查是否有最新的官方文档更新,确保建议的步骤适用于2.3版本。可能还需要参考用户提供的引用资料,但看起来引用[1]是关于数据管理的规划指南,可能与NiFi的具体部署关联不大,但可以提到数据管理的最佳实践作为补充。 生成的相关问题可能需要涉及版本升级、安全配置、集群配置、性能优化等,这些都是用户在部署和使用过程中可能遇到的后续问题。</think>### Apache NiFi 2.3 部署与使用指南 #### 1. 部署步骤 **1.1 系统要求** - Java 环境:需安装 JDK 8 或更高版本,并配置 `JAVA_HOME` 环境变量[^1]。 - 内存建议:至少分配 2GB 堆内存(通过修改 `conf/bootstrap.conf` 中的 `java.arg.2=-Xms512m -Xmx2048m`)。 **1.2 下载与安装** - 从 [Apache NiFi 官网](https://nifi.apache.org/) 下载 2.3 版本二进制包。 - 解压文件:`tar -xzf nifi-2.3.0-bin.tar.gz`。 **1.3 基础配置** - 修改 `conf/nifi.properties`: ```properties # Web 端口配置 nifi.web.http.port=8080 nifi.web.https.port=8443 # 集群配置(单机可跳过) nifi.cluster.is.node=false ``` - 启动 NiFi:`./bin/nifi.sh start`(Linux)或 `bin\\nifi.bat run`(Windows)。 #### 2. 使用指南 **2.1 Web 界面访问** - 浏览器访问 `https://localhost:8443/nifi`(首次需信任自签名证书)。 **2.2 创建数据流** 1. **拖放处理器**:从左侧面板拖拽 `GetFile`(读取文件)到画布。 2. **配置处理器**:双击处理器,设置输入目录(如 `/opt/nifi/input`)。 3. **添加处理器**:连接 `PutFile`(输出文件)并配置输出目录。 4. **连接流**:通过箭头链接处理器,设置数据传输关系。 **2.3 数据流监控** - 通过仪表盘查看吞吐量、队列状态等指标。 - 使用 `Provenance` 功能追踪数据来源和去向。 #### 3. 安全配置 - **启用 HTTPS**:在 `nifi.properties` 中配置证书路径: ```properties nifi.security.keystore=/path/to/keystore.jks nifi.security.truststore=/path/to/truststore.jks ``` - **用户认证**:通过 `conf/login-identity-providers.xml` 集成 LDAP 或 OpenID Connect。 #### 4. 集群部署(可选) 1. 修改所有节点的 `nifi.properties`: ```properties nifi.cluster.is.node=true nifi.cluster.node.address=node1.example.com nifi.zookeeper.connect.string=zk1:2181,zk2:2181 ``` 2. 启动 ZooKeeper 集群,并依次启动 NiFi 节点。 #### 5. 性能优化 - **JVM 调优**:调整 `bootstrap.conf` 中的堆内存参数。 - **线程池配置**:在 `nifi.properties` 中优化 `nifi.bored.yield.duration` 和 `nifi.queue.backpressure.count`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值