nifi简介
使用:流数据处理平台,丰富的处理器,一周内有更新代码、文档丰富有中文版
优点:
-
可视化编排:拖拽式流程设计,无需编码即可完成大多数 ETL 操作。
-
实时流处理:支持增量数据处理(如
QueryDatabaseTable
监听新增数据)。 -
扩展性:支持自定义处理器(Java)或脚本(Python/Groovy)。
-
容错机制:自动重试、背压控制、数据溯源(Provenance)。
缺点:
-
复杂计算:窗口聚合、多流 JOIN 等需配合外部工具(如 Spark)。
-
大数据量批处理:单节点性能有限,超大规模数据建议分流到 Hadoop 或 Flink。
总结:
NiFi 能够满足绝大多数数据清洗和转换需求,尤其适合,
-
实时或微批处理场景。
-
需要快速原型设计的 ETL 流程。
-
与异构系统(数据库、API、消息队列)集成的场景。
对于超大规模数据或复杂计算,可将 NiFi 作为数据接入层,搭配 Spark/Flink 进行后续处理
版本环境问题
环境要求:nifi1要求java8或11,nifi2要求java21
目前服务器和windows系统的java版本都很低,只能部署使用nifi1.x,流数据处理只支持python2.x或者走命令行运行脚本。
镜像部署,nifi2.4.0镜像自带java,支持python3。
docker pull apache/nifi:2.4.0
安装包直接部署
Windows安装
双击启动bin/run-nifi.bat,一定要ctrilC关闭,启动后web访问NiFi Flow
Linux安装步骤:
1、设置java环境变量,修改配置文件nifi.web.https.host=服务器地址,注意端口号是8443
2、设置用户名和密码: bin/nifi.sh set-single-user-credentials admin coreiod123456
3、后台启动nifi: bin/nifi.sh start
4、验证:进程查看ps -ef | grep nifi,端口使用查看 ss -tulnp | grep 8443
nifi2.4.0docker 部署
部署尝试:
1、HTTP8080部署,尝试失败,系统默认使用https部署
2、HTTPS8443部署,容器运行正常但是访问总是error 400 invalid sni。
3、尝试(1)配置文件挂载(amount 冲突),(2)在原镜像基础上重新打镜像、把修改好的配置文件进行挂载,重打镜像启动.sh文件会找不到,(3)生成证书,外部挂载、修改环境变量,部分环境变量修改无法生效。
总结:上面的问题主要是因为NiFi 官方镜像的一个“坑”:其 ENTRYPOINT 脚本(/opt/nifi/scripts/start.sh)会在容器启动时自动检测并修改配置文件(如nifi.properties),可以通过环境变量修改部分配置,但是要确定你使用的环境变量名是对的,然后配置文件确定修改了。如果你挂载了自定义配置,这种自动修改往往会导致“Device or resource busy”或配置被覆盖。具体解决参考nifi集群部署。
docker run -d \ --name nifi-2.4.0 \ -p 8443:8443 \ -e NIFI_WEB_HTTPS_HOST=0.0.0.0 \ -e NIFI_WEB_HTTPS_PORT=8443 \ -e NIFI_SENSITIVE_PROPS_KEY=Sec@xxxxxxxxx \ -e TZ=Asia/Shanghai \ -v <pwd>/nifi-data:/opt/nifi/nifi-current/database \ -v <pwd>/nifi-log:/opt/nifi/nifi-current/log \ apache/nifi:2.4.0
在启动nifi2.4.0镜像后,容器运行正常但是访问总error 400 invalid sni
详细解决步骤
1. 进入 NiFi 容器
docker exec -it nifi-2.4.0 bash
2. 进入配置目录并备份/删除原有证书
cd /opt/nifi/nifi-current/conf mv keystore.p12 keystore.p12.bak mv truststore.p12 truststore.p12.bak
3. 生成新的 keystore 和 truststore
使用 keytool(推荐,官方支持)
生成 keystore.p12(将 CN 和 SAN 替换为你的实际 IP 或域名)
keytool -genkeypair -alias nifi-cert -keyalg RSA -keysize 2048 -validity 365 \ -keystore keystore.p12 -storetype PKCS12 \ -dname "CN=你的服务器IP, OU=Org, O=Company, L=City, S=State, C=CN" \ -ext "SAN=IP:你的服务器IP" 会要求你输入密码,我都用相同的:Sec@xxxxxxxxx
导出证书
keytool -exportcert -alias nifi-cert -file nifi-cert.crt -keystore keystore.p12 -storetype PKCS12
生成 truststore.p12
keytool -importcert -alias nifi-cert -file nifi-cert.crt -keystore truststore.p12 -storetype PKCS12
4. 修改 nifi.properties 配置
找到 nifi.properties 文件,确保如下配置项与你的实际 IP/域名和端口一致:
nifi.web.https.host=你的IP或域名 nifi.web.https.port=8443 nifi.security.keystore=./keystore.p12 nifi.security.keystoreType=PKCS12 nifi.security.keystorePasswd=你的keystore密码 nifi.security.keyPasswd=你的keystore密码 nifi.security.truststore=./truststore.p12 nifi.security.truststoreType=PKCS12 nifi.security.truststorePasswd=你的keystore密码 容器内没有vim等工具,可以使用sed修改: sed -i 's|^nifi.security.keystorePasswd=.*|nifi.security.keystorePasswd=你的keystore密码|' nifi.properties sed -i 's|^nifi.security.keyPasswd=.*|nifi.security.keyPasswd=你的keystore密码|' nifi.properties sed -i 's|^nifi.security.truststorePasswd=.*|nifi.security.truststorePasswd=你的keystore密码|' nifi.properties
你的keystore密码,我都用了相同的:Sec@xxxxxxxxx
5. 重启 NiFi 容器
docker restart nifi
6. 访问测试
用浏览器访问 https://你的服务器IP:8443/nifi,应能正常打开 NiFi UI。
找用户名和密码,容器日志中查找Generated Username:
Generated Username [db7f1a89-bfd2-41ae-b5ce-xxxxxxxxxxxx] Generated Password [4Fei/ZGR2woJTGF8nKxxxxxxxxxxxx]