NiFi实现数据存储到数据库

NiFi实现数据存储到数据库

一、NiFi环境搭建

1. Docker拉取NiFi镜像

使用 Docker 拉取 Apache NiFi 镜像。

bash 复制代码
docker pull apache/nifi:1.26.0

2. 创建自定义容器互联网络

自定义一个 Docker 网络,让两个容器能够互相通过容器名互联。

bash 复制代码
docker network create nifi-net

3. NiFi数据持久化处理

可以先启动一个临时容器,将原始 conf 拷到宿主机:

bash 复制代码
# 创建一个临时容器(不启动 NiFi)
docker create --name nifi-temp apache/nifi:1.26.0

# 拷贝 conf 到宿主机
docker cp nifi-temp:/opt/nifi/nifi-current/conf D:/Tools/Docker/nifi/

# 删除临时容器
docker rm nifi-temp

4. 启动NiFi容器

启动 NiFi 容器, 命名为 nifi

官方 Docker 镜像支持直接用环境变量来覆盖端口配置:

  • NIFI_WEB_HTTP_PORT:设置 HTTP 端口
  • NIFI_WEB_HTTP_HOST:绑定地址
  • 不要设置 NIFI_WEB_HTTPS_PORT/NIFI_WEB_HTTPS_HOST,NiFi 就不会启用 HTTPS。
bash 复制代码
docker run -d --name nifi -e TZ="Asia/Shanghai" --network nifi-net --privileged=true -e SINGLE_USER_CREDENTIALS_USERNAME=admin -e SINGLE_USER_CREDENTIALS_PASSWORD=nifi1357924680 -e NIFI_WEB_HTTP_HOST=0.0.0.0 -e NIFI_WEB_HTTP_PORT=8080 -e NIFI_REMOTE_INPUT_SOCKET_PORT=10000 -p 8080:8080 -p 10000:10000 -p 9090:9090 -p 9091:9091 -p 9092:9092 -p 9093:9093 -p 9094:9094 -p 9095:9095 -v D:/Tools/Docker/nifi/conf:/opt/nifi/nifi-current/conf -v D:/Tools/Docker/nifi/database_repository:/opt/nifi/nifi-current/database_repository -v D:/Tools/Docker/nifi/flowfile_repository:/opt/nifi/nifi-current/flowfile_repository -v D:/Tools/Docker/nifi/content_repository:/opt/nifi/nifi-current/content_repository -v D:/Tools/Docker/nifi/provenance_repository:/opt/nifi/nifi-current/provenance_repository -v D:/Tools/Docker/nifi/logs:/opt/nifi/nifi-current/logs apache/nifi:1.26.0
  • 这里开放了9090-9095端口作为备用对外端口,需要到防火墙里添加入站和出战规则
  • 将配置文件、数据文件、日志文件挂载到磁盘上,方便修改和查看
  • 指定市区为上海,解决默认环境下八小时时差的问题

访问 http://localhost:8080/nifi 即可访问 NiFi 页面。

二、MySQL数据库环境搭建

1. Docker拉取MySQL镜像

使用 Docker 拉取 MySQL 官方镜像。

bash 复制代码
docker pull mysql:8.0

2. 启动MySQL容器

启动 MySQL 容器,并将数据和配置映射到宿主机目录。

bash 复制代码
docker run -d --name mysql --network nifi-net -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=admin -p 3306:3306 -v D:/Tools/Docker/MySQL/data:/var/lib/mysql -v D:/Tools/Docker/MySQL/conf:/etc/mysql/conf.d mysql:8.0
  • MYSQL_ROOT_PASSWORD:root 用户的密码
  • MYSQL_DATABASE:启动时自动创建的数据库
  • MYSQL_USER/MYSQL_PASSWORD:创建额外用户(可选,仅在需要时设置)
  • 容器名 mysql 会自动成为同网络下的 DNS 名称
  • 开放宿主机 3306 端口,供外部(如 Django 或其他服务)连接
  • 将宿主机 D:/Tools/Docker/MySQL/data 挂载为数据库数据目录,保证数据持久化
  • 将宿主机 D:/Tools/Docker/MySQL/conf 挂载为配置目录,方便定制配置

启动成功后,在 Docker Desktop 中也能看到运行中的 MySQL 容器:

3. 下载MySQL的JDBC驱动

