根据数据作业的大小启动kubernetes pod内存

时间:2018-06-28 03:51:12

标签: apache-spark kubernetes apache-spark-sql google-cloud-dataflow apache-beam

是否有一种方法可以根据数据作业的大小动态扩展Pod的内存大小(我的用例)?

当前,我们有用内存量定义的Job和Pod,但是我们不知道给定时间段(有时1000行,有时100,000行)的数据量。
因此,如果数据大于我们预先分配的内存,它将中断。

我曾经考虑过使用按数据量划分的切片,即每10,000行削减一次,我们将知道处理固定数量的行的内存需求。但是我们试图按时间汇总,因此需要时间片。

或其他任何解决方案,例如kubernetes上的Spark?

另一种查看方式:
我们如何在AWS的Kubernetes中实现Cloud Dataflow

3 个答案:

答案 0 :(得分:1)

最佳做法是始终在容器定义中定义resources,尤其是:

  • limits:CPU和内存的上层
  • requests:CPU和内存的最低级别

这使调度程序可以做出更好的决策,并简化了对每个pod(https://kubernetes.io/docs/tasks/configure-pod-container/quality-service-pod/)的服务质量(QoS)的分配,该分配分为三种可能的类别:

  • 保证(最高优先级): 请求=限制
  • 突发 请求<限制
  • 尽力而为(最低优先级):未设置请求和限制时。

QoS启用了在系统过量使用时杀死Pod的标准。

答案 1 :(得分:1)

如果您不知道给定时间片的吊舱内存需求,那么Kubernete Cluster Autoscaler很难根据本文档[1]为您自动扩展节点池。因此,对于您的两个建议(例如使用Kubernete Cluster Autoscaler在Kubernete上运行Cloud Dataflow或Spark),可能都不适合您的情况。

但是,您可以使用自定义缩放作为解决方法。例如,您可以将Pod的与内存相关的指标导出到Stackdriver,然后部署Horizo​​ntalPodAutoscaler(HPA)资源以将应用程序缩放为[2]。

[1] https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-autoscaler#how_cluster_autoscaler_works

[2] https://cloud.google.com/kubernetes-engine/docs/tutorials/custom-metrics-autoscaling

答案 2 :(得分:-1)

我找到了部分解决方案。
请注意,此问题分为两部分。
1.根据数据作业的大小,使Pod请求正确的内存量
2.确保此Pod可以找到要在其上运行的节点。

Kubernetes集群自动缩放器(CA)可以解决第2部分。
https://github.com/kubernetes/autoscaler/tree/master/cluster-autoscaler

根据自述文件:
Cluster Autoscaler是一种工具,当由于资源不足而导致Pod无法在集群中运行时,它会自动调整Kubernetes集群的大小。

因此,如果某个数据作业需要的内存比当前正在运行的节点中可用的内存更多,它将通过增加节点组​​的大小来启动一个新节点。
详细信息:
https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md

我仍然不确定如何做第1点。

第1点的替代方法,启动没有特定内存请求或限制的容器: https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource/#if-you-don-t-specify-a-memory-limit

  

如果您没有为容器指定内存限制,则可以选择其中之一   情况适用:

The Container has no upper bound on the amount of memory it uses. 
or
The Container could use all of the memory available on the Node where it is running.