閱讀677 返回首頁    go 阿裏雲 go 技術社區[雲棲]


深入阿裏雲大數據IDE–MaxCompute Studio

摘要:在雲棲社區主辦的雲棲計算之旅第5期–大數據與人工智能分享中,阿裏雲計算平台高級專家薛明為大家深入地介紹了阿裏雲大數據IDE–MaxCompute Studio,並對於其特性和背後的技術思想進行了講解。

本文根據演講視頻整理而成。

本次將與大家深入地分享阿裏雲數加平台的大數據開發套件——MaxCompute Studio。其實對於開發者而言,在大數據開發、數據處理以及管理作業時經常會使用到IDE,而在阿裏巴巴內部也有上萬名大數據開發者,他們也會使用數加平台,也就是阿裏巴巴統一的計算引擎——MaxCompute,在MaxCompute之上其實存在一個統一的數據倉庫,這個數據倉庫中包含了阿裏巴巴全部的數據,各個事業部都可以利用數加平台進行大數據應用的開發。而MaxCompute Studio就是針對於MaxCompute的大數據開發套件。

我們為什麼需要Data IDE
e722eb9099fca0d55ada97e0addf4c5688193695
如同編寫Java或者其他語言的程序一樣,開發者一開始可能會使用文本編輯工具來編寫程序,但是隨著需要處理的任務變得越來越複雜,就可能會需要使用IDE。同樣在數據發展到足夠複雜的時候,需要處理的數據也變得非常多,這些數據往往需要用不同的模式進行處理,所以在進行數據處理時往往需要這樣的IDE去幫助開發者完成工作。在整個數據平台裏可能會存在數據的采集和傳輸過程,但是對於開發者而言,在真正在線上進行數據處理的時候,可能需要一些使用工具把數據漏到開發環境中,然後在本地進行做工作來驗證數據處理邏輯,這樣就可以實現在真正的計算環境和數據倉庫中進行驗證。除此之外,當作業出現問題的時候也需要有足夠好的工具進行分析和管理。這些其實都是對於開發者而言需要麵對的問題,所以阿裏雲也希望通過統一的開發工具或者IDE環境來解決上述的問題。

大數據開發套件:MaxCompute Studio
本次分享將為大家介紹目前阿裏雲在大數據開發中使用的一種工具——MaxCompute Studio,這個工具是麵向MaxCompute計算引擎開發的數據處理開發工具,但是目前還不能夠覆蓋像實時處理以及ADS這些其他的計算引擎,現在隻支持離線計算這部分,但是之後或許能夠推廣到更大的範疇中。
fc7174b981c32978da923dbcaf889aa18e9c3d55

今天的分享將主要圍繞以下三個方麵為大家介紹大數據開發套件MaxCompute Studio的幾個特點以及其背後的實現技術。
99c925839148a96f73b13369bb3190ae2fd4ecdc
  1. 智能編輯器,本質上而言MaxCompute Studio是一個IDE,如同在編寫C++或者Java程序時需要用到IDE一樣,編寫離線數據處理中常用的SQL以及Hive也需要一個智能編輯器,MaxCompute Studio是基於MaxCompute 2.0新一代引擎的編譯器,可以提供上下文相關的代碼補全、實時錯誤提示以及本地編譯。
  2. 調試器,當代碼出現問題時,開發者可以通過MaxCompute Studio進行遠程的調試和處理。MaxCompute Studio可以建立IDE與遠程計算集群的安全調試通道,並提供一鍵觸發調試在集群中失敗的任務的功能。
  3. 作業分析,MaxCompute Studio除了可以幫助開發者進行調試外,還可以進行相關的問題分析,也可以為開發者提供一些相關視圖和分析工具,可視化地展現數據作業的執行計劃,通過快速回放、關鍵路徑分析等幫助用戶定位性能問題。


智能編輯器-SQL

7bcd3bddcbd7e955448cc3708ad7ea5fe6d1c45c

