将Cloud Dataflow SDK迁移到Apache Beam SDK
PLAID Advent Calendar 2018 的第17天
今天我们来谈谈关于从Cloud Dataflow SDK到Apache Beam SDK的转移。
在第13天,业务团队通过KARTE Datahub学习了初次使用的SQL。 KARTE Datahub的后端部分是通过Dataflow来运行的。
数据流任务的开发始于去年年底,自今年4月开始在生产环境中运行。本月在生产环境中,每天的批处理作业执行次数超过500次。
请注意,
本次我们不讨论Java SDK。
对于期望了解Python的人,非常抱歉。
关于Cloud Dataflow SDK
Cloud Dataflow SDK是由Google提供的工具,用于在Cloud Dataflow上执行Apache Beam的管道。除了Dataflow之外,Apache Beam还有其他几个可以运行的管道执行环境,但将需要在Dataflow中运行的功能封装成了一个软件包(即Apache Beam SDK的子集)。
关于管道执行环境,请查看这里。
Cloud Dataflow SDK 的支持终止通知
Apache Beam 和 Cloud Dataflow 的帮助文档
Cloud Dataflow SDK 的支持已经结束的通知:Cloud Dataflow SDK 2.5.0 将成为 Cloud Dataflow SDK 的最后一个版本。Cloud Dataflow SDK 的发布与 Apache Beam SDK 的发布是独立的。Cloud Dataflow 服务将完全支持官方的 Apache Beam SDK 发布。Cloud Dataflow 服务还将支持版本号为 2.0.0 及更高的 Apache Beam SDK 发布。
另外,Eclipse插件的运行版本也限制在2.5.0及以下。
使用Java和Eclipse进行快速启动。
Cloud Dataflow Eclipse插件只能在Cloud Dataflow SDK 2.0.0至2.5.0版本中运行。该插件无法在Apache Beam SDK中运行。
使用Eclipse可以运行流水线非常方便,所以现在感到非常悲伤。
迁移到Apache Beam SDK
我在上方提到,Cloud Dataflow SDK是Apache Beam SDK的一个子集。
如果你调查一下Cloud Dataflow SDK所封装的内容,你可以进行迁移到Apache Beam SDK。
在Maven中央仓库搜索,找到了com.google.cloud.dataflow:google-cloud-dataflow-java-sdk-all。
依赖关系的摘录
<dependencies>
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-sdks-java-core</artifactId>
</dependency>
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-sdks-java-io-google-cloud-platform</artifactId>
</dependency>
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-runners-direct-java</artifactId>
</dependency>
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-runners-google-cloud-dataflow-java</artifactId>
</dependency>
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-sdks-java-io-kafka</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
我会尝试替换谷歌云数据流Java SDK的所有部分。
以前的更改
<dependencies>
<dependency>
<groupId>com.google.cloud.dataflow</groupId>
<artifactId>google-cloud-dataflow-java-sdk-all</artifactId>
<version>2.5.0</version>
</dependency>
</dependencies>
更改后
<dependencies>
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-sdks-java-core</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-sdks-java-io-google-cloud-platform</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-runners-direct-java</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-runners-google-cloud-dataflow-java</artifactId>
<version>2.5.0</version>
</dependency>
</dependencies>
我使用Maven构建生成的jar文件执行了命令,成功地执行了流水线。
如果将版本保存为变量,那么在更改SDK版本时会非常方便。
<properties>
<beam.version>2.8.0</beam.version>
</properties>
<!-- propertiesに定義すると↓のようにかけます -->
<dependencies>
<dependency>
<groupId>org.apache.beam</groupId>
<artifactId>beam-sdks-java-core</artifactId>
<version>${beam.version}</version>
</dependency>
</dependencies>
可以给一个额外的选项
Apache Beam SDK 2.9.0:Apache Beam软件开发工具包2.9.0版本。
Apache Beam SDK 2.9.0在本月13日发布了(也就是4天前)。
https://beam.apache.org/get-started/downloads/#releases
由于2.4.0到2.5.0之间大约间隔了3个月,所以我能感受到最近几个月发布的速度很快。
小話開發
我们遇到了无法写入Cloud Spanner的多字节字符的bug(已在Apache Beam SDK 2.7.0中解决)。
Dataflow Worker的自动扩展功能非常强大,导致向Cloud Bigtable写入时容易出现热点问题。
Dataflow Worker出现了从1到1000的神秘扩展行为,超过了Compute Engine的限制,导致作业失败。
我们还遇到了其他各种问题,但现在系统稳定运行。
解决这些问题让我们获益匪浅,虽然困难,但也很有乐趣。
最后
自從在公司內部使用Datahub和Dataflow後,其他專案也開始開始使用,使得活用的範圍被擴大了。雖然在Datahub中只執行批次作業,但也有一些地方正在運行流式作業,未來可能會進一步擴大活用的機會和範圍。今年推出了Go SDK等,使得Apache Beam社群的動態顯得活躍,將繼續關注其動向。