1. 开启mysql的binlog日志

mysql版本号5.7
1.1 登录mysql查看日志状态.
 mysql -h 127.0.0.1 -u root -p
 mysql> show variables like '%log_bin%';


以上已经打开了,如果是OFF需要进行如下操作:

1.2 linux下开启binlog

编辑文件

vi /etc/my.cnf

行尾加上

server-id=1
log-bin=mysql-bin
binlog_format = row

server-id:表示单个节点的id,单个节点可以随意写,多个节点不能重复。
log-bin:指定binlog日志文件的名字为mysql-bin,以及其存储路径

重启服务

systemctl restart mysqld.service

或者

service mysqld restart

重新登录查询开启状态

 mysql> show variables like '%log_bin%';
1.3 开启mysql的远程访问权限
GRANT ALL PRIVILEGES ON  *.*  TO  'root'@'%' IDENTIFIED BY '123456'  WITH GRANT OPTION;
FLUSH PRIVILEGES;

2. nifi实时获取mysql变更

2.1 创建处理器组

组名:MysqlToVoltDB_Timely

然后我们点击此处理器组,进行相关操作。

2.2 创建CaptureChangeMySQL

创建CaptureChangeMySQL,我们需要创建我们的缓存服务,缓存服务一块是客户端、一块是服务端(DistributedMapCacheServer)。
然后让我们的客户端连接我们的服务端。

2.2.1 创建缓存

创建DistributedMapCacheServer

创建server:

配置属性

创建DistributedMapCacheClientService

创建client:

配置属性:
Server Hostname:我们填写nifi服务的地址
Server Port:server端的端口

启动DistributedMapCacheServer与DistributedMapCacheClientService

先启动server后启动client

2.2.2 CaptureChangeMySQL绑定DistributedMapCache

然后我们设置CaptureChangeMySQL

2.3 创建RouteOnAttribute

我们创建:RouteOnAttribute 然后将其与CaptureChangeMySQL连接,然后我们启动CaptureChangeMySQL。

此时我们的cpu会标满。第一个节点需要设置调度:
Run Schedule设置为3秒

接下来我们需要配置我们的路由,使用我们的jsonPath进行路由。我们需要根据数据及其属性来进行路由。此时我们向我们的数据库插入一条数据。
我们可以看到我们监听到的数据,然后我们点击进去:

查看数据,我们可以看到type是update:

我们路由的话 需要根据属性去路由,此时我们可以看到数据的属性为:

后面我们需要根据:cdc.event.type=update/insert/delete来进行操作。
因为我们需要在RouteOnAttribute配置新变量

insert=${cdc.event.type:equals('insert')}
update=${cdc.event.type:equals('update')}

2.3 创建EvaluateJsonPath

通过解析json后拼接成sql插入到后面的数据库中:

符合insert/update我们将其转发到EvaluateJsonPath,否则进入LogAttribute

我们执行RouteOnAttribute,然后发现数据路由到下游处理器

我们需要通过jsonpath解析对应的数据,然后输出到LogAttribute查看具体数据。

{
  "type" : "update",
  "timestamp" : 1716309977000,
  "binlog_filename" : "mysql-bin.000048",
  "binlog_position" : 124411000,
  "database" : "callcenter",
  "table_name" : "monitor_module_connect_info",
  "table_id" : 61514,
  "columns" : [ {
    "id" : 1,
    "name" : "id",
    "column_type" : 4,
    "last_value" : 1,
    "value" : 1
  }, {
    "id" : 2,
    "name" : "modulename",
    "column_type" : 12,
    "last_value" : "dyflow01",
    "value" : "dyflow01"
  }, {
    "id" : 3,
    "name" : "modulecode",
    "column_type" : 12,
    "last_value" : "",
    "value" : ""
  }, {
    "id" : 4,
    "name" : "to_connectmodulename",
    "column_type" : 12,
    "last_value" : "httpg01",
    "value" : "httpg01"
  }, {
    "id" : 5,
    "name" : "to_connectmodulecode",
    "column_type" : 12,
    "last_value" : "httpg",
    "value" : "httpg"
  }, {
    "id" : 6,
    "name" : "connectstatus",
    "column_type" : 4,
    "last_value" : 1,
    "value" : 1
  }, {
    "id" : 7,
    "name" : "examtime",
    "column_type" : 4,
    "last_value" : 1715481157,
    "value" : 1715481157
  }, {
    "id" : 8,
    "name" : "createtime",
    "column_type" : 93,
    "last_value" : "Tue May 21 08:00:03 CST 2024",
    "value" : "Tue May 21 08:00:03 CST 2024"
  }, {
    "id" : 9,
    "name" : "modifytime",
    "column_type" : 93,
    "last_value" : "Tue May 21 17:22:35 CST 2024",
    "value" : "Wed May 22 08:46:17 CST 2024"
  } ]
}

