博客
2018/08/20
输入流连接器回顾
在这篇文章中,您将了解 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 Beam | Apache Spark DStreams | ||
文件系统 | 本地 (使用 file:// URI) | TextIO | textFileStream (Spark 将大多数 Unix 系统视为与 HDFS 兼容,但该位置应可从所有节点访问) |
HDFS (使用 hdfs:// URI) | FileIO + HadoopFileSystemOptions | HdfsUtils | |
对象存储 | Cloud Storage (使用 gs:// URI) | FileIO + GcsOptions | hadoopConfiguration 和 textFileStream |
S3 (使用 s3:// URI) | FileIO + S3Options | ||
消息队列 | Kafka | KafkaIO | spark-streaming-kafka |
Kinesis | KinesisIO | spark-streaming-kinesis | |
Cloud Pub/Sub | PubsubIO | spark-streaming-pubsub 来自 Apache Bahir | |
其他 | 自定义接收器 | 读取转换 | receiverStream |
Python 连接器
Beam 有一个官方的 Python SDK,目前支持 Java SDK 中可用的流处理功能的一个子集。正在积极开发中以弥合两个 SDK 中功能集之间的差距。目前对于 Python,支持 Direct Runner 和 Dataflow 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 Beam | Apache Spark DStreams | ||
文件系统 | 本地 | io.textio | textFileStream |
HDFS | io.hadoopfilesystem | hadoopConfiguration(通过 sc._jsc 使用 Py4J 访问)和 textFileStream | |
对象存储 | Google Cloud Storage | io.gcp.gcsio | textFileStream |
S3 | N/A | ||
消息队列 | Kafka | N/A | KafkaUtils |
Kinesis | N/A | KinesisUtils | |
Cloud Pub/Sub | io.gcp.pubsub | N/A | |
其他 | 自定义接收器 | BoundedSource 和 RangeTracker | N/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 管道的新颖且有趣的方式!
查看以下链接以获取更多信息