首页 > 编程语言 >0基础读顶会论文—Kappa:一种用于无服务器计算的编程框架

0基础读顶会论文—Kappa:一种用于无服务器计算的编程框架

时间:2024-11-05 10:33:05浏览次数:1  
标签:同步 Kappa 函数 编程 读顶会 任务 检查点 lambda

原文链接

代码:快速使用kappa

首先的首先,可以先去了解一下lambda架构

Abstract

在本文中提出了Kappa,一个简化无服务器开发的框架。它使用检查点来处理lambda函数超时,并提供并发机制,实现并行计算和协调

1 Introduction

无服务器计算是一种新的云范例,在这种范例中,租户不是配置虚拟机(VM),而是向平台注册事件处理程序(例如 Python 函数)。当事件发生时,平台会在 lambda 函数(一种短暂的无状态执行环境)上调用处理程序。lambda 函数在终止前可以执行一段有界的时间(例如在 AWS 上为 15 分钟)
存在两个主要挑战:(1)程序员必须手动划分计算以适应 lambda 函数的时间限制;(2)程序员没有可用的并发或同步原语(如线程、锁、信号量等),因此必须要么实现这样的原语,要么限制自己使用无共享并行性,要么避免使用为简化开发而开发的并行 lambda 函数

2 Background and Motivation

2.1 Comparison to Existing Framework

2.2 Lambda Function Time Limit

无服务器计算中的Lambda函数存在时间限制的原因主要是为了优化运营商的任务分配和资源管理,运营商不再需要预测任务的完成时间或进行复杂的迁移操作,能够更灵活地进行任务分配和资源利用

3 Kappa Design

Kappa 有三个组成部分:(1)一个协调器,负责启动和恢复任务以及实现 Kappa 的并发原语;(2)一个编译器,负责生成检查点所需的代码;(3)一个库,供任务用于检查点、并发处理和同步

3.1 Coordinator

Kappa 协调器负责在 lambda 函数上安排任务、实现同步和跨任务通信、跟踪任务元数据(包括检查点)以及提供容错功能,协调器本身通过跨备份存储(例如,Redis 集群)复制其状态来支持容错,通过管理远程过程调用 (RPC) 来实现这一点,其中包括生成新任务、检查点、消息排队和检索任务结果等操作。

3.2 Checkpointing

Kappa使用检查点来容忍lambda函数超时并防止RPC重复,在任务执行的某些关键点创建“检查点”,将任务当前的运行状态(包括变量、控制流等)记录下来。使用了一种称为“continuations(延续)”的技术来创建检查点,延续是一种保存程序控制流的方式,这种方式无需依赖传统服务器持久化状态,而是通过序列化将任务的状态数据保存到外部存储(如Redis或S3)中,提供同步和异步两种检查点模式。同步检查点在保存状态时会短暂停止任务执行,而异步检查点则允许任务继续执行,检查点数据在后台保存,检查点数据分布存储在多个节点上,并支持多任务同时创建检查点


(b) 显示了由编译器生成的延续函数,用来保存检查点后的执行流程,(c) 使用异常处理机制在暂停点恢复,确保任务可以从中断处继续执行

3.3 Concurrency API

两种基本并发机制:任务启动和任务同步

任务启动 (spawn) 并行机制:spawn RPC 用于启动一个新任务,以并行的方式执行某个函数调用(如f(args)),并返回一个Future对象,用于跟踪任务的结果。工作机制是通过创建一个初始检查点。当系统恢复这个检查点时,会执行相应的函数调用。此时,协调器(Coordinator)会调用一个新的lambda函数,从该检查点恢复并执行任务。

先进先出(FIFO)队列机制:如果一个任务尝试向已满的队列入队或从空队列出队,任务将被阻塞。这个机制不仅可以用来实现任务间通信,还可以作为锁和信号量,控制资源的并发访问。

4 Implementation

编译器是用Python编写的,通过Python的pickle库进行状态序列化,每个任务由一个Go协程(goroutine)管理,任务间的同步使用Go的通道(channel)实现,通过锁机制和Redis事务来确保状态更新的原子性

5 Evaluation

检查点开销测试:通过让Lambda函数每100ms创建一次检查点,测量同步和异步检查点的延迟。同步检查点会暂停应用处理直到检查点数据持久化;异步检查点在后台完成持久化操作,允许前台的计算继续