获取字段:database、id、modulename、createtime
database=$.database
id=$.columns[0].value
modulename=$.columns[1].value
createtime=$.columns[7].value

设置为属性

然后我们执行:EvaluateJsonPath 然后查看我们的数据

具体查看我们的数据attribute时候可以看到正常.

2.4 创建ReplaceText

接下来我们使用我们提取到的attribute属性来生成我们的sql语句。我们使用:ReplaceText实现。
之间连接时候使用:matched; 此时我们ReplaceText需要使用FlowFile中的数据,将获取到的数据拼接成我们的sql语句。此时我们需要修改我们原始的数据:$1;使用nifi表达式获取我们的属性值。

insert into  test(id,modulename,createtime) value(${id},${modulename},${createtime})


整体情况如下:

此时我们进行测试,测试方法:
方法一:从头到尾执行一遍;
方法二:在EvaluateJsonPath我们右键点击“view Data Provenance"

然后运行我们的ReplaceText;然后我们就可以看到数据了,此时再停止运行:EvaluateJsonPath、ReplaceText.

然后我们查看数据,发现我们的字符串,没有加单引号。

我们此时需要在我们的ReplaceText添加单引号:

insert into  test(id,modulename,createtime) value(${id},'${modulename}','${createtime}')

3. 数据写入到voltdb

Apache NiFi目前确实没有直接针对VoltDB的处理器组件,但这并不意味着不能实现从NiFi向VoltDB写入数据。NiFi的强大之处在于它的灵活性和可扩展性,你可以通过以下几种方式实现数据写入VoltDB的目的:

3.1 步骤

3.1.0 在voltdb里面创建表
CREATE TABLE test (
   id INTEGER,
   modulename varchar(255),
   createtime varchar(255)
);

进入我们的sqlcmd终端,然后创建对应的表(对应端口设置为8012)。

sqlcmd --port=8012
3.1.1 准备

首先,确保你的NiFi环境中安装了必要的JAR依赖,比如VoltDB的Java客户端库。这可能需要将VoltDB的客户端jar包放入NiFi的/lib目录下。在NiFi中创建一个新的ExecuteScript处理器,选择合适的脚本引擎(例如,如果你使用Java,就选择Jython或直接用Java);但是此时我们使用PutSQL实现。
PutSQL:通过Flowfile中的内容对数据库进行更新(flowfile包含的是一些数据库DDM语句)

3.2 创建PutSQL

3.2.1 配置putsql处理器的属性

新建配置一个连接池

PutSQL创建自连接:因为到了这里就是一个结束了,不需要下游了,可以让他自连接了就。后整体的情况如下:

4. 运行整个链路

然后我们根据我们的链路 运行整个sql,发现我们的数据已经写进去了。


startshineye
91 声望26 粉丝

我在规定的时间内,做到了我计划的事情;我自己也变得自信了,对于外界的人跟困难也更加从容了,我已经很强大了。可是如果我在规定时间内,我只有3分钟热度,哎,我不行,我就放弃了,那么这个就是我自己的问题,因为你自己...