在Apache Spark中加入流数据

时间:2017-09-12 19:31:32

标签: sql-server apache-spark elasticsearch apache-kafka spark-streaming

道歉,如果标题太模糊,但我无法正确地说出来。

所以基本上我正在试图弄清楚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">} 表中存在多对多关系的基本ReportProduct表: ERD

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中。

1 个答案:

答案 0 :(得分:1)

  1. Kafka Connect从源数据库中提取数据 - 您可以使用JDBC Source(或Confluent Platform)中可用的separately,也可能需要调查kafka-connect-cdc-mssql

  2. 在Kafka中获取数据后,请使用Kafka Streams API根据需要操作数据,或查看新发布的KSQL。你选择的将是你喜欢用Java编码(使用Kafka Streams)或在类似SQL的环境(使用KSQL)中操作数据之类的东西。无论如何,这两者的输出将成为另一个Kafka话题。

  3. 最后,使用Elasticsearch Kafka Connect插件(可用here或作为Confluent Platform的一部分)

  4. 将Kafka主题从上面流式传输到Elasticsearch