官网(https://dev.mysql.com/downloads/connector/j/)下载 Platform Independent 版本的驱动。

解压zip包,将jar包放到 drivers 目录下。

三、PostgreSQL数据库环境搭建

1. Docker拉取PostgreSQL镜像

使用 Docker 拉取 PostgreSQL 镜像。

bash 复制代码
docker pull postgres:15

2. 启动PostgreSQL容器

启动 PostgreSQL 容器。

bash 复制代码
docker run -d --name postgres --network nifi-net -e POSTGRES_USER=admin -e POSTGRES_PASSWORD=admin -e POSTGRES_DB=admin -e PGDATA=/var/lib/postgresql/data/pgdata -v D:/Tools/Docker/PostgreSQL/pgdata:/var/lib/postgresql/data/pgdata -v D:/Tools/Docker/PostgreSQL/conf:/etc/postgresql -p 5432:5432 postgres:15
  • POSTGRES_USER/_PASSWORD/DB:请根据实际情况修改
  • 容器名 postgres 会自动成为 DNS 名称
  • 这里开放了5432端口作为备用对外端口
  • 将数据文件挂载到磁盘上,方便修改和查看

启动成功后,Docker Desktop 也可以看到我们的第二个容器。

3. 下载PostgreSQL的JDBC驱动

在项目根目录(也就是你执行 docker run 的地方)新建一个 drivers 文件夹:

bash 复制代码
mkdir drivers

官网(https://jdbc.postgresql.org/download/)下载 PostgreSQL 驱动,放到 drivers 目录下。

四、NiFi连接数据库

1. 挂载JDBC驱动重启NiFi容器

挂载驱动重启NiFi容器:

bash 复制代码
docker run -d --name nifi -e TZ="Asia/Shanghai" --network nifi-net --privileged=true -e SINGLE_USER_CREDENTIALS_USERNAME=admin -e SINGLE_USER_CREDENTIALS_PASSWORD=nifi1357924680 -e NIFI_WEB_HTTP_HOST=0.0.0.0 -e NIFI_WEB_HTTP_PORT=8080 -e NIFI_REMOTE_INPUT_SOCKET_PORT=10000 -p 8080:8080 -p 10000:10000 -p 9090:9090 -p 9091:9091 -p 9092:9092 -p 9093:9093 -p 9094:9094 -p 9095:9095 -v D:/Tools/Docker/nifi/conf:/opt/nifi/nifi-current/conf -v D:/Tools/Docker/nifi/database_repository:/opt/nifi/nifi-current/database_repository -v D:/Tools/Docker/nifi/flowfile_repository:/opt/nifi/nifi-current/flowfile_repository -v D:/Tools/Docker/nifi/content_repository:/opt/nifi/nifi-current/content_repository -v D:/Tools/Docker/nifi/provenance_repository:/opt/nifi/nifi-current/provenance_repository -v D:/Tools/Docker/nifi/logs:/opt/nifi/nifi-current/logs -v D:/Tools/Docker/my-dev/drivers/postgresql-42.6.2.jar:/opt/nifi/nifi-current/lib/postgresql-42.6.2.jar -v D:/Tools/Docker/my-dev/drivers/mysql-connector-j-9.3.0.jar:/opt/nifi/nifi-current/lib/mysql-connector-j-9.3.0.jar apache/nifi:1.26.0

相较于上面的命令,这次增加了jar包的路径,如果jar的路径没有错误,会顺利启动成功。

2. 测试NiFi是否成功连接PostgreSQL

启动成功后,我们需要测试 NiFi 是否可以连接到 PostgreSQL。

确认 Controller Service 已启用

NiFi 首页,点击画布,左侧 NiFi-Flow 点击设置(齿轮按钮)。

Controller Service 里创建的 DBCPConnectionPool,填写必要的信息:

  • Database Connection URL:jdbc:postgresql://postgres:5432/admin;
  • Database Driver Class Name:com.mysql.cj.jdbc.Driver vs org.postgresql.Driver;
  • Database User:PostgreSQL 用户名。
  • Password:PostgreSQL 用户密码。

填写完成后,点击 Controller Service 列表最右侧的 Enable 按钮(闪电图标),在新窗口里将 Scope 选择为 Service and referencing components,然后点击 Enable 按钮。

下图为连接成功的情形:

使用 Processor 验证数据库连接

在画布空白处双击或右键 → 「Create Processor」→ 选择 ExecuteSQL → 点「Add」。

双击打开配置面板,设置如下,点击「Apply」。

PROPERTIES:

  • DBCP Connection Pooling Service:选择你刚启用的 PostgreSQL 连接池(比如我刚新建的 DBCPConnectionPool)
  • SQL select query:填 SELECT version();(PostgreSQL 会返回当前版本字符串)

RELATIONSHIPS:

  • Automatically Terminate/Retry Relationships 的 failure 事件选择 terminate

再从 ExecuteSQL 连出一个 LogAttribute 来查看结果。

右键 ExecuteSQL 点击运行,再右键 LogAttribute 点击运行。

有成功运行的记录之后,右键 ExecuteSQL 点击 View data provenance 查看调用记录。

每条记录的左侧感叹号按钮可以看到详细内容页,点击查看可以在线查看。

输出内容如下,成功输出了版本号,说明 NiFi 成功连接到了 PostgreSQL。

3. 测试NiFi是否成功连接MySQL

同理,我们再新建一个 DBCPConnectionPool,填写必要的信息:

  • Database Connection URL:jdbc:mysql://mysql:3306/admin?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
  • Database Driver Class Name:com.mysql.cj.jdbc.Driver
  • Database User:root
  • Password:root

这里注意

使用 Processor 验证数据库连接,参考NiFi连接PostgreSQL的步骤。

五、安装pgAdmin查看PostgreSQL数据

再启动一个 pgAdmin 容器,把它加入到同一个 nifi-net 网络,然后通过它来可视化管理 PostgreSQL。

1. Docker拉取pgAdmin镜像

使用 Docker 拉取 pgAdmin 镜像。

bash 复制代码
docker pull dpage/pgadmin4:latest

2. 启动PostgreSQL容器

启动 pgAdmin 容器。

bash 复制代码
docker run -d --name pgadmin --network nifi-net -e PGADMIN_DEFAULT_EMAIL=admin@admin.com -e PGADMIN_DEFAULT_PASSWORD=admin -p 5050:80 dpage/pgadmin4

3. pgAdmin连接PostgreSQL

我们需要在 pgAdmin 中添加你的 PostgreSQL 服务器。

浏览器访问:http://localhost:5050,输入你在上面设置的邮箱(admin@admin.com)和密码(admin)登录。

右击左侧 Servers → Create → Server

General 标签页:

  • Name 填 NiFi-PostgreSQL(自定义随意起名)
    Connection 标签页:
  • Host name/address:postgres
  • Port:5432
  • Maintenance database:admin(实际数据库名)
  • Username:admin
  • Password:admin

点击 Save,若连接信息填写正确,则进入仪表盘页面。

4. 在pgAdmin创建表

展开 Databases → 选中 admin → Schemas,右键 Tables → Create → Table。

填写表的相关配置:

General 标签页:

  • Name 填 test_user
    Columns 标签页,点 "+" 添加列:
  • id,类型 serial,勾选 PRIMARY KEY
  • name,类型 text
  • age,类型 Intager
  • email,类型 text
    点击 Save

六、安装phpMyAdmin查看MySQL数据

再启动一个 phpMyAdmin 容器,把它加入到同一个 nifi-net 网络,然后通过它来可视化管理 MySQL。

1. Docker拉取phpMyAdmin镜像

使用 Docker 拉取 phpMyAdmin 镜像。

bash 复制代码
docker pull phpmyadmin/phpmyadmin:latest

2. 启动phpMyAdmin容器

启动 phpMyAdmin 容器。

bash 复制代码
docker run -d --name phpmyadmin --network nifi-net -e PMA_HOST=mysql -e PMA_USER=root -e PMA_PASSWORD=root -p 9000:80 phpmyadmin/phpmyadmin:latest

3. phpMyAdmin连接MySQL

浏览器访问:http://localhost:9000,自动连接到我们的 MySQL。

七、NiFi完成数据插入

依次创建并连接 ProcessorGenerateFlowFile -> EvaluateJsonPath -> ConvertJSONToSQL -> PutSQL

GenerateFlowFile 里编写测试数据源JSON:

json 复制代码
{
    "data": [
        {
            "id": "122",
            "name": "cc",
            "age": "20",
            "email": "test@111.com"
        },
        {
            "id": "123",
            "name": "bb",
            "age": "39",
            "email": "test@123.com"
        }
    ]
}

ConvertJSONToSQL 里对选择数据库链接和操作类型,填写需要操作的数据表名。

PutSQL 同理设置数据库链接。检查每一个 Processor 是否 Invalid,一般无效的原因是 REALTIONSHIPS 未设置或设置错误。

Start 所有 Processor,一路向下直到执行完成。

打开 pgAdmin,查看测试数据是否已入库。

相关推荐
0xDevNull1 小时前
MySQL数据冷热分离详解
后端·mysql
科技小花2 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸2 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain2 小时前
linux个人心得22 (mysql)
数据库·mysql
功德+n2 小时前
Linux下安装与配置Docker完整详细步骤
linux·运维·服务器·开发语言·docker·centos
阿里小阿希2 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神3 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员3 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java3 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
小敬爱吃饭3 小时前
Ragflow Docker部署及问题解决方案(界面为Welcome to nginx,ragflow上传文件失败,Docker中的ragflow-cpu-1一直重启)
人工智能·python·nginx·docker·语言模型·容器·数据挖掘