首先談一下智能編輯器,因為對於離線數據處理而言,主要麵對的是SQL開發,很多數據分析師以及數據處理或者應用的開發者都會涉及到寫SQL程序,而且在MaxCompute平台上可能還會支持使用Java或者Python寫一些數據的處理邏輯,這時候IDE可能會更加適合這樣的場景。因為可能需要寫SQL、Python、Java等,而其實這些都可能通過傳統的IDE提供很多非常成熟的功能,比如IDE往往會對於Java程序開發的一些模板和語法提供支持,但是對於SQL而言,就需要通過統一的數據倉庫和數據引擎結合起來對於已有的開發環境進行擴展,MaxCompute Studio的擴展是在目前比較流行的IntelliJ開發平台進行的。之所以選擇IntelliJ是因為其有比較完備的支持擴展的機製,可以在這個IDE上麵擴展出MaxCompute引擎所支持的語法特性。可以看到MaxCompute Studio可以支持SQL的語法以及語法的高亮,還可以實現代碼補全等功能。開發者可能對於SQL的語法並不熟悉,而MaxCompute Studio則可以給出關鍵詞提示。更重要的是在MaxCompute Studio中可以集成元數據,這樣就可以在編寫SQL語句時可以自動幫助開發者對於表格、字段以及函數進行提示。另外一點就是對於大型作業而言,往往提交到服務器之後執行了幾個小時發現一個語句出錯造成了整個作業的失敗,而這些數據也都白跑了,並且這個錯誤往往是一個非常簡單的類似於數據類型不匹配的錯誤,其實在本地可以通過IDE提示發現這個表不存在或者該列類型與所需類型不匹配的問題,開發者可以立即發現錯誤並隨時進行修改。綜合起來,在MaxCompute Studio中寫SQL以及在SQL裏麵嵌入Java或者Python的邏輯代碼以後仍然可以在統一的IDE中進行編譯,這部分的編譯是與在服務器端的語法檢查、類型檢查以及更加複雜的一些邏輯判斷一致的,而這些工作也都可以在本地進行,並且發現問題可以直接跳轉到相應的地方進行修改,這樣就可以大大減少數據的提交次數。其實有時對於一些數據計算而言,可能是需要付費的,這樣就節約了成本,而在比如在像阿裏這樣公司中,雖然提供了統一的資源供大家使用,但是總是在平台上運行錯誤的代碼可能就會造成資源的極大浪費,如果能夠在本地進行檢查就可以大大降低資源的消耗並且提高效率。

智能編輯器背後的編譯器支持
99cc47acb3a816b8a85b8d23c33725ce6365befc
接下來分享一下做智能編輯器這件事情的背景以及其背後所使用的技術。選擇在本地實現IDE其實有一個非常大的技術優勢,就是本地其實具有比較強大的計算資源。而IDE對於SQL代碼在本地其實是進行了預編譯的,這樣就將源代碼轉化成了語法分析樹,在語法分析樹之上可以抽象出邏輯的處理單元AST。之後就可以根據抽象語法樹進行語法的判斷,可以通過語法分析樹進行類型檢查。而又因為在建立了樹型結構之後就可以方便地對於樹進行多次遍曆,所以可以通過類型檢查發現語法中的錯誤。

所以目前就是在本地的後台就做了這樣的幾件事情:首先通過語法分析器和詞法分析器生成了語法分析樹,然後通過上下文無關文法也就是在MaxCompute中對於SQL定義的語法和擴展可以很方便地在IDE裏麵提供語言的新特性,比如在SQL裏麵要增加if-else或者loop這樣語法其實隻需要去更新上下文無關文法就可以了,這樣就可以生成出所需要的後台表示,然後再進行相應的處理。
1c4def4f35c0103c88359b9caed612ae5c0154b7
對於具體問題而言,比如要實現剛才提到的語法高亮就需要考慮這樣的幾個層次,最簡單的就是目前任何一個SQL都可以支持的關鍵詞的詞法高亮,但是在MaxCompute Studio中會更進一步。其實實現關鍵詞的語法高亮很簡單,隻需要斷出Token就可以了,但是還需要實現基於Parse Tree的語法高亮,再往後就需要實現基於AST的類型檢查的語法高亮,比如圖中的if是一個函數,其參數需要字符串的類型,那麼此時就需要後台的抽象語法樹進行判斷是不是這個類型並標注相應的顏色。
7631a1a452b4a3de12d314b90ce79c9615cb4e53
在此基礎之上,MaxCompute Studio還實現了很多更好用的特性,比如開發者寫出關鍵詞之後IDE就能提示和補全,而且實際上這個功能還可以做的更加智能,可以根據語法文件構建有限狀態自動機並根據用戶輸入的上下文提供智能提示。因為IDE的後台存在語法樹所以就可能判斷出用戶所輸入的上下文是什麼,而這並不任何一個編輯器都能做到的,隻有真正懂文法的編輯器才能夠做到。
ca713f36948dbfb98fcf26a1689030eae815c79d
剛才也提到了要對元數據進行處理,而在阿裏巴巴會有一個整體的元數據倉庫去管理全部的元數據。如下圖所示一個項目中會有數千個project,每個project裏麵都會有自己的table和scheme。在本地其實可以通過緩存知道你所關心的project的元數據是什麼樣的,這樣就可以根據元數據為編輯器提供智能化支持。
dc3adb8f9c8c8fa945740a00f47f0fe42fc43e3e
當然這裏往往就會存在元數據更新的問題,比如開發者下載了一個本地的備份,而其他的同學更新、創建或者刪除了一個表,那麼已經下載的元數據如何進行更新呢?其實MaxCompute Studio也提供了幾個機製進行更新,當開發者自己意識到自己的數據不是很新了,那麼就可以進行手工地更新元數據,但是這樣也無法保證本地的元數據是完全正確的,當進行編輯的時候IDE會進行語法檢查,會去檢查表格存不存在以及列的類型是否匹配,當出現問題的時候,IDE會自動地去服務器端將期望的元數據進行更新,可能錯誤開始時提示表格不存在,但是當拿到元數據之後這個錯誤可能就沒有了。其實這樣的錯誤在開發其他程序時也會用到,比方在開發Java程序時會引用第三方的庫,而第三方庫可能本身並沒有下載,所以會出現某個類找不到的問題,但是當配置了Maven等庫管理之後就可以自動地去做更新,這樣就由原來有錯變成沒錯了。

