$ kubectl -n=<namespace> logs -f <driver-pod-name>
收集和聚合日志,我们后面会和ES结合。
我们TalkingData内部有自己的监控平台OWL(已开源),未来我们计划编写metric plugin,将Kubernetes接入OWL中。
为了保证Spark作业时刻有可用的计算资源,我们前期采用了物理隔离的方案。显而易见,这种方式大幅降低了物理资源的使用率。下一步我们计划采用混部方案,通过以下三种方式实现:
将HDFS和Kubernetes混合部署
为Spark作业和Kubernetes node划分优先级,在低优先级的node上同时运行一些无状态的其他生产服务
利用云实现资源水平扩展,以防止资源突增
在采用以下两种方法增加资源使用率时,集群可能会面临资源短缺和可用性的问题:
这会导致运行资源大于实际物理资源的情况(我称之为资源挤兑)。一种做法是给资源划分等级,优先保证部分等级的资源供给。另一种做法是实现资源的水平扩展,动态补充可用资源,并在峰值过后自动释放。我在另一篇文章中阐述了这种设计理念:https://xiaoxubeii.github.io/articles/k8s-on-cloud/。
TalkingData有自研的多云管理平台,我们的解决方法是实现单独的Kubernetes tdcloud-controller-manager作为资源的provider和manager,通过TalkingData OWL监控告警,实现资源的水平扩展。
Q:我想问权限方面的问题,前面有看到一个提交作业的例子是spark-summit –files hdfs://host:port/path/to/file1,即用spark处理hdfs上的数据,出于数据安全的考虑,hdfs一般会开启权限认证,用户在kerberos上做认证,用同一个身份信息访问spark和hdfs。对于spark on k8s 这样一个方案,是如何认证并与hdfs结合的呢?
A:老实说,我们原生的Spark集群也还是基于POSIX,并没有使用kerberos。不过我认为一个可行的结合方案是使用Kubernetes的webhook,在作业提交时,和kerberos交互换取身份验证信息。具体可参考:https://kubernetes.io/docs/admin/authorization/webhook/。
Q:为什么使用node label进行资源隔离,而不使用resourcequota对多租户进行资源隔离?
A:由于我们很多大数据计算作业对SLA有很高的要求,并且Docker实际上对很多应用的资源限制都支持的不好。所以我们前期为了稳妥,还是对计算资源进行了物理隔离。
Q:除了日志无法聚合外,每次查看Driver UI也是个问题。比如当我跑的程序较多时怎么有效地管理这些completed driver pod?
A:是的,Spark On Kubernetes还缺少应用管理的功能。不过这个功能已经列在官方的todo list里。
Q:比如flannel是把flannel参数传给docker,一种用cni插件,他们有何差别?
A:实际上cni是Kubernetes的标准网络接口,而flannel是实现pod间通信的网络插件。cni中有两类插件:一个是ipam,一个是network plugins。flannel属于后者,是可以纳入cni管理的。
Q:这里的多租户隔离,只提到任务执行过程的调度,那对于不同租户的任务提交,状态监控,结果呈现如何实现隔离的?
A:不同的租户对应不同的Kubernetes namespace,所以自然实现了任务提交和状态监控的隔离。至于计算结果,我们以往是单纯用hdfs path做隔离。我们目前内部有大数据平台,那里真正实现了多租户。
Q:spark on kubernetes这种方式为开发人员增加了难度,不像其他的集群方案,开发人员除了要会 spark还要会kubernetes,请问怎么推?
A:实际上Spark On Kubernetes对大数据开发人员是透明的,任务的提交方式并没有改变,只是加了一些额外的option。并且我们上层是有统一的大数据平台,进行作业提交。
Q:在使用hdfs存储资源下,如果不使用spark的数据本地性,大量数据之间的传输,map和reduce操作是否会影响spark的计算性能呢?
A:个人认为肯定会有影响,因为每次从hdfs读取,会带来巨大的网络流量。但是我本身对spark的数据本地性没有什么研究。后期我们计划将hdfs和Kubernetes混部,将数据尽量靠近计算节点,不知道这种方式能否缓解这个问题。同时,我们还可以使用Spark on Kubernetes的external-shuffle-service,从而使用hostpath volume将shuffle和executor pods打通。
Q:spark会作为哪种资源部署方式部署?deployment还是statefulSet?或者其他?sprk在生产环境上部署有需要什么资源配置?能否分享下talkingdata的生产环境是如何分配spark资源的?
A:Spark On Kubernetes实际就是创建了Spark driver headless service,然后创建Spark driver pod,最后由driver创建executors pods。上述分享中我也提到了,目前我们还是以物理机作为spark资源分配的单位。
Q:yarn vs k8s优缺点
A:我们以前的Spark就是采用Spark On Yarn的方式,不过我对Yarn不是非常了解。之所以采用k8s是因为,我们想统一底层的资源调度平台。但是Yarn目前还是和Hadoop生态强耦合的。