热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Chi:AScalableandProgrammableControlPlaneforDistributedStreamProcessingSystems

摘要Chi主要是为了解决大规模集群下负载的变化性,以及难以进行静态参数调优、多种多样的用户SLO而提出的,具体来说,就是让流系统能够在运行时动态的重配置,Chi本质上是通过在原有流

摘要 Chi主要是为了解决大规模集群下负载的变化性,以及难以进行静态参数调优、多种多样的用户SLO而提出的,具体来说,就是让流系统能够在运行时动态的重配置,Chi本质上是通过在原有流系统上嵌入一个控制平面,允许用户自定义控制操作,从而可以监测到系统运行情况,进行动态重配置

Chi以一个控制环路的方式实现这个控制平面,并且将控制消息嵌入到数据流中,从而重用了数据管道,Chi 引入了一种新的反应式编程模型和设计机制来异步执行控制策略,从而避免全局同步,最后实验证明了Chi的灵活性。


介绍

首先就是说传统批处理已经无法满足需要,我们需要流处理!

但是实现流处理所描述的优点有几个障碍:



  1. 流负载有时间与空间的可变性,后面具体描述这两种可变性

  2. 大规模集群有高度的硬件异构型以及不可预测的并发使用,这就使得算子分工很复杂

  3. 现代流系统往往有很大的参数空间,使得调优变得很难,就是说现在的流系统都很庞大复杂,难以人为调优

  4. 不同的用户使用一套流系统的时候可能会有不同的SLO(服务等级目标),需要不同的配置

为了解决这些问题,我们需要对流系统进行运行时监控,获得反馈,然后进行动态重配置,如资源重新分配/调度或者调优,我们就把负责这些控制操作的层叫做控制平面,与之相对应的就是数据平面(负责数据处理的层)

于是Chi这个团队就和云运营商进行讨论,他们得出一个控制平面需要满足三点:



  1. 应该能让用户自定义控制操作,以适应不同场景

  2. 应该给用户提供简单直白的API

  3. 控制开销应该尽可能地小

不幸的是现在没有系统能满足这三点,于是就产生了我们的Chi

Chi受标点符号机制的启发,将控制消息放到数据平面中,利用了数据平面的FIFO等特性,为了方便测试,他们团队在Flare上实现了Chi,Flare是他们团队自己的内部流系统


动机

通过分析超过200000台服务器的日志数据,Chi团队进行了广泛的研究,得到了以下结果:

负载不可预测 检测到的负载变化如下图,首先每一行都有不同的特征,这就是空间可变性,而每一行有时会突然加深或者变浅,这就是时间可变性

我们以每分钟的增量来量化这种可变性,绘制成箱须图,如下:

数据多样性 这里主要说的是key偏斜的问题,可能数据中的很大一部分都属于某几个key

多租客控制策略 就是说很多用户对同一个流系统有不同的控制策略,比如同一个流系统传输日志,对于某些重要的信息日志需要精确一次语义,对于某些详细日志,只需要至少一次语义

基于此,得出了控制平面的需要:



  1. 高效且可扩展的反馈控制回路

  2. 简单的控制接口

  3. 对数据平面的影响最小化


背景

本节主要介绍数据流模型,略


设计

我们主要关注Chi是如何实现上面的需求的

首先,Chi重用数据平面高效的基础设施,还可以为用户提供熟悉的API,并且这种重用还可以提供天然的异步屏障,从而完成异步操作


4.1 概述

Chi依赖于以下三个基本功能



  1. 算子之间的管道必须支持精确一次与FIFO传递,当下游算子buffer要填满时触发背压

  2. 算子按收到的顺序依次处理一个记录

  3. 底层引擎能提供算子生命周期管理的能力,允许我们启动、停止算子

1与2主要是用来保证一致性,目前很多流系统都已经实现了上述三个要求,包括Flink等

系统引入了一个控制器,负责监视数据流行为并触发控制操作,用户自定义的控制操作提交给该控制器

一个控制操作由控制环路来执行,由三阶段组成:



  1. 控制器做出控制决策,并使用唯一标识符实例化控制消息,控制消息里包含每个算子的配置变换

  2. 控制消息广播到所有源算子中,随数据在数据流图中传播,每个算子接收到控制消息后触发相应的操作

  3. sink算子将控制消息发送回控制器中,控制器进行后期处理

