输入流连接器回顾

在这篇文章中,您将了解 Apache Beam 中对输入流连接器的支持现状。为了更深入了解,您还将了解 Apache Spark 中相应的支持状态。

在批处理中,您可以从任何来源加载数据,包括数据库系统。即使没有这些数据库系统的特定 SDK,您通常也可以使用 JDBC 驱动程序。对于流处理,实现正确的管道数据处理可能更具挑战性,因为通常只有较少的源类型可用。因此,本文特别关注流处理用例。

Java 连接器

Beam 有一个官方的 Java SDK,并且拥有几个执行引擎,称为 运行器。在大多数情况下,通过使用 Spark Runner,将现有的用 Java 或 Scala 编写的 Beam 管道转移到 Spark 环境中相当容易。

Spark 是用 Scala 编写的,并且有一个 Java API。Spark 的源代码编译为 Java 字节码,二进制文件由 Java 虚拟机 运行。Scala 代码与 Java 相互操作,因此与 Java 库(反之亦然)具有本机兼容性。

Spark 提供了两种流处理方法:离散流(或 DStreams)和 结构化流。DStreams 是一个基本抽象,它表示 弹性分布式数据集(或 RDDs)的连续系列。结构化流是在最近才引入的(alpha 版本随 Spark 2.1.0 发布),它基于一个 模型,其中实时数据会持续追加到一个表格结构中。

Spark 结构化流支持 文件源(本地文件系统和与 HDFS 兼容的系统,如 Cloud Storage 或 S3)以及 Kafka 作为流处理 输入。Spark 维护着针对第三方服务的 DStreams 内置连接器,例如 Kafka 或 Flume,而其他连接器可以通过链接外部依赖项来实现,如以下表格所示。

以下是针对 Beam 和 Spark DStreams 在 Java 中可用的主要流处理输入连接器

Apache BeamApache Spark DStreams
文件系统本地
(使用 file:// URI)
TextIOtextFileStream
(Spark 将大多数 Unix 系统视为与 HDFS 兼容,但该位置应可从所有节点访问)
HDFS
(使用 hdfs:// URI)
FileIO + HadoopFileSystemOptionsHdfsUtils
对象存储Cloud Storage
(使用 gs:// URI)
FileIO + GcsOptionshadoopConfigurationtextFileStream
S3
(使用 s3:// URI)
FileIO + S3Options
消息队列KafkaKafkaIOspark-streaming-kafka
KinesisKinesisIOspark-streaming-kinesis
Cloud Pub/SubPubsubIOspark-streaming-pubsub 来自 Apache Bahir
其他自定义接收器读取转换receiverStream

Python 连接器

Beam 有一个官方的 Python SDK,目前支持 Java SDK 中可用的流处理功能的一个子集。正在积极开发中以弥合两个 SDK 中功能集之间的差距。目前对于 Python,支持 Direct RunnerDataflow Runner,并且在 2.5.0 版本 中引入了 多个流处理选项(测试版)。

Spark 还有一个名为 PySpark 的 Python SDK。如前所述,Scala 代码编译为由 JVM 执行的字节码。PySpark 使用 Py4J,这是一个允许 Python 程序与 JVM 交互的库,因此可以访问 Java 库,与 Java 对象交互以及注册来自 Java 的回调。这使 PySpark 能够访问本机 Spark 对象,如 RDDs。Spark 结构化流支持文件源(本地文件系统和与 HDFS 兼容的系统,如 Cloud Storage 或 S3)以及 Kafka 作为流处理输入。

以下是针对 Beam 和 Spark DStreams 在 Python 中可用的主要流处理输入连接器

Apache BeamApache Spark DStreams
文件系统本地io.textiotextFileStream
HDFSio.hadoopfilesystemhadoopConfiguration(通过 sc._jsc 使用 Py4J 访问)和 textFileStream
对象存储Google Cloud Storageio.gcp.gcsiotextFileStream
S3N/A
消息队列KafkaN/AKafkaUtils
KinesisN/AKinesisUtils
Cloud Pub/Subio.gcp.pubsubN/A
其他自定义接收器BoundedSource 和 RangeTrackerN/A

其他语言的连接器

Scala

由于 Scala 代码与 Java 相互操作,因此与 Java 库(反之亦然)具有本机兼容性,您可以在 Scala 程序中使用上面描述的相同 Java 连接器。Apache Beam 还有一个由 Spotify 开源的 Scala API

Go

Apache Beam 的 Go SDK 正在积极开发中。它目前处于实验阶段,不建议在生产环境中使用。Spark 没有官方的 Go SDK。

R

Apache Beam 没有官方的 R SDK。Spark 结构化流由 R SDK 支持,但仅支持 文件源 作为流处理输入。

后续步骤

我们希望这篇文章能激励您尝试将流处理源连接到 Beam 管道的新颖且有趣的方式!

查看以下链接以获取更多信息

  • 查看 Apache Beam 的所有内置和正在开发的 I/O 转换 的完整列表。
  • 了解一些 Apache Beam 移动游戏管道 示例