部落格
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 是一種基本抽象,代表連續的 彈性分散式資料集 (或 RDD)。結構化串流是最近才引入的 (alpha 版本隨 Spark 2.1.0 一起發布),它基於一個 模型,其中即時資料會持續附加到表格結構中。
Spark 結構化串流支援 檔案來源 (本機檔案系統和與 HDFS 相容的系統,如雲端儲存或 S3) 和 Kafka 作為串流 輸入。Spark 為 DStreams 維護針對第三方服務 (如 Kafka 或 Flume) 的內建連接器,而其他連接器則可透過連結外部相依性來使用,如下表所示。
以下是 Java 中可用的 Beam 和 Spark DStreams 的主要串流輸入連接器
Apache Beam | Apache Spark DStreams | ||
檔案系統 | 本機 (使用 file:// URI) | TextIO | textFileStream (Spark 將大多數 Unix 系統視為與 HDFS 相容,但該位置應該可以從所有節點存取) |
HDFS (使用 hdfs:// URI) | FileIO + HadoopFileSystemOptions | HdfsUtils | |
物件儲存 | 雲端儲存 (使用 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 版本中引入了 幾個串流選項的 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 Beam | Apache Spark DStreams | ||
檔案系統 | 本機 | io.textio | textFileStream |
HDFS | io.hadoopfilesystem | hadoopConfiguration (透過 Py4J 使用 sc._jsc 存取) 和 textFileStream | |
物件儲存 | Google 雲端儲存 | io.gcp.gcsio | textFileStream |
S3 | 不適用 | ||
訊息佇列 | Kafka | 不適用 | KafkaUtils |
Kinesis | 不適用 | KinesisUtils | |
Cloud Pub/Sub | io.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 管線!
查看以下連結以取得更多資訊