iis服务器助手广告
返回顶部
首页 > 资讯 > 精选 >如何进行kubernetes scheduler基于map/reduce模式实现
  • 864
分享到

如何进行kubernetes scheduler基于map/reduce模式实现

2023-06-19 09:06:43 864人浏览 薄情痞子
摘要

如何进行kubernetes scheduler基于map/reduce模式实现,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。优选阶段通过分map/reduce

如何进行kubernetes scheduler基于map/reduce模式实现,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

优选阶段通过分map/reduce模式来实现多个node和多种算法的并行计算,并且通过基于二级索引来设计最终的存储结果,从而达到整个计算过程中的无设计,同时为了保证分配的随机性,针对同等优先级的采用了随机的方式来进行最终节点的分配,如果大家后续有类似的需求,不妨可以借鉴借鉴

1. 设计基础

1.1 两阶段: 单点与聚合

在进行优选的时候,除了最后一次计算,在进行针对单个算法的计算的时候,会分为两个阶段:单点和聚合

在单点阶段,会根据当前算法针对单个node计算 在聚合阶段,则会根据当前单点阶段计算完成后,来进行聚合

1.2 并行: 节点与算法

单点和聚合两阶段在计算的时候,都是并行的,但是对象则不同,其中单点阶段并行是针对单个node的计算,而聚合阶段则是针对算法级别的计算,通过这种设计分离计算,从而避免多Goroutine之间数据竞争,无锁加速优选的计算

1.3 map与reduce

而map与reduce则是针对一个上面并行的两种具体实现,其中map中负责单node打分,而reduce则是针对map阶段的打分进行聚合后,根据汇总的结果进行二次打分计算

1.4 weight

map/reduce阶段都是通过算法计算,如果我们要进行自定义的调整,针对单个算法,我们可以调整其在预选流程中的权重,从而进行定制自己的预选流程 

1.5 随机分布

当进行优先级判断的时候,肯定会出现多个node优先级相同的情况,在优选节点的时候,会进行随机计算,从而决定是否用当前优先级相同的node替换之前的最合适的node

2. 源码分析 

优选的核心流程主要是在PrioritizeNodes中,这里只介绍其关键的核心数据结构设计

2.1 无锁计算结果保存

无锁计算结果的保存主要是通过下面的二维数组实现, 如果要存储一个算法针对某个node的结果,其实只需要通过两个索引即可:算法索引和节点索引,同理如果我吧针对单个node的索引分配给一个goroutine,则其去其他的goroutine则就可以并行计算 如何进行kubernetes scheduler基于map/reduce模式实现

// 在计算的时候,会传入nodes []*v1.Node的数组,存储所有的节点,节点索引主要是指的该部分results := make([]schedulerapi.HostPriorityList, len(priorityConfigs), len(priorityConfigs))

2.2 基于节点索引的Map计算

如何进行kubernetes scheduler基于map/reduce模式实现 之前在预选阶段介绍过ParallelizeUntil函数的实现,其根据传入的数量来生成计算索引,放入chan中,后续多个goroutine从chan中取出数据直接进行计算即可

