道歉,如果标题太模糊,但我无法正确地说出来。
所以基本上我正在试图弄清楚Apache Spark和Apache Kafka是否能够将我的关系数据库中的数据同步到Elasticsearch。
我的计划是使用其中一个Kafka连接器从RDBMS读取数据并将其推送到Kafka主题中。这将是模型和DDL的ERD。 module PPEKit
module Tests
def add_test(id, &block)
@tests ||= {}
@tests[id] = Test.new(id, &block)
end
class Test
def initialize(id, &block)
@id = id
@description = nil
block.arity < 1 ? instance_eval(&block) : block.call(self)
end
def description(description)
@description = description
end
end
end
end
include PPEKit::Tests
add_test :create_article do
description 'creating article'
end
add_test :delete_article do |t|
t.description 'deleting article'
end
puts @tests
# {:create_article=>#<Test:0x00000000d91ac0 @id=:create_article, @description="creating article">,
# :delete_article=>#<Test:0x00000000d919d0 @id=:delete_article, @description="deleting article">}
表中存在多对多关系的基本Report
和Product
表:
ReportProduct
我的目标是将其转换为具有以下结构的文档:
CREATE TABLE dbo.Report (
ReportID INT NOT NULL PRIMARY KEY,
Title NVARCHAR(500) NOT NULL,
PublishedOn DATETIME2 NOT NULL);
CREATE TABLE dbo.Product (
ProductID INT NOT NULL PRIMARY KEY,
ProductName NVARCHAR(100) NOT NULL);
CREATE TABLE dbo.ReportProduct (
ReportID INT NOT NULL,
ProductID INT NOT NULL,
PRIMARY KEY (ReportID, ProductID),
FOREIGN KEY (ReportID) REFERENCES dbo.Report (ReportID),
FOREIGN KEY (ProductID) REFERENCES dbo.Product (ProductID));
INSERT INTO dbo.Report (ReportID, Title, PublishedOn)
VALUES (1, N'Yet Another Apache Spark StackOverflow question', '2017-09-12T19:15:28');
INSERT INTO dbo.Product (ProductID, ProductName)
VALUES (1, N'Apache'), (2, N'Spark'), (3, N'StackOverflow'), (4, N'Random product');
INSERT INTO dbo.ReportProduct (ReportID, ProductID)
VALUES (1, 1), (1, 2), (1, 3), (1, 4);
SELECT *
FROM dbo.Report AS R
INNER JOIN dbo.ReportProduct AS RP
ON RP.ReportID = R.ReportID
INNER JOIN dbo.Product AS P
ON P.ProductID = RP.ProductID;
我能够使用我在本地模拟的静态数据形成这种结构:
{
"ReportID":1,
"Title":"Yet Another Apache Spark StackOverflow question",
"PublishedOn":"2017-09-12T19:15:28+00:00",
"Product":[
{
"ProductID":1,
"ProductName":"Apache"
},
{
"ProductID":2,
"ProductName":"Spark"
},
{
"ProductID":3,
"ProductName":"StackOverflow"
},
{
"ProductID":4,
"ProductName":"Random product"
}
]
}
但我意识到这太基础了,流会变得更加复杂。
数据不规则变化,报告及其产品不断变化,产品偶尔会更换(主要是每周更换一次)。
我想将其中任何一种更改复制到其中一个表中的Elasticsearch中。
答案 0 :(得分:1)
Kafka Connect从源数据库中提取数据 - 您可以使用JDBC Source(或Confluent Platform)中可用的separately,也可能需要调查kafka-connect-cdc-mssql
在Kafka中获取数据后,请使用Kafka Streams API根据需要操作数据,或查看新发布的KSQL。你选择的将是你喜欢用Java编码(使用Kafka Streams)或在类似SQL的环境(使用KSQL)中操作数据之类的东西。无论如何,这两者的输出将成为另一个Kafka话题。
最后,使用Elasticsearch Kafka Connect插件(可用here或作为Confluent Platform的一部分)