【问题标题】:Batch Processing on KubernetesKubernetes 上的批处理
【发布时间】:2020-07-10 10:33:15
【问题描述】:

这里有人有关于 kubernetes 批处理(例如 spring 批处理)的经验吗?这是个好主意吗?如果我们使用 kubernetes 自动缩放功能,如何防止批处理处理相同的数据?谢谢。

【问题讨论】:

  • 我个人研究过使用 Kubernetes 进行批处理,但由于您提到的自动缩放问题,决定不这样做。我有通常运行 1-4 小时的批处理。从技术上讲,我可以在 Kubernetes 中运行它们,但是每次集群缩小时,我的 pod 都会重复自己。从技术上讲,当我收到 SIGTERM 时,我可能能够检查点,但与仅启动单个 VM 并观察它们的进度相比,它开始看起来工作量太大了。总体而言,Kubernetes 似乎不是为这个用例而设计的。
  • 这是一篇较长的文章,有人写过关于这个主题的文章。归根结底,Kubernetes 可能是满足某些需求的绝佳选择,而对另一些需求而言则是糟糕的选择。 ben-morris.com/do-you-really-need-kubernetes
  • 另外值得注意的是,谷歌在 GKE 中有一个用于批处理的 beta 程序,但后来弃用了它:cloud.google.com/kubernetes-engine/docs/concepts/batch

标签: kubernetes spring-batch batch-processing


【解决方案1】:

这里有人有关于 kubernetes 批处理(例如 spring 批处理)的经验吗?这是个好主意吗?

对于 Spring Batch,我们(Spring Batch 团队)确实有一些经验,我们在以下会谈中分享了这些经验:

在 Kubernetes 上运行批处理作业可能会很棘手:

  • Pod 可能在处理过程中被不同节点上的 k8s 重新调度
  • cron 作业可能会被触发twice

这需要在开发人员方面进行额外的重要工作,以确保批处理应用程序具有容错性(对节点故障、pod 重新调度等具有弹性),并且可以防止在集群环境中重复执行作业。

Spring Batch 会为您处理这些额外的工作,并且可以成为在 k8s 上运行批处理工作负载的不错选择,原因如下:

  • 成本效率: Spring Batch 作业在外部数据库中维护其状态,这使得可以在作业/节点故障或 pod 重新启动时从上一个保存点重新启动它们-调度
  • 稳健性:借助集中式作业存储库,可防止重复作业执行
  • 容错:重试/跳过失败的项目,以防出现暂时性错误,例如对可能暂时关闭或在云环境中重新安排的网络服务的调用

我写了一篇博客文章,其中我通过代码示例详细解释了所有这些方面。你可以在这里找到它:Spring Batch on Kubernetes: Efficient batch processing at scale

如果我们使用 kubernetes 自动缩放功能,如何防止批处理处理相同的数据?

让每个作业处理不同的数据集是可行的方法(例如,每个文件一个作业)。但是您可能对不同的模式感兴趣,请参阅 k8s 文档中的 Job Patterns

【讨论】:

    猜你喜欢
    • 2018-02-23
    • 2020-10-29
    • 1970-01-01
    • 2013-07-30
    • 2019-08-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 2022-10-26
    相关资源
    最近更新 更多