如何使用Flink SQL和Redpanda构建流应用程序

近年来,在事件驱动架构、对更快分析的需求以及各种技术堆栈的可用性的推动下,基于流的处理越来越流行。这种堆栈的一个流行组件是Apache Flink,这是一个流处理框架,拥有当今最活跃的开源社区之一。Flink采用流优先的方法-一切都是流,批处理文件被视为有界流的特例。在Redpanda,我们同意流是批处理的超集的观点,我们的目标是使Redpanda成为流处理器的最佳持久层。

Flink有几个API层,提供不同的抽象级别。最高级别是Flink SQL,它允许非程序员用熟悉的语言轻松构建复杂的流式管道。Flink SQL符合ANSI标准,支持连接、聚合、窗口甚至用户定义函数等构造。它可以通过DDL语句以声明方式与多个数据源和接收器集成。例如,要允许Flink SQL读取卡夫卡主题:

CREATE TABLE access_logs (
    event_time TIMESTAMP(3) METADATA FROM 'timestamp',
    host STRING,
    ident STRING,
    authuser STRING,
    request STRING,
    status SHORT,
    bytes BIGINT
) WITH (
    'connector' = 'kafka',  -- using kafka connector
    'topic' = ‘logs’,  -- kafka topic
    'scan.startup.mode' = 'earliest-offset',  -- reading from the beginning
    'properties.bootstrap.servers' = 'kafka:9094',  -- kafka broker address
    'format' = 'csv'
);

一旦声明了表,就可以直接读取和处理来自主题的流。例如:

SELECT count(1), status FROM access_logs GROUP BY status ;

连接到Redpanda

Flink SQL没有为Redpanda附带特定的连接器。然而,考虑到Redpanda与卡夫卡协议的强电线兼容性,标准的卡夫卡连接器可以完美地工作。例如,我们以现有的Flink SQL演示为例,它显示了一个端到端的流应用程序。演示显示了Flink SQL从Kafka主题中读取流,然后通过流式SQL进行处理。将结果写入Elastic,然后使用Kibana将其显示为仪表板。我们用Redpanda替换了Kafka,同时保留了应用程序的其余部分。

要亲自查看,转到Apache Flink项目网站上的演示文章。(这是Flink PMC/Committer@JarkWu的道具,用于整合这一优秀演示。)演示需要Docker和Docker Compose将各种组件组合在一起,以便在本地环境中运行。

除了抓取docker-compose.yml file的初始步骤外,您可以按照本文中的逐步说明进行操作。我们必须修改该文件以用Redpanda替换Kafka,因此第一步应该是从命令行输入以下内容,以获取我们的docker-compose.yml版本:

mkdir flink-sql-demo-redpanda; cd flink-sql-demo-redpanda;
wget https://raw.githubusercontent.com/patrickangeles/flink-sql-demo-redpanda/main/docker-compose.yml

演示的其余部分将引导您通过SQL DDL语句建立到Redpanda和Elastic的连接器,通过SQL DML语句构建流作业,并通过Kibana将数据和可视化连接在一起。我们不会在这里重复这些步骤,相反,我们鼓励您完全按照原始文章中描述的说明进行操作。

解剖docker-compose.yml

如果您想使用Docker Compose构建自己的Redpanda项目,那么对docker-compose.yml进行更改是值得的。我们更新到了更新的compose版本(3.7),用redpanda服务替换了kafkazookeeper服务,并适当地更新了服务依赖关系图。Redpanda服务声明如下所示:

redpanda:
    image: docker.vectorized.io/vectorized/redpanda:v21.8.1
    command:
      - redpanda start
      - --smp 1
      - --memory 512M
      - --overprovisioned
      - --node-id 0
      - --set redpanda.auto_create_topics_enabled=true
      - --kafka-addr INSIDE://0.0.0.0:9094,OUTSIDE://0.0.0.0:9092
      - --advertise-kafka-addr INSIDE://kafka:9094,OUTSIDE://localhost:9092
    hostname: kafka
    ports:
      - "9092:9092"
      - "9094:9094"
    volumes:
      - /var/lib/redpanda/data

其中一些参数值得一提,尤其是如果你是红熊猫的新手。首先,Redpanda遵循thread per core model,并喜欢在允许的情况下消耗主机环境中的所有可用资源。这对于生产部署非常好,但在笔记本电脑上进行原型制作时并不理想。下面提到的前三个参数是启动标志,告诉Redpanda在共享主机或VM中与其他进程配合良好。

  • --smp 1限制了Redpanda只能使用一个逻辑核。

  • --memory 512M将Redpanda的内存限制为512M。或者,您可以指定--reserve-memory N,这允许Redpanda获取所有可用内存,但为操作系统和其他进程保留N。

  • --overprovisioned向Redpanda表示主机上正在运行其他进程。Redpanda不会固定其线程或内存,并将减少轮询量以降低CPU利用率。

  • --node-id 0这是一个必需参数。Redpanda中的每个代理都由一个节点id标识,该id在重启后仍然有效。

  • --set redpanda.auto_create_topics_enabled=true相当于卡夫卡中的设置auto.create.topics.enable=true

  • hostname: kafka在Docker Compose中,默认主机名基于服务名称。我们用hostname: kafka覆盖它,因此我们可以与原始演示脚本中的连接器声明保持兼容。

  • volumes: /var/lib/redpanda/data这告诉Docker Compose为该路径提供一个卷,该路径是默认的Redpanda数据目录。

结论

Docker和Docker Compose非常有利于开发人员的生产力,因为它们允许快速组装不同的应用程序组件。开发人员可以在其本地环境中快速构建端到端应用程序的原型。在本文中,我们展示了如何使用Kafka(以及Flink、MySQL、Elastic、Kibana)和Redpanda来改进现有的应用程序原型。在流媒体堆栈中使用Redpanda容器代替Kafka和Zookeeper有一些很好的好处,包括更快的启动时间和更高效的资源消耗。

我们相信,这种原型化方法有助于构建新的流应用程序。特别是,用于事件源的Redpanda和用于流处理的Flink SQL是一种功能强大、易于使用的组合。即将推出的Redpanda数据策略功能将允许通过WASM进行出站数据转换。最终,我们可以使用它来实现谓词和投影下推等功能,这些功能有可能通过减少从Redpanda到流处理器的数据量来加速基本的流操作。

未来,我们希望通过Flink SQL提供更多Redpanda的原型示例,并结合其他流媒体引擎探索Redpanda。我们的目标是使Redpanda成为流媒体的最佳持久层。注意这个空间!

猜你喜欢

转载自blog.csdn.net/zhishifufei/article/details/128045741
今日推荐