如何使用Nifi / HDF从MS SQL读取增量记录

时间:2017-12-01 10:30:56

标签: sql-server hadoop apache-kafka apache-nifi hdf

我在MS SQL中有几个表,这些表每秒都会更新,查询或多或少看起来像这样

SELECT G_ID,UpdateTime,ID,Name,T_NAME FROM TABLE1 AS table1 INNER JOIN TABLE2 AS table2 ON table1.IP=table2.ID 
WHERE table2.UpdateTime >= ${lastUpdateTime} AND table2.G_ID > ${lastID}

假设select inner join查询结果为5条记录,如下所示。

如果查询第一次运行${lastUpdateTime}并且${lastG_ID}设置为0,它将返回低于5条记录。处理完记录后,查询会在max(G_ID)表中存储max(UpdateTime),即5和etl_stat,即1512010479。

 G_ID       UpdateTime   ID            Name             T_NAME 
-------------------------------------------------------------------
 1          1512010470  12591225      DUMMY_DATA       DUMMY_ID    
 2          1512096873  12591538      DUMMY_DATA       DUMMY_ID    
 3          1512096875  12591539      DUMMY_DATA       DUMMY_ID    
 4          1512010477  12591226      DUMMY_DATA       DUMMY_ID    
 5          1512010479  12591227      DUMMY_DATA       DUMMY_ID    

如果表添加另外5条新记录,如下所示:

 G_ID       UpdateTime   ID            Name             T_NAME 
-------------------------------------------------------------------
 1          1512010470  12591225      DUMMY_DATA       DUMMY_ID    
 2          1512096873  12591538      DUMMY_DATA       DUMMY_ID    
 3          1512096875  12591539      DUMMY_DATA       DUMMY_ID    
 4          1512010477  12591226      DUMMY_DATA       DUMMY_ID    
 5          1512010479  12591227      DUMMY_DATA       DUMMY_ID 
 6          1512010480  12591230      DUMMY_DATA       DUMMY_ID 
 7          1512010485  12591231      DUMMY_DATA       DUMMY_ID 
 8          1512010490  12591232      DUMMY_DATA       DUMMY_ID 
 9          1512010493  12591233      DUMMY_DATA       DUMMY_ID 
 10         1512010500  12591234      DUMMY_DATA       DUMMY_ID 

该查询将首先从max(G_ID)读取max(UpdateTime)etl_stat table,并将按如下方式构建查询 SELECT G_ID,UpdateTime,ID,Name,T_NAME FROM TABLE1 AS table1 INNER JOIN TABLE2 AS table2 ON table1.IP=table2.ID WHERE table2.UpdateTime >= 1512010479 AND table2.G_ID > 5,以便查询只返回5个增量记录,如下所示。

G_ID        UpdateTime   ID            Name             T_NAME 
-------------------------------------------------------------------
 6          1512010480  12591230      DUMMY_DATA       DUMMY_ID 
 7          1512010485  12591231      DUMMY_DATA       DUMMY_ID 
 8          1512010490  12591232      DUMMY_DATA       DUMMY_ID 
 9          1512010493  12591233      DUMMY_DATA       DUMMY_ID 
 10         1512010500  12591234      DUMMY_DATA       DUMMY_ID 

因此,每次查询运行时,它应首先从max(G_ID)表中读取max(UpdateTime)etl_stat并构建选择内连接查询,如上所示,并获取增量更改。

使用SPARK SQL构建

我已经实现了上述用例如下:

1)Spark JDBC读取phoenix表以从max(G_ID)表中获取max(UpdateTime)etl_stat

2)Spark JDBC构建了选择内连接查询,如SELECT G_ID,UpdateTime,ID,Name,T_NAME FROM TABLE1 AS table1 INNER JOIN TABLE2 AS table2 ON table1.IP=table2.ID WHERE table2.UpdateTime >= 1512010479 AND table2.G_ID > 5

3)Spark JDBC运行第2步内连接查询,从MS SQL服务器读取增量消息处理记录并插入HBase。

4)成功插入HBase后,Spark会使用最新的etl_stat更新G_ID表,即10和UpdateTime,即1512010500。

5)这项工作已计划每1分钟运行一次。

使用NIFI构建

我想将此用例移至Nifi,我想使用NiFi从MS SQL DB读取记录并将此记录发送给Kafka。

成功发布到Kafka后,NiFi将在数据库中保存G_ID和UpdateTime。

一旦消息到达Kafka,spark streaming将读取来自Kafka的消息,并将使用现有的业务逻辑保存到HBase。

在每次运行时,Nifi处理器应使用max(G_ID)max(UpdateTime)构建选择内部联接查询,以获取增量记录并发布到Kafka。

我是Nifi / HDF的新手。我需要你的帮助和指导,以便使用Nifi / HDF实现这一点。如果您对此用例有更好的解决方案/架构,请建议。

很抱歉这么长的帖子。

1 个答案:

答案 0 :(得分:1)

您所描述的是JDBC Kafka Connect connector开箱即用的内容。设置配置文件,加载它,关闭。完成。 Kafka Connect是Apache Kafka的一部分。无需额外的工具和技术。

您可能还想考虑正确的Change-Data-Capture(CDC)。对于专有的RDBMS(Oracle,DB2,MS SQL等),您可以使用GoldenGate,Attunity,DBVisit等商业工具。对于开源RDBMS(例如MySQL,PostgreSQL),您应该查看开源Debezium工具。 所有这些CDC工具都直接与Kafka集成。