MaxCompute2.0新功能介紹
摘要:在過去的兩年內,MaxCompute進行了翻天覆地的重構,從1.0版本全面升級到了2.0版本。而大家或許對於MaxCompute 2.0的一些新特性並不瞭解,在本文中,MaxCompute技術專家秋鵬就為大家詳細介紹MaxCompute 2.0的新特性。
本文主要圍繞以下三個方面進行分享:
MaxCompute 2.0簡介
MaxCompute 2.0 vs 1.0
MaxCompute 2.0 vs 競品
一、MaxCompute 2.0簡介
MaxCompute之所以要進行重構是因為MaxCompute 1.0上存在很多問題,在MaxCompute 2.0的概念提出前,MaxCompute就已經在線上服務內部和外部使用者一段時間了,並且也獲得了一些積極的反饋。但是MaxCompute 1.0中也存在一些問題需要解決,這些問題大概分為兩個部分。首先,一些競爭對手比如Hive、Spark等用了很多MaxCompute還沒有用上的新功能,他們能夠達到比MaxCompute更加高效的效能,這就迫使MaxCompute嘗試增加新的功能,並且優化自身引擎,解決已知的問題。在引入新功能的過程中,發現需要對於MaxCompute引擎進行重構,使得引擎能夠支援新功能。此外,MaxCompute 1.0在使用者開發體驗上有待提升,相比於Hive以及SQL/">MySQL存在一定差距,從原有系統向MaxCompute遷移存在一定的不相容問題,這也制約了MaxCompute對於外部使用者的吸引力。此外,在MaxCompute 1.0的開發過程中缺乏完善並且好用的整合開發環境,使得使用者開發較為困難。

因此,基於1.0版本所存在的問題,MaxCompute就進行了一系列的改進,並提出了MaxCompute 2.0的概念。MaxCompute 2.0首先提出了三個重要的設計目標:強大的編譯器,包容的生態以及高效的引擎。首先,編譯器需要支援指令碼式語言,能夠讓使用者輕鬆編寫複雜邏輯,還需要能夠支援強大的IDE功能,比如實現錯誤實時提示以及程式碼填充等,從而提高使用者開發體驗。對於生態而言,需要使得MaxCompute的SQL支援標準SQL,還需要相容開源生態,使得使用者可以方便地將原有應用遷移到MaxCompute上。最後一點,還需要利用最新的分散式計算框架來優化執行引擎,從而使得執行的效率更高。

二、MaxCompute 2.0 vs 1.0
前面所講的更多的是站在系統層面進行分享,接下來將圍繞大家日常開發使用MaxCompute來進行分享,本部分主要將對比MaxCompute 2.0版本和1.0版本的區別所在。
編譯器
MaxCompute 2.0在編譯器上進行了完全重構,也進行了大量的優化,如圖所示列舉了部分關鍵點,比如所有編譯錯誤都會行列號資訊,這樣的中括號格式能夠方便IDE來實現各種各樣的自動化處理;第二個就是全新的error key,相比於之前的error code具有更高的可讀性;此外更重要的一點就是MaxCompute 2.0的編譯結果更可能是包含warning的,warning是編譯器在使用者的SQL裡面發現的有可能存在潛在問題的情況,而這些問題卻並不會影響使用者的SQL進一步編譯和執行,但是編譯器認為有必要將這些潛在問題提出來讓使用者改正。此外,MaxCompute 2.0編譯器非常重要的一點新功能就是其支援錯誤恢復,這裡的錯誤恢復指的是當碰到使用者錯誤的時候會嘗試去猜測使用者SQL的實際意圖,嘗試去將錯誤恢復出來繼續進行編譯,這樣的好處就是在同一次編譯中的多次錯誤會一次性地報出來,方便使用者修改。這一功能對於IDE而言是非常重要的,因為當用戶使用IDE來做語法檢查的時候會發現IDE能夠將整個指令碼中的所有錯誤同時標識出來。

資料型別
MaxCompute 2.0新增了很多資料型別,如下圖所示。可以看出,MaxCompute 1.0只支援了幾個有限的資料型別,這些資料型別其實在大多數場景下其實是夠用的,但是將應用從已有的開源系統上移植過來的時候就會顯得不足。而MaxCompute 2.0中更多的資料型別能夠支援更豐富的表達能力。此外,MaxCompute 2.0還增加了很多常量的定義,比如TINYINT、SMALLINT、DATETIME以及TIMESTAMP等。當然了,這裡也有兩點需要注意,一點就是使用新型別需要使用新型別需要set odps.sql.type.system.odps2=true; 或者開Hive相容。此外,還需要注意MaxCompute實際還支援CHAR型別和INTERVAL 型別,目前僅當開啟Hive相容模式下可用。

