MaxCompute 入门必知
一、什么是MaxCompute?
大数据计算服务(MaxCompute,原名ODPS)是一种快速、完全托管的EB级数据仓库解决方案。
随着数据收集手段不断丰富,行业数据大量积累,数据规模已增长到了传统软件行业无法承载的海量数据(百TB、PB、EB)级别。MaxCompute致力于批量结构化数据的存储和计算,提供海量数据仓库的解决方案及分析建模服务。
由于单台服务器的处理能力有限,海量数据的分析需要分布式的计算模型。分布式的计算模型对数据分析人员要求较高且不易维护。数据分析人员不仅需要了解业务需求,同时还需要熟悉底层分布式计算模型。MaxCompute为您提供完善的数据导入方案以及多种经典的分布式计算模型,您可以不必关心分布式计算和维护细节,便可轻松完成大数据分析。
二、概述与产品特点
1、采用分布式架构,规模可以根据需要平行扩展
2、自动存储容错机制,保障数据高可靠性
3、所有计算在沙箱中运行,保障数据高安全性
4、以 RESTful API 的方式提供服务
5、支持高并发、高吞吐量的数据上传下载
6、提供离线计算、机器学习两类模型及计算服务
7、支持基于 SQL、MapReduce、Graph、MPI 等多种编程模型的数据处理方式
8、支持多租户,多个用户可以协同分析数据
9、支持基于 ACL 和 Policy 的用户权限管理,可以配置灵活的数据访问控制策略,防止数据越权访问
三、主要应用场景
日志分析、机器学习、数据仓库、数据挖掘、用户画像、数据化运营、商业智能等。
四、MaxCompute 系统架构
MaxCompute系统架构由四部分组成,分别是客户端、接入层 、逻辑层及存储与计算层 。
(1)ODPS客户端
主要包括Rest API、SDK、CLT和IDE四种形式,具体说明如下:
Rest API:ODPS以 RESTful API的方式提供离线数据处理服务;
SDK:对ODPS RESTful API的封装,目前有Java、Python等版本的实现;
CLT (Command Line Tool):运行在Window/Linux下的客户端工具,通过CLT可以提交命令完成Project管理、DDL、DML等操作;
IDE:ODPS提供了上层可视化ETL/BI工具,用户可以基于工具完成数据同步、任务调度、报表生成等常见操作。
(2)接入层
提供HTTP服务、负载均衡、用户认证和服务层面的访问控制。
(3)逻辑层
又称作控制层,是ODPS的核心部分。实现用户空间和对象的管理、命令的解析与执行逻辑、数据对象的访问控制与授权等功能。包括Worker、Scheduler和Executor三个角色:
Worker处理所有RESTful请求,包括用户空间(project)管理操作、资源(resource)管理操作、作业管理等,对于SQL DML、MR等启动Fuxi任务的作业,会提交Scheduler进一步处理。
Scheduler负责instance的调度,包括将instance分解为task、对等待提交的task进行排序、以及向计算集群的Fuxi master询问资源占用情况以进行流控。
Executor负责启动SQL/MR task,向计算集群的Fuxi master提交Fuxi任务,并监控这些任务的运行。
ODPS中的元数据存储在OTS中,元数据主要包括用户空间元数据、Table/Partition Schema、ACL、Job元数据、安全体系等。
(4)计算层
飞天内核(Apsara Core),运行在和控制层相互独立的计算集群上。包括Pangu(分布式文件系统)、Fuxi(资源调度系统)、Nuwa(分布式协同服务)、Shennong(监控模块)等。
五、MaxCompute 作业流程
MaxCompute作业中涉及到的相关概念如下所示。
1. MaxCompute instance:代表一个MaxCompute job(没有定义job就是匿名job)的实例。
一个 MaxCompute job可以包含多个MaxCompute task,所以一个MaxCompute instance可以提交多个sql或者mr,并指定是并行执行还是串行执行。由于job不常用,因此这种用法也比较少,绝大多数情况下是一个instance包含一个task。
2.MaxCompute task:代表一个具体的任务,目前有sql/mr/admin/lot/xlib等近20种类型,每个类型任务执行的逻辑差别很大。同一个instance下不同的task根据task_name进行区分。MaxComputetask是在控制集群上运行的,对于较为简单的修改meta的操作,在控制集群上可以完成整个的生命周期;对于计算任务,则需要向计算集群提交fuxijob。
3.Fuxi job:是任务调度系统模块提供的一种计算模型(与之对应的是fuxiservice),表示能执行完成的任务(service表示常驻进程)。Fuxijob支持DAG调度,每一个job都会有一个对应的jobmaster,用于进行这个job下资源的调度。对于sql来说,fuxijob又分为offlinejob和onlinejob(由servicemode演变而来)。其中,onlinejob也被称为准实时任务,进程是常驻系统的,有任务时就执行,可以减少启停时间,提高处理速度。MaxCompute的task可以向多个计算集群提交任务,fuxijob的主键是clustername+jobname。任务调度系统提交job的jsonplan以及任务结束后的jobstatus会被保存在飞天分布式文件系统上。
4.Fuxi task:是fuxijob下的一个概念,与MaxComputetask类似,不同的task代表不同的执行逻辑。fuxi的task之间可以链接成pipes,共同完成一段复杂的逻辑。
5.Fuxi instance:指的是fuxitask的instance,是任务调度系统调度的最小单位。一个task在实际执行过程中,会被切分为许多逻辑单元并行处理,提高处理速度。不同的instance的执行逻辑是相同的,但输入输出数据不同。
6.Fuxi worker:是任务调度系统底层的一个概念,一个worker代表一个操作系统的进程,多个fuxiinstance可以复用一个worker,一个worker同时只能处理一个instance。说明说InstanceID:MaxCompute作业的唯一标识,在调查问题时非常常用,根据Projectname和InstanceID可以构造当前instance的logview。Servicemaster/Jobmaster:Tpye类型分别为service和job的master节点,负责进行资源申请和调度,为worker创建工作计划并监控worker的生命周期。MaxCompute存储与计算层为阿里云自主知识产权的云计算平台的核心构件,是飞天操作系统内核,运行在和控制集群独立的计算集群上。
提交作业(简易流程):
- 提交一个SQL语句,发送 RESTful 请求给HTTP服务器
- HTTP 服务器做用户认证。认证通过后,请求就会以 Kuafu通信协议方式发送给 Worker。
- Worker判断该请求作业是否需要启动Fuxi Job。如果不需要,本地执行并返回结果。如果需要,则生成一个 instance, 发送给 Scheduler。
- Scheduler把instance信息注册到 OTS,将其状态置成 Running。Scheduler 把 instance 添加到 instance 队列。
- Worker把 Instance ID返回给客户端。
运行作业(简易流程):
- Scheduler会把instance拆成多个Task,并生成任务流DAG图。
- 把可运行的Task 放入到优先级队列TaskPool中。
- Scheduler 有一个后台线程定时对TaskPool 中的任务进行排序。Scheduler 有一个后台线程定时查询计算集群的资源状况。Executor在资源未满的情况下,轮询TaskPool,请求Task。Scheduler判断计算资源。若集群有资源,就将该Task发给Executor。
- Executor调用SQL Parse Planner,生成SQL Plan。Executor 将 SQL Plan 转换成计算层的 FuXi Job 描述文件。Executor 将该描述文件提交给计算层运行,并查询 Task 执行状态。Task 执行完成后,Executor更新 OTS 中的 Task信息,并汇报给Scheudler。
- Schduler 判断 instance 结束,更新 OTS 中 instance 信息,置为 Terminated。