MaxCompute調試器
d9cb854663183192c8d4f1926c00b0132c53ae58
接下來分享在MaxCompute Studio中可以實現的調試器。當出現了任務失敗的情況下,可以在IDE中看到失敗的任務,然後進行DeBug,這時候在後台其實會在真正的計算集群上麵重啟了錯誤的節點,並對於出現錯誤的節點進行斷點監聽,然後在IDE中發起DeBug的會話,並通過IDE端口進行與服務器端的連接,並在服務器端重新運行出現錯誤的代碼片,在這個地方利用IDE本身的調試器檢查代碼的邏輯並進行單步跟蹤。其實在真正進行本地開發時會發現這是一個非常重要的問題,就是在本地運行時無錯誤,但是在服務器端運行數據時出現了錯誤,這時候開發者往往會非常頭疼,因為可能是環境的問題或者是出現了髒數據等造成的影響,而通過IDE就可以很方便地對於問題進行定位。

對於調試器的方案設計可能就有以下的幾種了。其實可以下載VM到本地,將計算節點複製一份就可以反複運行任務,或者在本地模擬一個計算環境,但是這些都不是非常完美的解決方案,都有缺點存在。可能需要下載非常龐大的環境,比如像阿裏的計算節點往往有非常龐大的運行環境,所以不會很容易就下載下來。而本地運行可以做非常簡單的計算環境,但是往往卻和服務器端不完全一樣,也無法完全複現這個問題,所以選用了Remote Attach,當出現問題的時候可以與服務器端進行Attach。
3f71e91c1352f35cd416b991270c523a2fc746be
要實現上述的功能其實可以將IDE與服務器端的DeBug連接,因為計算節點要想啟動一個進程可能需要拉起的服務,所以可以與服務器端進行通信進行連接。但是要想真正地去部署時往往會出現很大的問題,因為本地和服務器端網絡往往不是聯通的,並且還存在安全認證的問題。為了解決安全認證連接的問題,可以現在服務器端進行安全的認證,然後通過中間的Proxy對於請求進行連接。
79628c5bac2ef2e3f056183e58a609f95e391b30
所以這樣就解決了在分布式中如何在上萬台機器的集群中重啟UDF的JVM的環境,因為可能有數據處理的中間文件,如何將這些保存起來,以及如何支持多個用戶DeBug的Proxy的擴展也是實現上的難點問題。
b6c6c6e9aeda6ad4a76206c1871c937eddd92e0c
同樣在IDE裏麵因為有元數據,所以可以與服務器端進行連接,可以看表格或者函數的詳細信息,這樣在開發時就可以輕鬆地獲取所擁有的數據信息,如果沒有數據還可以集成阿裏MaxCompute數據導入工具對於數據進行導入。還有一種情況就是作業提交完成之後可以展示一個腳本中多條語句的詳細執行計劃,這樣就可以幫助開發者了解腳本中的語句在服務器端究竟執行了幾步,每步都可以看到執行的過程,每一步的輸入是什麼、輸出是什麼,可以發現究竟哪一步出現了數據傾斜。並且執行完成的作業都可以被列出來,這樣就可以看到作業的執行狀態以及詳細信息。在作業的詳細信息中可以看到該作業完整的執行計劃以及作業的回放,回放就是無論作業執行成功還是失敗都可以以短暫的時間重新回放一遍,這樣就可以幫助開發者發現作業中哪一個是瓶頸。而MaxCompute Studio在未來也會在作業分析部分提供更加豐富的功能,比如檢測數據作業的關鍵路徑或者對於曆史作業的對比,以此來快速地定位問題。
f1f6dbb23d8f3bbe73d98747e3aaab5012885190
回顧今天所分享的內容,實際上阿裏巴巴在統一的數據平台之上就會存在非常集中的數據開發需求,要想滿足這樣的需求就需要完善的工具來支持,這其實非常符合數加理念:在數據強大引擎之上需要能夠真正發揮作用的工具。MaxCompute Studio就是麵向大數據開發者的工具,它能夠覆蓋大數據開發中的開發、測試調試以及作業管理整個閉環。在編輯器上可以瀏覽元數據,並給出智能的語法提示,當出現問題時可以像開發Java程序為開發者從線上下載樣例數據來提交SQL驗證邏輯,當作業出現問題可以使用可視化的方式觀察執行計劃,並通過快速回放去定位問題,這樣就使得在統一的數據平台上進行快速開發成為可能,同時因為存在集成的開發環境就可以在上麵方便地擴展數據的應用,可以在數加平台上實現自己的數據調度和數據監測功能,還可以通過IDE對於開源資產進行管理或者遷移。

最後更新:2017-05-08 17:01:47

  上一篇:go vip域名注冊有什麼優勢?
  下一篇:go (四)共進晚餐