複雜型別
此外,MaxCompute 2.0還對於複雜型別進行了補充,支援了ARRAY、MAP以及STRUCT三種類型,並且這些複雜型別可以任意巢狀。MaxCompute 2.0對於複雜型別的定義、構造以及操作都進行了擴充,因此使用者可以很輕鬆地使用這些複雜型別來實現複雜的邏輯。

語法結構
MaxCompute 2.0相比於1.0增加了如下圖所示的很多語法結構。首先是Values表示式,其並不是MaxCompute原創的,在其他的SQL語言中也有,但是在MaxCompute 1.0中並沒有支援,這就導致在MaxCompute 1.0裡面構造一個簡單的資料是非常困難的。在MaxCompute 2.0中,因為支援了Values表示式,因此使用者可以直接在SQL裡面通過Values表示式來構造一個簡單的維表。此外,目前還可以在Select語句中省略from表示式,相當於Select一個一行的values。

第二個新增的語法叫做“Common Table Expression(CTE)”,簡單而言CTE可以讓使用者通過使用WITH語句將子查詢提前,而踢到前面的SubQuery可以被反覆使用,即所謂的Common Table,而且Common Table之間可以相互引用。此外一個新增的語法及時“SEMI/ANTI JOIN”,這兩個語法其實算是SQL標準的功能,SEMI JOIN的語義是當JOIN條件滿足的時候返回滿足條件的行,而ANTI JOIN與之前恰好相反,就是當JOIN條件滿足的時候就過濾掉滿足條件的行,保留不滿足條件的行返回。
MaxCompute 2.0還支援了更加豐富的子查詢表示式,在MaxCompute 1.0中只支援了IN的SubQuery表示式,而在MaxCompute 2.0則引入了兩種新表示式,一種是EXISTS表示式,其含義是當後面的表示式有結果返回時為TRUE,否則為FALSE;另一種叫做SCALA SubQuery,也就是當後面的子查詢能夠確定是一行一列的時候,子查詢可以當做標量使用,進而可以參與其他表示式的計算。此外,在MaxCompute 2.0子查詢中支援了correlated,這使得子查詢的結果不再是固定的值,而是會根據外部表的行進行改變。MaxCompute 2.0提供的另外一個重要功能就是“SELECT TRANSFORM”,該語法完全與Hive相容,其允許使用者使用第三方指令碼來處理資料。另外一個引入的新功能是“User Defined Type”,這是MaxCompute獨有的功能,這個功能非常好用,其允許使用者直接在SQL中嵌入第三方語言,目前只支援了Java。使用new就可以建立物件,可以直接呼叫物件公共方法和訪問公共屬性,而且整個JDK都可以直接使用,還可以通過設定odps.sql.session.resources引用第三方包。

MaxCompute 2.0還支援外表和非結構化儲存,簡單而言在MaxCompute 1.0裡面,使用者只能引用內部定義的表,比如建立表之後將資料上傳上去才能夠使用。而目前的過程完全可以利用外表來實現,使用者可以定義和建立一個外表,可以直接從外部資料來源讀取資料,這樣就省略了資料遷移的過程。而外部資料和內部資料的儲存肯定不一致,因此MaxCompute 2.0還引入了對於非結構化資料進行處理的機制,比如通過定義StorageHandler來處理非結構化儲存的序列化、反序列化以及讀寫過程。值得注意的是MaxCompute 2.0的外表在語法等方面完全相容Hive,因此Hive使用者可以非常輕鬆地向MaxCompute 2.0進行遷移。MaxCompute 2.0還提供了“CLUSTERED BY”功能,我們可以在建立表的過程中指定表按照某一列進行CLUSTERED BY,這將會為表建立一個聚集索引,能夠使使用者在查詢中利用索引進行優化,減少讀入的資料量。還有一個新功能就是“User Defined Join”,藉助此功能使用者可以自定義表的連線過程,原本的內建JOIN過程都可能會產生笛卡爾積結果,可能做了過多的爆炸式展開,而通過User Defined Join將會大大減少中間結果的產生。

指令碼模式
MaxCompute 2.0提供了指令碼模式功能,在指令碼模式下,使用者所提交的指令碼不再是以單條SQL為單位的,而是以整個指令碼為單位提交查詢,因此更適合複雜的查詢。此外,指令碼模式可以使用DDL語句,並且可以有多個不同的輸出,可以有多次insert into以及多個insert override等,所以指令碼模式能夠最大限度地幫助使用者編寫複雜的邏輯。雖然指令碼模式中,指令碼是按照一整個指令碼提交的,但是並不會逐條執行,而是將整個指令碼作為一個完整作業執行,其優點就是對於一些重複操作可以合併到一起。

