部落格
2021/11/04
Go SDK 在 Apache Beam 2.33.0 版本中結束實驗階段
Apache Beam 的最新版本 2.33.0 是長期處於實驗階段的 Go SDK 的第一個正式版本。Go SDK 使用 Go 程式設計語言 建構,與 Java 和 Python SDK 一起成為 Beam 程式設計模型的第三個實現。
使用新的 Go SDK。
Go SDK 的新使用者可以透過匯入主要的 beam 套件,開始在他們的 Go 程式中使用它
import "github.com/apache/beam/sdks/v2/go/pkg/beam"
下次執行 go mod tidy
將會取得模組的最新穩定版本。或者,執行 go get github.com/apache/beam/sdks/v2/go/pkg/beam
將會立即將其下載到本機模組快取,並將其新增到您的 go.mod
檔案中。
現有的實驗性 Go SDK 使用者需要更新到新的 v2
匯入路徑,才能開始使用最新版本的 SDK。這可以透過將 v2
新增至匯入路徑來完成,將 github.com/apache/beam/sdks/go/
… 變更為 github.com/apache/beam/sdks/v2/go/
…(如適用),然後執行 go mod tidy
。
有關使用 SDK 的更多文件,請參閱 Beam 程式設計指南,以及套件中的 Go Doc。
功能支援
在撰寫本文時,Go SDK 目前是「不含電池」。這表示在支援的 IO 和轉換中存在差距或邊緣案例。也就是說,SDK 的核心為使用者自訂使用啟用了 Beam 模型的大部分功能,支援以下功能
- PTransforms
- Impulse
- Create
- 具有使用者 DoFns 的 ParDo
- 可迭代的側輸入
- 多個輸出發射器
- 接收和傳回鍵值對
- 可分割的 DoFns
- GroupByKey 和 CoGroupByKey
- 具有使用者 CombineFns 的 Combine 和 CombinePerKey
- Flatten
- Partition
- 複合轉換
- 跨語言轉換
- 事件時間視窗
- 全域、間隔、滑動和會話視窗
- 使用 GroupByKeys 或 Combines 彙總視窗化的 PCollections
- 編碼器
- 基本 Go 類型(整數、字串、[]bytes 等)
- Go 結構類型的 Beam 結構描述(包括結構、切片和映射欄位)
- 註冊自訂編碼器
- 指標
- PCollection 指標(元素計數、大小估計)
- 自訂使用者指標
- 後續工作使用者指標查詢(將在 2.34.0 中推出)
- DoFn 分析指標(將在 2.35.0 中推出)
- 內建轉換
- 總和、計數、最小值、最大值、前幾名、篩選
- 可擴展的 TextIO 讀取
以下討論即將推出的功能路線圖和已知問題。特別是,我們計劃透過 Beam 的跨語言功能來支援更豐富的 IO 連接器集。
版本
在此版本中,Go SDK 現在使用 Go 模組 來管理相依性。這使得使用者、SDK 作者和測試基礎架構都可以依賴相同版本的相依性,從而使建置具有可重複性。這也使得 驗證 Go SDK 發行候選版本變得簡單。
現在會建置和發佈版本化的 SDK 工作器容器,SDK 使用相符的標記版本。除非使用自訂容器,否則使用者工作不再需要指定要使用的容器。
相容性
Go SDK 在很大程度上將遵循 Go 的相容性概念。為了讓所有 SDK 在同一發佈週期中保持一致,做出了一些讓步。
語言相容性
該 SDK 將以最低 Go 程式設計語言 1.16 版本進行測試,並相應地使用可用的語言功能和標準程式庫套件。為了維持廣泛的相容性,Go SDK 將不需要 Go 的最新主要版本。我們預期會遵循該語言的第二個最新支援版本,但當 Go 1.18 發佈時可能會出現例外情況,以便開始在 SDK 中試驗 Go 泛型。發行說明將在語言的最低版本變更時指出。
套件相容性
主要使用者套件將避免針對核心功能以不向後相容的方式進行變更。這與 Go 的 匯入相容性規則
概念一致。
如果舊套件和新套件具有相同的匯入路徑,則新套件必須向後相容於舊套件。
此政策的例外情況是關於較新、實驗性或正在開發的功能,並且可能會變更。此類功能將具有指出實驗狀態的文件註解。重大變更將在發行說明中提及。例如,目前使用觸發器的 beam.WindowInto
處於實驗階段,且 API 可能會在未來版本中變更。
主要使用者套件包括
- 主要 beam 套件
github.com/apache/beam/sdks/v2/go/pkg/beam
.../transforms
、.../io
、.../runners
和.../testing
下的子套件。
一般而言,模組中除主要使用者套件外的套件是用於架構用途,並且有變更的風險。
已知問題
不含電池。
- 目前的原生轉換未經過充分測試
- IO 可能未編寫為可擴展
- Go Direct Runner 不完整且不可攜帶,建議使用 Python 可攜式執行器或 Flink
- 不支援側輸入視窗。BEAM-13075
- 不序列化資料,因此不太可能捕獲編碼器問題 BEAM-6372
- 可以使用其他一般改進,並變得可攜帶 BEAM-11076
- 目前的觸發器 API 正在迭代中,並且可能會變更 BEAM-3304
- API 在 2.33.0 和 2.34.0 之間可能發生重大變更,並且可能會再次變更
- 在 Google Cloud Dataflow 等服務上對 SDK 的支援仍然由服務擁有者自行決定
- 需要什麼嗎?
- 在 Beam JIRA 中提交工單,並且
- 向 dev@beam.apache.org 列表發送電子郵件!
在 2.34.0 中修復
top.SmallestPerKey
已損壞 BEAM-12946beam.TryCrossLanguage
API 與非 Try 版本不符 BEAM-9918- 如果有人呼叫
beam.TryCrossLanguage
,這是一個重大變更
- 如果有人呼叫
在 2.35.0 中修復
- 非全域視窗側輸入不符(正確性錯誤)BEAM-11087
- 在 2.35.0 之前,不建議使用未使用全域視窗的側輸入。
- 使用側輸入的 DoFn 會在 bundle 中累積記憶體,導致記憶體不足問題 BEAM-13130
路線圖
已更新SDK 路線圖。目前的重點是加強以串流為中心的功能,改進現有的連接器,並使連接器更容易實作。
在近期內,這將透過改進側輸入,以及提供包裝函式和改進 Java 中跨語言轉換的易用性來實現。
結論
我們希望您覺得此 SDK 很有用,現在還處於早期階段。如果您使用 Go SDK 製作了什麼,請考慮與我們分享。並請記住,我們一直歡迎貢獻。