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。