什么是ODPS择份?
開發(fā)數(shù)據(jù)處理服務(wù)(Open Data Processing Service徽职,簡稱ODPS)湾宙,2016年后更名MaxComputer。ODPS是一種由阿里云自主研發(fā)久锥,針對(duì)TB/PB級(jí)數(shù)據(jù)、實(shí)時(shí)性要求不高的分布式處理服務(wù)异剥。主要服務(wù)于批量結(jié)構(gòu)化數(shù)據(jù)的存儲(chǔ)和計(jì)算瑟由,可以提供海量數(shù)據(jù)倉庫的解決方案以及針對(duì)大數(shù)據(jù)的分析建模服務(wù)。
ODPS的組成對(duì)象
項(xiàng)目空間(Project)
項(xiàng)目空間是MaxComputer 的基本組織單元冤寿,它類似于傳統(tǒng)數(shù)據(jù)庫中的Database或者Schema的概念歹苦,是進(jìn)行多用戶隔離和訪問控制的主要邊界。一個(gè)用戶可以同時(shí)擁有多個(gè)項(xiàng)目空間的權(quán)限督怜。通過安全授權(quán)暂氯,可以在一個(gè)項(xiàng)目空間中訪問另一個(gè)項(xiàng)目空間中的對(duì)象。
表(Table)
表是MaxCompute的數(shù)據(jù)存儲(chǔ)單元亮蛔。它在邏輯上也是由行和列組成的二維結(jié)構(gòu)痴施,每行代表一條記錄,每列表示相同數(shù)據(jù)類型的一個(gè)字段究流,一條記錄可以包含一個(gè)或者多個(gè)列辣吃,各個(gè)列的名稱和類型構(gòu)成這張表的Schema。
MaxComputer的表格分為兩種類型:外部表及內(nèi)部表芬探。
內(nèi)部表的所有數(shù)據(jù)都被存儲(chǔ)在MaxComputer中神得。表中的列可以是MaxCompute支持的任意數(shù)據(jù)類型(Bigint、Double偷仿、String哩簿、 Boolean和Datetime)。MaxCompute中的各種類型計(jì)算任務(wù)(輸入酝静、輸出)的操作對(duì)象都是表节榜。用戶可以創(chuàng)建、刪除表以及向表中導(dǎo)入數(shù)據(jù)别智。
對(duì)于外部表宗苍,MaxCompute并不真正持有數(shù)據(jù),表格的數(shù)據(jù)可以存放在OSS中。MaxCompute僅會(huì)記錄表格中的Meta信息讳窟。用戶可以通過MaxCompute的外部表機(jī)制處理OSS上的非結(jié)構(gòu)化數(shù)據(jù)让歼,例如:視頻、音頻丽啡、基因谋右、氣象、地理信息等补箍。其主要流程包括:
- 將數(shù)據(jù)上傳至OSS倚评;
- 在RAM產(chǎn)品中授予MaxCompute服務(wù)讀取OSS數(shù)據(jù)權(quán)限。
- 自定義Extractor:用戶讀取OSS上特殊格式數(shù)據(jù)馏予。目前天梧,MaxCompute默認(rèn)提供CSV格式的Extractor,并提供視頻格式數(shù)據(jù)讀取的代碼樣例霞丧。
- 創(chuàng)建外部表呢岗;
- 執(zhí)行SQL作業(yè)分析數(shù)據(jù);
注意:目前MaxCompute僅支持讀取外部數(shù)據(jù)蛹尝,即讀取OSS數(shù)據(jù)后豫,不支持向外部寫入數(shù)據(jù);
分區(qū)(Partition)
分區(qū)表指的是在創(chuàng)建表時(shí)指定的分區(qū)空間突那,即指定表內(nèi)的某幾個(gè)字段作為分區(qū)列挫酿。大多數(shù)情況下,用戶可以將分區(qū)類比為文件系統(tǒng)下的目錄愕难。MaxCompute將分區(qū)列每一個(gè)值作分區(qū)(目錄)早龟。用戶可以指定多級(jí)分區(qū),即將表的多個(gè)字段作為表的分區(qū)猫缭,分區(qū)之間正如多級(jí)目錄的關(guān)系葱弟。在使用數(shù)據(jù)時(shí)如果指定了需要訪問的分區(qū)名稱,則只會(huì)讀取相應(yīng)的分區(qū)猜丹,避免掃描全表芝加,提高處理效率,降低費(fèi)用射窒。
create table src (key string, value bigint) partitioned by (pt string);
目前藏杖,MaxCompute僅承諾String分區(qū)。且目前最多支持六級(jí)分區(qū)
自定義函數(shù)(User Defined Functuon脉顿,簡稱UDF)
MaxCompute為用戶提供了SQL計(jì)算功能蝌麸,用戶可以在MaxCompute SQL中使用系統(tǒng)的內(nèi)建函數(shù)完成一定的計(jì)算和計(jì)數(shù)功能。但是當(dāng)內(nèi)建函數(shù)無法滿足要求時(shí)弊予,用戶可以使用MaxCompute提供的Java編程接口開發(fā)自定義函數(shù)UDF祥楣,UDF又可以進(jìn)一步分為標(biāo)量值函數(shù)UDF、自定義聚合函數(shù)UDAF和自定義表值函數(shù)UDTF三種汉柒。
資源(Resource)
資源是MaxCompute的特有概念误褪。用戶如果想使用MaxCompute的自定義函數(shù)(UDF)或者M(jìn)apReduce功能需要依賴資源來完成。
例如用戶在編寫好UDF后碾褂,需要將編譯好的jar包以資源的形式上傳到ODPS兽间。運(yùn)行這個(gè)UDF時(shí),MaxCompute會(huì)自動(dòng)下載這個(gè)Jar包正塌,獲取用戶代碼嘀略,運(yùn)行UDF而無需用戶干預(yù)。上傳Jar包的過程就是在MaxCompute上創(chuàng)建資源的過程乓诽。
任務(wù)(Task)和作業(yè)(Job)
任務(wù)是ODPS的基本計(jì)數(shù)單元帜羊。SQL以及MapReduce功能都是通過任務(wù)完成的。
對(duì)于用戶提交的大多數(shù)任務(wù)鸠天,特別是計(jì)算型任務(wù)讼育,MaxCompute會(huì)將其進(jìn)行解析,得出任務(wù)的執(zhí)行計(jì)劃稠集。執(zhí)行計(jì)劃是由具有依賴關(guān)系的多個(gè)執(zhí)行階段(Stage)構(gòu)成的奶段。目前,執(zhí)行計(jì)劃邏輯上可以被看作一個(gè)有向圖剥纷,圖中的點(diǎn)是各個(gè)執(zhí)行階段痹籍,邊是各個(gè)執(zhí)行階段之間的依賴關(guān)系。在同一個(gè)執(zhí)行階段內(nèi)晦鞋,會(huì)有多個(gè)進(jìn)程蹲缠,也稱之為Worker,共同完成該執(zhí)行階段的計(jì)算工作悠垛。同一個(gè)執(zhí)行階段內(nèi)的不同Worker之間只是處理的數(shù)據(jù)不同吼砂,執(zhí)行邏輯完成相同。
作業(yè)(Job)是由一個(gè)或者多個(gè)Task以及表示其執(zhí)行次序關(guān)系的工作流(Workflow)鼎文,工作流是個(gè)有向無環(huán)圖渔肩。當(dāng)一個(gè)作業(yè)被提交到系統(tǒng)中執(zhí)行時(shí),該作業(yè)就會(huì)擁有一個(gè)作業(yè)實(shí)例(Instance)拇惋。另一方面周偎,部分MaxCompute任務(wù)并不是計(jì)算型任務(wù)。例如DDL SQL語句撑帖,這些任務(wù)本質(zhì)上只需要讀取修改MaxCompute的元數(shù)據(jù)蓉坎,因此這些任務(wù)不能被解析出執(zhí)行計(jì)劃。
工作流
工作流是一個(gè)DAG圖(有向無環(huán)圖)胡嘿,其描述了作業(yè)中多個(gè)節(jié)點(diǎn)之間的邏輯(依賴關(guān)系)和規(guī)則(運(yùn)行約束)蛉艾。
節(jié)點(diǎn)
節(jié)點(diǎn)屬于工作流的子對(duì)象,也稱為任務(wù),是大數(shù)據(jù)開發(fā)平臺(tái)數(shù)據(jù)處理和分析過程最基本單元勿侯,每個(gè)任務(wù)對(duì)應(yīng)DAG圖中的一個(gè)節(jié)點(diǎn)拓瞪,其可以是一個(gè)SQL Query、命令和MapReduce程序助琐。
依賴關(guān)系
依賴關(guān)系是描述兩個(gè)或多個(gè)節(jié)點(diǎn)/工作流之間的語義連接關(guān)系祭埂,其中上游節(jié)點(diǎn)/工作流運(yùn)行可以影響下流節(jié)點(diǎn)/工作流的運(yùn)行狀態(tài),反之則不成立兵钮。
實(shí)例
在阿里與大數(shù)據(jù)開發(fā)平臺(tái)中蛆橡,節(jié)點(diǎn)任務(wù)在執(zhí)行時(shí)會(huì)被實(shí)例化,并以O(shè)DPS實(shí)例的方式存在掘譬。實(shí)例會(huì)經(jīng)歷未運(yùn)行泰演、等待時(shí)間/等待資源、運(yùn)行中葱轩、成功/失敗幾個(gè)狀態(tài)睦焕。
ODPS的基礎(chǔ)構(gòu)架
MaxCompute構(gòu)架分為四層,分別是客戶端酿箭、接入層复亏、邏輯層和計(jì)算層:
【客戶端】
ODPS以RESTful API方式對(duì)外提供服務(wù),用戶可以通過不同的方式來使用ODPS的服務(wù)缭嫡,包括直接通過RESTful API請(qǐng)求訪問缔御、ODPS SDK、ODPS CLT(Command Line Tool)妇蛀、Java集成開發(fā)環(huán)境和管理控制臺(tái)等耕突。
【接入層】
【邏輯層】
邏輯層又稱為控制層,是ODPS的核心部分评架【熳拢可以認(rèn)為是ODPS的大腦,負(fù)責(zé)項(xiàng)目空間纵诞、對(duì)象管理上祈、授權(quán)管理、命令解析浙芙、元數(shù)據(jù)五部分登刺。
請(qǐng)求處理器(Worker)
負(fù)責(zé)處理所有RESTful請(qǐng)求,本地處理一些作業(yè)嗡呼,提交分布式作業(yè)給調(diào)度器纸俭。
本地能處理的作業(yè)包括:用戶空間、表南窗、資源揍很、任務(wù)等的管理郎楼。
需要提交給調(diào)度器的作業(yè)包括:SQL、MR等分布式計(jì)算的任務(wù)窒悔。
調(diào)度器(Scheduler)
調(diào)度器負(fù)責(zé)Instance調(diào)度以及查詢計(jì)算集群的資源情況呜袁。
處理Instance的任務(wù)包括:
維護(hù)一個(gè)Instance列表。
把Instance分解成Task
生成Task的工作流(DAG 圖)
把可運(yùn)行的Task放到TaskPool中
定時(shí)對(duì)該優(yōu)先級(jí)隊(duì)列進(jìn)行排序蛉迹。
作業(yè)執(zhí)行管理器(Executor)
負(fù)責(zé)向TaskPool申請(qǐng)Task傅寡,生成任務(wù)描述文件提交給計(jì)算層放妈,監(jiān)控并反饋狀態(tài)給調(diào)度器北救。
作業(yè)執(zhí)行器的運(yùn)行細(xì)節(jié):
判斷自身資源是否充足。
主動(dòng)輪詢TaskPool,請(qǐng)求下一個(gè)Task芜抒,生成計(jì)算層的分布式作業(yè)描述文件珍策,提交給計(jì)算層。
監(jiān)控這些任務(wù)的運(yùn)行狀態(tài)宅倒,定時(shí)把狀態(tài)匯報(bào)給調(diào)度器攘宙。
【計(jì)算層】
計(jì)算層開始真正執(zhí)行計(jì)算任務(wù)。
Pangu(盤古)文件系統(tǒng)存儲(chǔ)文件的格式如下:
一條ODPS SQL的執(zhí)行
權(quán)限管理
角色隔離
組織管理員
指組織的管理者拐迁,可新建計(jì)算引擎蹭劈、新建項(xiàng)目空間、新建調(diào)度資源线召、添加組織成員铺韧、為組織成員賦予組織管理員角色、配置數(shù)據(jù)類目等缓淹。
項(xiàng)目管理員
指項(xiàng)目空間的管理者哈打,可針對(duì)項(xiàng)目空間基本屬性、數(shù)據(jù)源讯壶、當(dāng)前項(xiàng)目空間計(jì)算引擎配置和項(xiàng)目成員進(jìn)行管理料仗。并為組織成員賦予項(xiàng)目管理員、開發(fā)伏蚊、運(yùn)維立轧、部署、訪客角色躏吊。
開發(fā)
開發(fā)角色用戶能夠創(chuàng)建工作流氛改、腳本文件、資源UDF颜阐、新建表平窘,同時(shí)可以創(chuàng)建發(fā)布包,但不能執(zhí)行發(fā)布操作凳怨。
運(yùn)維
項(xiàng)目空間但運(yùn)維人員瑰艘,由項(xiàng)目管理員/項(xiàng)目所有者分配運(yùn)維權(quán)限是鬼;擁有發(fā)布及線上運(yùn)維的操作權(quán)限,但無數(shù)據(jù)開發(fā)的操作權(quán)限紫新。
部署
部署角色與運(yùn)維角色相似均蜜,但是其沒有線上運(yùn)維操作權(quán)限。
訪客
訪客角色的用戶只具備查看權(quán)限芒率,而無權(quán)限進(jìn)行編輯工作流和代碼等囤耳。
角色管理
角色(role)是一組訪問權(quán)限的集合。
Owner:當(dāng)一個(gè)用戶創(chuàng)建了一個(gè)項(xiàng)目偶芍,他便自動(dòng)成為該項(xiàng)目的Owner充择。任何沒有被項(xiàng)目的Owner授權(quán)的人都無法訪問該項(xiàng)目。
如果Alice創(chuàng)建了一個(gè)項(xiàng)目WonderLand匪蟀,然后她要授權(quán)Bob訪問該項(xiàng)目的一些對(duì)象椎麦,那么:
首先,Bob要有一個(gè)合法的云賬號(hào)材彪。
其次观挎,Alice要把Bob的云賬號(hào)加到項(xiàng)目中來。
最后段化,賦予一些對(duì)象的權(quán)限給Bob嘁捷。
當(dāng)Alice要禁止Bob訪問該項(xiàng)目時(shí),則直接將其云賬號(hào)從項(xiàng)目中移除即可显熏,前提是Bob沒有被賦予任何角色雄嚣。
值得注意的是,Bob雖然被移除來項(xiàng)目佃延,但他之前被授予但權(quán)限仍保留在項(xiàng)目中现诀。一旦被Alice再次加入該項(xiàng)目,原有權(quán)限會(huì)被自動(dòng)激活履肃。
缺省角色(Admin):擁有該角色權(quán)限的用戶仔沿,可以訪問項(xiàng)目空間中所有對(duì)象,不能設(shè)定項(xiàng)目空間的安全配置和修改項(xiàng)目空間的鑒權(quán)模型尺棋;能進(jìn)行用戶與角色管理封锉,但是不能修改將Admin角色的權(quán)限或?qū)dmin角色賦給別的用戶,只能刪除沒有被使用的角色膘螟。
授權(quán)
授權(quán)有主體(Subject)成福、客體(Object)和操作(Action)三要素。
授權(quán)有ACL(基于對(duì)象的授權(quán))和Policy(基于策略的授權(quán))兩種方法荆残。
查看權(quán)限
【查看當(dāng)前用戶的權(quán)限】
show grants;
【查看指定用戶的權(quán)限】
show grants for <username>;
【查看指定角色的權(quán)限】
describe role <rolename>;
【查看指定對(duì)象的授權(quán)】
show acl for <objectName>[on type <objecttype>];
ACL授權(quán)的語法
GRANT <privileges> ON <object> TO <subject>;
REVOKE <privileges> ON <object> FROM <subject>;
數(shù)據(jù)保護(hù)機(jī)制
設(shè)置ProjectProtection:數(shù)據(jù)只能流入奴艾,不能流出。默認(rèn)時(shí)内斯,ProjectProtection不能被設(shè)置蕴潦,需要手工開啟像啼。
ProjectProtection=true
如何在項(xiàng)目保護(hù)狀態(tài)下,進(jìn)行合規(guī)的數(shù)據(jù)流出操作潭苞。
辦法1:在設(shè)置項(xiàng)目保護(hù)(ProjectProtection)的同時(shí)忽冻,附加一個(gè)例外策略(exception)
set ProjectProtection=true exception <policyFile>;
辦法2:將兩個(gè)相關(guān)的項(xiàng)目空間設(shè)置為互信(TrustedProject),則數(shù)據(jù)的流向?qū)⒉粫?huì)被視為違規(guī)此疹。
add trustedproject=SecretGarden;
項(xiàng)目空間的鑒權(quán)模型
ODPS支持多種正交的授權(quán)機(jī)制僧诚,用戶可通過設(shè)置下列參數(shù)來定制項(xiàng)目空間的鑒權(quán)模型。
security.CheckPermissionUsingACL --> 激活/凍結(jié)ACL授權(quán)機(jī)制蝗碎,默認(rèn)為True
security.CheckPermissionUsingPolicy --> 激活/凍結(jié)Policy授權(quán)機(jī)制湖笨,默認(rèn)為True
security.ObjectCreatorHasAccessPermission -->允許/禁止對(duì)象創(chuàng)建者默認(rèn)擁有訪問權(quán)限,默認(rèn)為True衍菱。
security.ObjectCreatorHasGrantPermission --> 允許/禁止對(duì)象創(chuàng)建者默認(rèn)擁有授權(quán)權(quán)限赶么,默認(rèn)為True肩豁。
security.LabelSecurity --> 開啟/關(guān)閉LabelSecurity安全策略脊串,默認(rèn)為False。
ProjectProtection -->開啟清钥,關(guān)閉項(xiàng)目的數(shù)據(jù)空間保護(hù)機(jī)制琼锋,默認(rèn)為False。
【查看當(dāng)前鑒權(quán)模型】
show SecurityConfiguration;
數(shù)據(jù)的敏感等級(jí)分類
Project Owner需要定義明確的數(shù)據(jù)敏感等級(jí)和訪問許可等級(jí)劃分標(biāo)準(zhǔn)祟昭,默認(rèn)時(shí)所有用戶的訪問許可等級(jí)為0級(jí)缕坎,數(shù)據(jù)安全默認(rèn)等級(jí)默認(rèn)為0級(jí)。
LabelSecurity對(duì)敏感數(shù)據(jù)的粒度可以支持列級(jí)別篡悟,管理員可以對(duì)表的任何列設(shè)置敏感度標(biāo)記(Label)谜叹,一張表可以由不同等級(jí)的敏感數(shù)據(jù)列所組成。
LabelSecurity基本操作
【打開LabelSecurity安全機(jī)制開關(guān)】
set security.LabelSecurity=<true|false>;
【設(shè)置用戶安全許可標(biāo)簽】
set label<number> to user<username>;
【設(shè)置數(shù)據(jù)敏感等級(jí)標(biāo)簽】
set label<number> to table <tablename[(column_list)]>;
【顯示授權(quán)低級(jí)別用戶訪問高敏感數(shù)據(jù)】
grant label <number> on table <tablename>[(column_list)] to user <username>[with exp <days>];
【撤銷顯示授權(quán)】
revoke label on table <tablename>[(column_list)] from user<username>;
【清洗過期的顯示授權(quán)】
clear expired grants;
【查看一個(gè)用戶能訪問哪些敏感數(shù)據(jù)級(jí)】
show label[<level>] grants [for user <username>];
【查看一個(gè)敏感數(shù)據(jù)表能被哪些用戶訪問】
show label [<level>] grants on table <tablename>;
【用戶對(duì)指定表上列級(jí)別的Label授權(quán)】
show label [<level>] grants on table <tablename> for user <username>;
【包安裝者對(duì)包中敏感資源許可訪問級(jí)別】
allow project <pjname> to install package <pkname>[using label <n>];
1.LabelSecurity安全機(jī)制開關(guān)必須由owner打開搬葬,admin角色沒有此權(quán)限荷腊。
2.用戶的安全許可標(biāo)簽和文件敏感等級(jí)取值均為0到9,兩者相互對(duì)應(yīng)急凰。
3.顯示設(shè)置的列的敏感等級(jí)優(yōu)先級(jí)高于表的敏感等級(jí)女仰,和順序、等級(jí)高低無關(guān)抡锈。
4.設(shè)置包時(shí)疾忍,若省略[using label<number>],則默認(rèn)級(jí)別為0級(jí)床三,即只可以訪問非敏感數(shù)據(jù)一罩。
5.跨項(xiàng)目訪問敏感數(shù)據(jù)時(shí),包安裝者的項(xiàng)目空間中的所有用戶都將使用此許可的訪問級(jí)別撇簿。
set label 1 to label t1;
set label 2 to table t1(id,name);
set label 3 to table t1;