workqueue.ParallelizeUntil(context.TODO(), 16, len(nodes), func(index int) {// 根据节点和配置的算法进行计算nodeInfo := nodeNameToInfo[nodes[index].Name]            // 获取算法的索引for i := range priorityConfigs {if priorityConfigs[i].Function != nil {continue}var err error                                // 通过节点索引,来进行针对单个node的计算结果的保存results[i][index], err = priorityConfigs[i].Map(pod, meta, nodeInfo)if err != nil {appendError(err)results[i][index].Host = nodes[index].Name}}})

2.3 基于算法索引的Reduce计算

如何进行kubernetes scheduler基于map/reduce模式实现 基于算法的并行,则是为每个算法的计算都启动一个goroutine,每个goroutine通过算法索引来进行该算法的所有map阶段的结果的读取,并进行计算,后续结果仍然存储在对应的位置

// 计算策略的分值for i := range priorityConfigs {if priorityConfigs[i].Reduce == nil {continue}wg.Add(1)go func(index int) {defer wg.Done()if err := priorityConfigs[index].Reduce(pod, meta, nodeNameToInfo, results[index]); err != nil {appendError(err)}if klog.V(10) {for _, hostPriority := range results[index] {klog.Infof("%v -> %v: %v, Score: (%d)", util.GetPodFullName(pod), hostPriority.Host, priorityConfigs[index].Name, hostPriority.Score)}}}(i)}// Wait for all computations to be finished.wg.Wait()

2.4 优先级打分结果统计

根据之前的map/reduce阶段,接下来就是将针对所有node的所有算法计算结果进行累加即可

// Summarize all scores.result := make(schedulerapi.HostPriorityList, 0, len(nodes))for i := range nodes {result = append(result, schedulerapi.HostPriority{Host: nodes[i].Name, Score: 0})// 便利所有的算法配置for j := range priorityConfigs {result[i].Score += results[j][i].Score * priorityConfigs[j].Weight}for j := range scoresMap {result[i].Score += scoresMap[j][i].Score}}

2.5 根据优先级随机筛选host

这里的随机筛选是指的当多个host优先级相同的时候,会有一定的概率用当前的node替换之前的优先级相等的node(到目前为止的优先级最高的node), 其主要通过cntOfMaxScore和rand.Intn(cntOfMaxScore)来进行实现

func (g *genericScheduler) selectHost(priorityList schedulerapi.HostPriorityList) (string, error) {if len(priorityList) == 0 {return "", fmt.Errorf("empty priorityList")}maxScore := priorityList[0].Scoreselected := priorityList[0].HostcntOfMaxScore := 1for _, hp := range priorityList[1:] {if hp.Score > maxScore {maxScore = hp.Scoreselected = hp.HostcntOfMaxScore = 1} else if hp.Score == maxScore {cntOfMaxScore++if rand.Intn(cntOfMaxScore) == 0 {// Replace the candidate with probability of 1/cntOfMaxScoreselected = hp.Host}}}return selected, nil}

3. 设计总结

优选阶段通过分map/reduce模式来实现多个node和多种算法的并行计算,并且通过基于二级索引来设计最终的存储结果,从而达到整个计算过程中的无锁设计,同时为了保证分配的随机性,针对同等优先级的采用了随机的方式来进行最终节点的分配,如果大家后续有类似的需求,不妨可以借鉴借鉴

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: 如何进行kubernetes scheduler基于map/reduce模式实现

本文链接: https://www.lsjlt.com/news/295197.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何进行kubernetes scheduler基于map/reduce模式实现
    如何进行kubernetes scheduler基于map/reduce模式实现,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。优选阶段通过分map/reduce...
    99+
    2023-06-19
  • java基于NIO如何实现群聊模式
    这篇文章将为大家详细讲解有关java基于NIO如何实现群聊模式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体内容如下Clientpackage com.qst.chat;import&nbs...
    99+
    2023-06-21
  • 如何进行Java的Actor模式的实现
    如何进行Java的Actor模式的实现,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。JActor 2.2.0 RC1 发布,该版本改进了 JLPCActors 的功能,包括...
    99+
    2023-06-17
  • 如何进行Spring3基于Annotation的依赖注入实现
    这篇文章给大家介绍如何进行Spring3基于Annotation的依赖注入实现,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。简介: Spring 的依赖配置方式与 Spring 框架的内核自身是松耦合设计的。然而,直到...
    99+
    2023-06-17
  • 基于Dojo如何实现MVC模式下的Ajax应用
    基于Dojo如何实现MVC模式下的Ajax应用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。本人要实现项目中的一项应用是控制服...
    99+
    2024-04-02
  • 基于vue3和element-plus的暗黑模式如何实现
    这篇文章主要介绍“基于vue3和element-plus的暗黑模式如何实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于vue3和element-plus的暗黑模式如何实现”文章能帮助大家解决问...
    99+
    2023-07-06
  • 如何实现基于Blod的ajax进度条
    这篇文章主要介绍如何实现基于Blod的ajax进度条,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!普通的浏览器下载在web开发中,如果要实现下载功能,往往都是使用新开web页面或者是...
    99+
    2024-04-02
  • 如何实现基于opencv的行人检测
    这篇文章主要为大家展示了“如何实现基于opencv的行人检测”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现基于opencv的行人检测”这篇文章吧。基于方向梯度直方图(HOG)/线性支持向...
    99+
    2023-06-22
  • 如何实现进行Python测试模块
    小编给大家分享一下如何实现进行Python测试模块,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!为了更容易实现这种Python 测试模块,避免多次复制并粘贴测试函...
    99+
    2023-06-17
  • 基于Python如何实现模拟三体运动
    本文小编为大家详细介绍“基于Python如何实现模拟三体运动”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于Python如何实现模拟三体运动”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。拉格朗日方程此前所做的...
    99+
    2023-07-05
  • 基于Arrays.sort()和lambda表达式如何实现
    小编给大家分享一下基于Arrays.sort()和lambda表达式如何实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Arrays.sort()和lambda...
    99+
    2023-06-22
  • 如何实现基于input动态模糊查询
    这篇文章主要介绍了如何实现基于input动态模糊查询,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。最近在用jQuery实现动态模糊查询的时候...
    99+
    2024-04-02
  • 基于jQuery如何模拟实现淘宝购物车模块
    小编给大家分享一下基于jQuery如何模拟实现淘宝购物车模块,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!这是网页版淘宝中购物车的页面注意给checkbox添加事件就是用change()给button添加事件就是用clic...
    99+
    2023-06-29
  • 如何基于python实现银行管理系统
    这篇文章将为大家详细讲解有关如何基于python实现银行管理系统,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬...
    99+
    2023-06-14
  • SeataAT模式如何实现行锁详解
    目录前言如何加锁为什么是行锁前言 我们在很多博客中都有发现,Seata AT模式里面的全局锁其实是行锁,这也是Seata AT模式和XA模式在锁粒度上的最大区别。我们可以在官网看到这...
    99+
    2022-11-13
    Seata AT模式实现行锁 Seata AT 行锁
  • springsecurity如何实现基于token的认证方式
    这篇文章主要为大家展示了“springsecurity如何实现基于token的认证方式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“springsecurity如何实现基于token的认证方式”...
    99+
    2023-06-20
  • 基于Java如何实现进制转换工具类
    这篇文章主要介绍了基于Java如何实现进制转换工具类的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于Java如何实现进制转换工具类文章都会有所收获,下面我们一起来看看吧。背景最近有个发送短信的功能,需要在短信...
    99+
    2023-07-05
  • 如何进行基于el-table封装的可拖拽行列、选择列组件的实现
    本篇文章为大家展示了如何进行基于el-table封装的可拖拽行列、选择列组件的实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。效果需要环境vue elementUI 拖拽插件Sortable.js...
    99+
    2023-06-22
  • OpenCV基于背景减除如何实现行人计数
    OpenCV基于背景减除如何实现行人计数,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。前言下面将使用OpenCV C++ 对视频中的人流量进行统计。一、图像预处理原图如图所...
    99+
    2023-06-26
  • java基于redis有序集合如何实现排行榜
    小编给大家分享一下java基于redis有序集合如何实现排行榜,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!前言排行榜作为互联网...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作