引數化檢視
在MaxCompute 1.0版本的檢視定義中,並不允許傳遞引數,但是在2.0版本中則引入了引數化檢視功能,該功能允許使用者在定義VIVIEW時候定義引數,根據引數的不同使得VIEW的邏輯會出現一系列變化,這樣就能夠大大提升VIEW程式碼的重用能力。如果能夠設計得很好,那麼使用者的絕大部分邏輯都能通過VIEW基於過程的過程方式實現。

MaxCompute Studio
MaxCompute 2.0提供了對於IDE的強大支援,其在開始研發的過程中就伴隨這MaxCompute Studio的設計和實現了。而MaxCompute Studio也提供了一些非常重要的功能,比如作業監控、作業分析、實時錯誤提示以及智慧提示等。通過MaxCompute Studio,使用者可以非常直觀地監控作業的執行流程,幫助使用者直觀地掌控執行流程中的各個節點資訊;此外,MaxCompute Studio還提供了一系列分析工具,幫助使用者分析參與作業的各個節點的執行資訊等;此外,還提供了很多對於SQL開發的支援功能,比如使用者在MaxCompute Studio中做編輯的時候,就會把使用者的指令碼做本地編譯,並發現其中存在的問題,然後以圖形化方式報告給使用者;另外一個就是實現了上下文提示,提示功能非常智慧化,而這在開發指令碼的過程中也是非常有幫助的。

即將上線的功能
除了上述功能之外,MaxCompute 2.0版本中還有如下圖所示的很多即將上線的功能,比如GROUPING SETS和CUBE/ROLLUP、INTERSECT/EXCEPT、記憶體計算、Java Runtime與Local run、更完善的指令碼語言支援以及Table API支援等。

三、MaxCompute 2.0 vs 競品
Hive相容模式
最後與大家簡單介紹一下MaxCompute 2.0與其他競品的區別。之所以介紹這一點,是因為一些使用者期望從其他的產品上向MaxCompute 2.0進行遷移,希望能夠對於MaxCompute所支援的功能以及難度有一個直觀的瞭解。其實,MaxCompute 2.0對於Hive具有非常強的相容能力,當用戶通過設定“SET odps.sql.hive.compatible=true;”就可以開啟Hive相容模式。在相容模式下,不僅能夠相容Hive的語法結構,還能夠對於資料型別、語義以及UDF和StorageHandler進行相容。當開啟MaxCompute 2.0的相容模式,那麼在Hive上執行的應用就能夠非常方便地遷移到MaxCompute 2.0平臺上來。當然了,MaxCompute 2.0與Hive還存在一些在設計上的不相容的地方,比如某些操作和MaxCompute概念不符合,比如database、schema等,因此沒有支援;在許可權管理上,某些方式和MaxCompute不符,如column的許可權管理,沒有支援。MaxCompute的resource是全域性的,因此某些操作,如CREATEFUNCTION需要指定resource。而這些不相容的地方,對於使用者也沒有太大影響,因此對於使用者而言,從Hive向MaxCompute進行遷移是非常方便的。而在MaxCompute在未來也將會支援任何符合SQL標準的語法。

MaxCompute 2.0核心優勢
MaxCompute 2.0除了在相容方面做得比較好之外,還存在著很多的核心優勢。首先,最大的優勢就是MaxCompute是企業級服務,能夠提供7*24小時不間斷服務的系統級平臺,會有專業人員對於問題進行支援。MaxCompute 2.0具有包容的生態圈,大家可以從各個平臺上遷移過來,從而實現完整統一的計算系統。此外,MaxCompute 2.0所提供的更豐富的擴充套件能力能夠讓使用者更方便地擴充套件SQL能力。指令碼模式和引數化檢視能夠讓使用者用指令碼方式開發複雜的邏輯,從而實現複雜的功能。MaxCompute Studio所提供的強大的開發除錯的支援,也是企業競品所沒有的。在經過一系列的改進之後,MaxCompute 2.0的執行引擎、優化器都是用了最新的演算法模型和框架,因此效能不會輸給任何競品,並且已經經過了內部無數次驗證,因此使用者可以放心使用。

想要了解或討論更多有關大資料計算的技術和產品,歡迎加入“MaxCompute開發者交流”釘釘群