当前位置: 首页 > 科技观察

Serverless在大规模数据处理中的实践

时间:2023-03-14 22:45:38 科技观察

前言当你第一次接触Serverless时,有一种新的、不太明显的使用方式:与传统的基于服务器的方法相比,Serverless服务平台可以让你的应用快速横向化扩展,并行处理工作更高效。这主要是因为Serverless不用为闲置资源付费,不用担心预留资源不足。在传统的使用范式中,用户必须预留成百上千台服务器来做一些高度并行但执行时间短的任务,并且必须为每台服务器付费,即使有些服务器已经不工作了。以阿里云的serverless产品——函数计算为例,它可以完美解决你以上所有的顾虑:如果你的任务本身计算量不是很大,但是有大量的并发任务请求需要并行处理,比如如多媒体文件处理和文档转换等;任务本身计算量大,需要快速处理单个任务,也可以支持多个任务的并行处理。在这种场景下,用户唯一关心的是:你的任务可以拆分拆解,子任务可以并行处理。一个需要一个小时才能完成的长任务可以分解为360独立的任务。10秒长的子任务并行处理,因此以前需要一个小时的任务现在可以在10秒内完成。由于采用现收现付的模式,完成的计算量与成本相差无几。但是在传统模式下,因为预留资源,肯定会有浪费,你需要承担浪费的成本。接下来将详细阐述Serverless在大规模数据处理中的实践。极限弹性缩放应对计算波动在介绍相关的大规模数据处理实例之前,这里简单介绍一下函数计算。一、函数计算简介开发者使用编程语言来编写应用程序和服务。函数计算支持的开发语言请参考开发语言列表;开发者上传应用到函数计算;触发函数执行:触发方式包括OSS、API网关、日志服务、表存储和函数计算API、SDK等;动态扩容响应请求:函数计算可以根据用户请求自动扩容,这个过程对你和你的用户都是透明的;按函数实际执行时间计费:函数执行后,可通过账单查看执行费用,计费粒度精确到100毫秒。至此,你可以大致了解函数计算是如何工作的,然后用一个大量视频并行转码的案例来说明:一般都是中心化的,你希望这些视频可以快速转码,让客户可以快速看到视频播放。比如在当前疫情下,在线教育产生的课程数量激增,上课高峰时间普遍为10点、12点、16点、18点。上传视频是一种普遍而普遍的需求。2、弹性高可用的音视频处理系统OSS触发器如上图所示。当用户上传视频到OSS时,OSS触发器自动触发函数执行,函数计算自动扩容。执行环境中的函数逻辑调用FFmpeg进行视频转码,并将转码后的视频保存回OSS。消息触发器如上图所示。应用程序只需发送一条消息,即可自动触发函数执行音视频处理任务。视频保存回OSS。直接手动调用SDK进行音视频处理任务。以python为例,大致如下:python#-*-coding:utf-8-*-importfc2importjsonclient=fc2.Client(endpoint="http://123456.cn-hangzhou.fc.aliyuncs.com",accessKeyID="xxxxxxxx",accessKeySecret="yyyyyy")#选择同步/异步调用resp=client.invoke_function("FcOssFFmpeg","transcode",payload=json.dumps({"bucket_name":"test-bucket","object_key":"video/inputs/a.flv","output_dir":"video/output/a_out.mp4"})).dataprint(resp)从上面我们也可以看出触发的方式有很多种函数执行。同时通过简单配置SLS日志,快速实现灵活、高可用、按量付费的音视频处理系统,同时提供免费运维。、具体业务数据可视化、强大的自定义监控告警等超强功能仪表盘。已经落地的音视频案例包括UC、语雀、丽屏设计之家、虎扑等几家领先的在线教育客户。其中部分客户在高峰期灵活使用10000多核的CPU计算资源,并行处理视频达到1700+,同时提供了非常高的性价比。任务分治,并行加速将任务分治的思想应用到函数计算上很有意思。这是一个例子。比如你有一个20G的1080P高清大视频需要转码,即使你用的是高端机,所需时间可能还是以小时来衡量。如果中间出现问题导致转码中断,只能重启,重复转码过程。如果用分治+函数计算的思路,将转码过程演变成sharding->paralleltranscodingsharding->mergingshards,这样就可以解决上面提到的两个痛点:sharding和compositesharding内存级拷贝,需要的计算量非常少,真正消耗计算量大的转码拆分成很多子任务并行处理。在该模型中,一个片段的最大转码时间基本等于整个大视频的转码时间;你只需要重试这个段的转码,不需要推翻整个大任务重新开始。通过合理分解大任务,使用函数计算,编写少量代码,即可快速完成一个高弹性、高可用、并行加速、按需付费的大规模数据处理系统。在介绍这个方案之前,先简单介绍下Serverless的工作流程。无服务器工作流可以有组织地组织功能和其他云服务和自建服务。一、ServerlessWorkflow简介ServerlessWorkflow(无服务器工作流)是一种完全托管的云服务,用于协调多个分布式任务的执行。在Serverless工作流中,你可以对分布式任务进行顺序、分支、并行等排列,Serverless工作流会按照设定的步骤可靠地协调任务执行,跟踪每个任务的状态转换,并在必要时执行用户定义的重试逻辑以确保工作流成功完成。Serverless工作流简化了开发和运行业务流程所需的任务协调、状态管理和错误处理等繁琐工作,让您专注于业务逻辑开发。下面以一个大视频快速转码的案例来说明Serverless的工作编排功能,实现大计算任务的分解,子任务的并行处理,最终达到快速完成单个大任务的目的。2、大视频快速多目标格式转码如上图所示,假设用户上传一个mov格式的视频到OSS,OSS触发器自动触发函数执行,函数调用FnF执行,FnF同时执行一种或多种格式。转码(由template.yml中的DST_FORMATS参数控制),假设同时配置了mp4和flv格式的转码。一个视频文件可以同时转码为多种格式,并进行各种其他自定义处理,如添加水印处理或更新信息到数据库后处理;当多个文件同时上传到OSS时,函数计算会自动伸缩,并行处理多个文件,每个文件转码成多种格式也是并行的;结合NAS+视频切片,可以解决超大视频的转码。对于每个视频,先进行分片处理,然后分片并行转码。最后,通过设置合理的分片时间,可以大大加快较大视频的转码速度;fnf可以跟踪每一步的执行情况,可以自定义每一步的重试,提高任务系统的健壮性,比如:在任务分工和并行加速的具体情况下,上面分享的retry-example是CPU密集型的任务分解,但也可以进行IO密集型任务分解。比如这个需求:上海地区一个20G的大OSSbucket文件秒级传回杭州的OSSBucket。这里也可以采用分而治之的思想。Master函数收到传输任务后,将超大文件的分片范围分配给各个Worker子函数。所有子Worker运行完毕后,该函数提交合并分片请求,完成整个转储任务。具体可以参考:利用函数计算多实例并发实现大文件的秒级转储总结本文讨论了Serverless服务平台如何让你的应用快速横向扩展,让并行处理更有效,并给出了具体的实际案例,无论是CPU密集型还是IO密集型场景,函数计算+Serverless都可以完美解决你的以下顾虑:不用为闲置资源付费,也不用担心资源不够用预留计算资源。计算任务需要快速处理。更好的任务流程跟踪完善的监控告警、免运维、业务数据可视化等。本文只是serverless音视频处理的一个例子。展示了函数计算和Serverless工作流在离线计算场景下的能力和独特优势。在人工智能、基因计算、科学模拟等大规模数据处理实践中,我们可以通过发散的方式来拓展Serverless的边界。希望这篇文章能够吸引你,开启你的Serverless精彩之旅。