例如下图:


4.2 控制机制

接下来我们描述了支撑 Chi 的核心机制


4.2.1 通过元拓扑进行图转变

之前的例子中虽然很好的实现了控制操作,但还有一些实现细节没有讨论到,比如R3是何时被启动的,每次迁移可能会涉及到图拓扑的改变,本小节来描述如何实现图转变

Chi通过一个中间拓扑图来完成迁移,定义原来的拓扑图为G,转变后的拓扑图为\(G^*\),中间元拓扑为G',迁移触发前,控制器将拓扑图G转变为G',迁移完成后再修剪为\(G^*\),G' = G ∪ \(G^*\)\(E_{V,V∗}\) 其中 \(E_{V,V∗}\)为G中影响\(G^*\)中状态的节点之间的边,这样就可以避免Flink中全部停止再迁移所引入的时延了,例如前面例子的元拓扑如下图:

但是这样会导致重配置期间对资源的利用率增加,数据流图的规模会扩大两倍,所以Chi又提出了一些优化:

状态不变性 如果一个控制操作没有改变算子的状态S,就可以合并两个算子,例如M1、M2

无环不变性 如果合并两个算子不会引入新的环路,可以合并两个算子

这就解决了状态迁移期间不停止的问题,实现了需求1:控制回路


4.2.2 控制API

Chi的控制API能为开发人员提供不同维度的控制操作,包括空间维度:M算子与R算子行为不同,时间维度:R3收到第一次控制消息与第二次控制消息的行为不同。我们向用户提供以下功能:



  • 配置注入 允许一条消息承担不同算子的配置(实现空间维度)



  • 响应式执行 Chi提供了一系列响应式接口,OnBegin操作与OnNext操作行为自定义(时间维度)

阻塞行为 在之前状态迁移的例子中,我们采用了阻塞并等待对齐的方式等待控制消息,在某些情况下可能很耗费时间,Chi提供了阻塞消息与非阻塞消息两种类型,以满足不同需求,例如在监视流系统的情况下就不需要阻塞

由此满足了需求2:可用API


4.3 高级功能



  • 多控制器:Chi允许多个控制器同时存在,比如让每个控制器负责不同的功能,只要保证控制消息的可串行性,多个控制器就可以同时工作

  • 广播/聚合树:避免多个source或者sink的情况下控制器成为瓶颈而引入

  • 处理拥塞、死锁:背压等待

  • 容错:消息-->依赖底层数据平面;控制器-->checkpoint


4.4 Chi与其他现有模型对比

这里主要将Chi与不同流系统模型进行比较:BSP-based与record-at-a-time,SGC与ALC是这两种系统采用的方法

一致性 BSP可以通过屏障达到一致性,Chi也可以实现BSP,而ALC不能满足一致性,Chi在非阻塞消息的情况下与之相同


应用实例

持续监视

数据流重配置

自动参数调优 结合前两个


实现&讨论

分布式运行时

communication layer提供先进先出的精确一次传输管道,并且有背压

message dispatcher/multiplexer根据消息的类型调用相应的处理模块,并将其输出多路复用到通信层

data processor与control processor根据消息执行相应操作

自定义序列化

可移植性 如果底层系统不提供 FIFO 一次性消息传递,则移植communication layer,移植message dispatcher/multiplexer并重用data processor


评估

控制平面影响数据平面了吗?

繁忙的数据平面会限制控制平面吗?

控制平面可扩展吗?对数增加

适应性与容错



推荐阅读
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文介绍了在PostgreSQL中批量导入数据时的优化方法。包括使用unlogged表、删除重建索引、删除重建外键、禁用触发器、使用COPY方法、批量插入等。同时还提到了一些参数优化的注意事项,如设置effective_cache_size、shared_buffer等,并强调了在导入大量数据后使用analyze命令重新收集统计信息的重要性。 ... [详细]
  • 动手动脑,无法自拔(3)课时作业6
    1.动手动脑(五子棋棋盘排布)(1)源程序(2)实验截图2.动手动脑(数字转换成汉字)(1)源程序(2)实验截图3.动手动脑(大数计算)(1)源程序 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
  • Question该提问来源于开源项目:react-native-device-info/react-native-device-info ... [详细]
author-avatar
熙8778_565
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有