并发操作性能测试:使用多生产者多消费者FIFO队列的任务间消息传递,以评估任务通信的延迟

端到端应用评估:测试包括五个Kappa应用场景:TPC-DS SQL查询、字数统计(Word Count)、并行Grep(Parallel Grep)、流处理(Streaming),以及网络爬虫(Web Crawler)

6 Limitations

Kappa编译器尚未完全支持Python的一些特性,包括try/except、yield、async/await、嵌套函数定义和全局变量,只能在由其编译器转换的代码中进行检查点操作,垃圾回收机制,缺乏静态检查可序列化。

标签:同步,Kappa,函数,编程,读顶会,任务,检查点,lambda
From: https://www.cnblogs.com/Mephostopheles/p/18525161

相关文章

  • 新手必看!AIStarter能帮你做什么?【AI绘画、设计、对话、工作流、编程...】
    在当今这个技术飞速发展的时代,人工智能(AI)已经成为了推动各行各业创新的关键力量。为了帮助更多的人能够轻松地利用AI技术解决实际问题,AIStarter应运而生。作为一款面向开发者的强大工具,AIStarter不仅简化了AI模型的构建过程,还提供了丰富的资源和支持,让不论是初学者还是有经验......
  • GPT-Academic 编程类插件区使用教程
    GPT-Academic官网:GPT-Academic官方用户中心一.虚空终端在网络编程中,网络终端可以指一个通过网络连接到远程服务器或服务的终端,用户可以通过它来执行远程命令。二.解析整个python项目GPT(GenerativePre-trainedTransformer)是一种强大的语言模型,能够理解和生成自然语言文本......
  • [编程笔记] 奇怪的bug - 公共提示组件不生效
    项目中有这么一个提示框:对应的代码是:top.msg.ok(123)很简单的一个功能,初看的时候就猜到是用的某个组件,其他地方要用一般照抄,改下文案即可,这种弹出肯定是公共组件了。然鹅,很神奇的是我新做的页面,复制以后没效果!由于是最近刚接触的项目,多少有点......
  • 实验3 类和对象_基础编程2
     实验任务1实验代码:1#pragmaonce23#include<iostream>4#include<string>56usingstd::string;7usingstd::cout;89//按钮类10classButton{11public:12Button(conststring&text);13stringget_label()const;14......
  • 实验3 类和对象_基础编程2
    任务1:button.hpp#pragmaonce#include<iostream>#include<string>usingstd::string;usingstd::cout;//按钮类classButton{public:Button(conststring&text);stringget_label()const;voidclick();private:string......
  • 实验3 类和对象_基础编程2
    一、实验目的加深对类的组合机制(has-a)的理解,会使用C++正确定义、使用组合类理解深复制、浅复制练习标准库string,vector用法,能基于问题场景灵活使用针对具体问题场景,练习运用面向对象思维进行设计,合理设计、组合类(自定义/标准库),编程解决实际问题二、实验内容1.实验任......
  • 代码江湖:一位编程侠客的历险记
    在一个风和日丽的早晨,我踏上了学习C语言的征途,满怀着对编程世界的憧憬和对未知的好奇。我想象自己将像一位英勇的骑士,挥舞着键盘和鼠标,征服一个又一个代码堡垒。然而,现实总是比想象中更加戏剧化,我的编程之旅充满了幽默和挑战。我首先遭遇的是PTA平台的挑战,它以其无情的题目和......
  • Socket编程与IO多路复用
    0、引言本篇博客将从socket模型为起点,引入IO多路复用的学习。1、Socket模型1.1、Socket的诞生Socket的诞生背景:Socket最早出现在20实际80年代的Unix操作系统中,当时计算机和网络技术逐步发展,分布式计算开始流行,操作系统需要提供一种标准化的网络通信方式来连接不同的设备。这......
  • 实验3 类和对象_基础编程2
    实验任务一源码1#pragmaonce23#include<iostream>4#include<string>56usingstd::string;7usingstd::cout;89//按钮类10classButton{11public:12Button(conststring&text);13stringget_label()const;14void......
  • 实验三 类和对象 基础编程2
    实验任务11,自定义了两个类分别是window类和button类使用了标准库中的iostream vectorstring 2,不适合 3定义了一个字符串长度为40实验任务21#include<iostream>2#include<vector>34usingnamespacestd;56voidoutput1(constvector<int>&v){......