跳转至
Apache Sedona 1.9.0 已正式发布,新增 Spark 4.1 支持、proj4sedona 坐标系转换、Bing Tile 函数等众多特性!

SedonaFlink

SedonaFlink 将地理空间函数集成到 Apache Flink 中,是构建依赖地理空间数据的流式管道的理想选择。

以下是 SedonaFlink 的一些典型应用场景:

  • 从 Kafka 读取地理空间数据并写入 Iceberg
  • 实时分析交通密度
  • 电信行业的实时网络规划与优化

下面是一些示例代码片段:

sedona.createTemporaryView("myTable", tbl)
Table geomTbl = sedona.sqlQuery("SELECT ST_GeomFromWKT(geom_polygon) as geom_polygon, name_polygon FROM myTable")
geomTbl.execute().print()
table_env.sql_query("SELECT ST_ASBinary(ST_Point(1.0, 2.0))").execute().collect()

主要特性

  • 实时地理空间流处理,满足低延迟处理需求。
  • 可扩展,适用于大规模流式管道。
  • 基于 Flink 的时间窗口实现**事件时间处理**。
  • 提供**精确一次(Exactly Once)**处理保证。
  • 可移植,易于在任何 Flink 运行时中部署。
  • 开源,遵循 Apache 软件基金会的准则进行管理。

Flink 是为流式数据而设计的,Sedona 在此基础上为其加入了地理空间处理能力。

大多数地理空间处理发生在 Spark 或 PostGIS 这类批处理系统中,对于延迟要求不高的场景这没有问题。

而当需要实时处理地理空间数据时,Sedona on Flink 的优势就会显现出来。

Flink 可以为地理空间查询提供毫秒级的延迟。

Flink 拥有完善的容错机制,即使在故障发生时,地理空间管道也不会丢失数据。

Sedona on Flink 可以在 Flink 支持的任何环境中运行,包括 Kubernetes、YARN 以及独立集群。

工作原理

Sedona 直接集成到 Flink 的 Table API 和 SQL 引擎中。

在搭建 Flink 环境时注册 Sedona 的空间函数,即可在 SQL 查询中使用 ST_PointST_ContainsST_Distance 等函数。

Sedona 同时支持 Flink 的 DataStream API 与 Table API,可根据自身工作流程选用。

空间运算作为 Flink 分布式执行的一部分运行,因此地理空间计算会自动在集群中并行执行。

Sedona 在 Flink 内部以二进制方式存储几何对象,从而保持较低的内存占用与较高的处理速度。

执行空间连接时,Sedona 在底层使用空间索引,使查询能够快速完成。

容错由 Flink 的检查点(checkpoint)机制处理。如果某个节点崩溃,地理空间状态可以从最近一次检查点恢复。

通常的流程是:从 Kafka 或文件系统等数据源读取地理空间数据,使用 Sedona 的空间函数进行处理,然后将结果写入 Iceberg 等数据汇。

整条 SedonaFlink 管道持续运行,新事件会实时流过空间转换逻辑。

与其他方案的对比

对于较小的数据集,可能并不需要分布式集群,使用 SedonaDB 即可。

对于大规模批处理管道,可以使用 SedonaSpark。

下面是 SedonaFlink 与几种流式方案的直接对比。

SedonaFlink 与 Sedona on Spark Structured Streaming

Spark Streaming 采用微批(micro-batch)模式,而 Flink 是逐事件处理。在某些工作流中,这能让 Flink 的延迟更低。

Flink 的状态管理也更为成熟。

如果已经深度使用 Spark 生态,且 Spark Structured Streaming 的延迟可以满足需求,可以选择 Spark;如果对延迟有非常严苛的要求,建议选择 Flink。

Sedona on Flink 与 PostGIS

PostGIS 非常适合用于 OLTP 工作负载下的地理空间数据存储与查询,但它并不是为流式处理而设计的。

如果使用 PostGIS 处理流式工作负载,需要持续从流处理器中查询数据库,这会增加延迟,并对数据库造成压力。

SedonaFlink 在数据流转过程中即对地理空间数据进行处理,从而避免了与数据库之间的往返开销。