輸入串流連接器回顧

在這篇文章中,您將了解 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 是一種基本抽象,代表連續的 彈性分散式資料集 (或 RDD)。結構化串流是最近才引入的 (alpha 版本隨 Spark 2.1.0 一起發布),它基於一個 模型,其中即時資料會持續附加到表格結構中。

Spark 結構化串流支援 檔案來源 (本機檔案系統和與 HDFS 相容的系統,如雲端儲存或 S3) 和 Kafka 作為串流 輸入。Spark 為 DStreams 維護針對第三方服務 (如 Kafka 或 Flume) 的內建連接器,而其他連接器則可透過連結外部相依性來使用,如下表所示。

以下是 Java 中可用的 Beam 和 Spark DStreams 的主要串流輸入連接器

Apache BeamApache Spark DStreams
檔案系統本機
(使用 file:// URI)
TextIOtextFileStream
(Spark 將大多數 Unix 系統視為與 HDFS 相容,但該位置應該可以從所有節點存取)
HDFS
(使用 hdfs:// URI)
FileIO + HadoopFileSystemOptionsHdfsUtils
物件儲存雲端儲存
(使用 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 版本中引入了 幾個串流選項的 beta 版。

Spark 也有一個稱為 PySpark 的 Python SDK。如前所述,Scala 程式碼會編譯為由 JVM 執行的位元碼。PySpark 使用 Py4J,這是一個使 Python 程式能夠與 JVM 互動,從而存取 Java 函式庫、與 Java 物件互動以及從 Java 註冊回呼的函式庫。這允許 PySpark 存取原生 Spark 物件,如 RDD。Spark 結構化串流支援檔案來源 (本機檔案系統和與 HDFS 相容的系統,如雲端儲存或 S3) 和 Kafka 作為串流輸入。

以下是 Python 中可用的 Beam 和 Spark DStreams 的主要串流輸入連接器

Apache BeamApache Spark DStreams
檔案系統本機io.textiotextFileStream
HDFSio.hadoopfilesystemhadoopConfiguration (透過 Py4J 使用 sc._jsc 存取) 和 textFileStream
物件儲存Google 雲端儲存io.gcp.gcsiotextFileStream
S3不適用
訊息佇列Kafka不適用KafkaUtils
Kinesis不適用KinesisUtils
Cloud Pub/Subio.gcp.pubsub不適用
其他自訂接收器BoundedSource 和 RangeTracker不適用

其他語言的連接器

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 行動遊戲管線的 範例