天天看點

深入阿裡雲大資料IDE–MaxCompute Studio

<b>摘要:</b>在雲栖社群主辦的雲栖計算之旅第5期–大資料與人工智能分享中,阿裡雲計算平台進階專家薛明為大家深入地介紹了阿裡雲大資料ide–maxcompute studio,并對于其特性和背後的技術思想進行了講解。

<b>本文根據演講視訊整理而成。</b>

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

<b>我們為什麼需要data ide</b>

深入阿裡雲大資料IDE–MaxCompute Studio

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

<b>大資料開發套件:maxcompute studio</b>

本次分享将為大家介紹目前阿裡雲在大資料開發中使用的一種工具——maxcompute studio,這個工具是面向maxcompute計算引擎開發的資料處理開發工具,但是目前還不能夠覆寫像實時處理以及ads這些其他的計算引擎,現在隻支援離線計算這部分,但是之後或許能夠推廣到更大的範疇中。

深入阿裡雲大資料IDE–MaxCompute Studio

今天的分享将主要圍繞以下三個方面為大家介紹大資料開發套件maxcompute studio的幾個特點以及其背後的實作技術。

深入阿裡雲大資料IDE–MaxCompute Studio

<b>智能編輯器</b>,本質上而言maxcompute studio是一個ide,如同在編寫c++或者java程式時需要用到ide一樣,編寫離線資料進行中常用的sql以及hive也需要一個智能編輯器,maxcompute studio是基于maxcompute 2.0新一代引擎的編譯器,可以提供上下文相關的代碼補全、實時錯誤提示以及本地編譯。

<b>調試器</b>,當代碼出現問題時,開發者可以通過maxcompute studio進行遠端的調試和處理。maxcompute studio可以建立ide與遠端計算叢集的安全調試通道,并提供一鍵觸發調試在叢集中失敗的任務的功能。

<b>作業分析</b>,maxcompute studio除了可以幫助開發者進行調試外,還可以進行相關的問題分析,也可以為開發者提供一些相關視圖和分析工具,可視化地展現資料作業的執行計劃,通過快速回放、關鍵路徑分析等幫助使用者定位性能問題。

<b>智能編輯器-sql</b>

深入阿裡雲大資料IDE–MaxCompute Studio

首先談一下智能編輯器,因為對于離線資料處理而言,主要面對的是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中進行編譯,這部分的編譯是與在伺服器端的文法檢查、類型檢查以及更加複雜的一些邏輯判斷一緻的,而這些工作也都可以在本地進行,并且發現問題可以直接跳轉到相應的地方進行修改,這樣就可以大大減少資料的送出次數。其實有時對于一些資料計算而言,可能是需要付費的,這樣就節約了成本,而在比如在像阿裡這樣公司中,雖然提供了統一的資源供大家使用,但是總是在平台上運作錯誤的代碼可能就會造成資源的極大浪費,如果能夠在本地進行檢查就可以大大降低資源的消耗并且提高效率。

<b>智能編輯器背後的編譯器支援</b>

深入阿裡雲大資料IDE–MaxCompute Studio

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

是以目前就是在本地的背景就做了這樣的幾件事情:首先通過文法分析器和詞法分析器生成了文法分析樹,然後通過上下文無關文法也就是在maxcompute中對于sql定義的文法和擴充可以很友善地在ide裡面提供語言的新特性,比如在sql裡面要增加if-else或者loop這樣文法其實隻需要去更新上下文無關文法就可以了,這樣就可以生成出所需要的背景表示,然後再進行相應的處理。

深入阿裡雲大資料IDE–MaxCompute Studio

對于具體問題而言,比如要實作剛才提到的文法高亮就需要考慮這樣的幾個層次,最簡單的就是目前任何一個sql都可以支援的關鍵詞的詞法高亮,但是在maxcompute studio中會更進一步。其實實作關鍵詞的文法高亮很簡單,隻需要斷出token就可以了,但是還需要實作基于parse tree的文法高亮,再往後就需要實作基于ast的類型檢查的文法高亮,比如圖中的if是一個函數,其參數需要字元串的類型,那麼此時就需要背景的抽象文法樹進行判斷是不是這個類型并标注相應的顔色。

深入阿裡雲大資料IDE–MaxCompute Studio

在此基礎之上,maxcompute studio還實作了很多更好用的特性,比如開發者寫出關鍵詞之後ide就能提示和補全,而且實際上這個功能還可以做的更加智能,可以根據文法檔案建構有限狀态自動機并根據使用者輸入的上下文提供智能提示。因為ide的背景存在文法樹是以就可能判斷出使用者所輸入的上下文是什麼,而這并不任何一個編輯器都能做到的,隻有真正懂文法的編輯器才能夠做到。

深入阿裡雲大資料IDE–MaxCompute Studio

剛才也提到了要對中繼資料進行處理,而在阿裡巴巴會有一個整體的中繼資料倉庫去管理全部的中繼資料。如下圖所示一個項目中會有數千個project,每個project裡面都會有自己的table和scheme。在本地其實可以通過緩存知道你所關心的project的中繼資料是什麼樣的,這樣就可以根據中繼資料為編輯器提供智能化支援。

深入阿裡雲大資料IDE–MaxCompute Studio

當然這裡往往就會存在中繼資料更新的問題,比如開發者下載下傳了一個本地的備份,而其他的同學更新、建立或者删除了一個表,那麼已經下載下傳的中繼資料如何進行更新呢?其實maxcompute studio也提供了幾個機制進行更新,當開發者自己意識到自己的資料不是很新了,那麼就可以進行手工地更新中繼資料,但是這樣也無法保證本地的中繼資料是完全正确的,當進行編輯的時候ide會進行文法檢查,會去檢查表格存不存在以及列的類型是否比對,當出現問題的時候,ide會自動地去伺服器端将期望的中繼資料進行更新,可能錯誤開始時提示表格不存在,但是當拿到中繼資料之後這個錯誤可能就沒有了。其實這樣的錯誤在開發其他程式時也會用到,比方在開發java程式時會引用第三方的庫,而第三方庫可能本身并沒有下載下傳,是以會出現某個類找不到的問題,但是當配置了maven等庫管理之後就可以自動地去做更新,這樣就由原來有錯變成沒錯了。

<b>maxcompute調試器</b>

深入阿裡雲大資料IDE–MaxCompute Studio

接下來分享在maxcompute studio中可以實作的調試器。當出現了任務失敗的情況下,可以在ide中看到失敗的任務,然後進行debug,這時候在背景其實會在真正的計算叢集上面重新開機了錯誤的節點,并對于出現錯誤的節點進行斷點監聽,然後在ide中發起debug的會話,并通過ide端口進行與伺服器端的連接配接,并在伺服器端重新運作出現錯誤的代碼片,在這個地方利用ide本身的調試器檢查代碼的邏輯并進行單步跟蹤。其實在真正進行本地開發時會發現這是一個非常重要的問題,就是在本地運作時無錯誤,但是在伺服器端運作資料時出現了錯誤,這時候開發者往往會非常頭疼,因為可能是環境的問題或者是出現了髒資料等造成的影響,而通過ide就可以很友善地對于問題進行定位。

對于調試器的方案設計可能就有以下的幾種了。其實可以下載下傳vm到本地,将計算節點複制一份就可以反複運作任務,或者在本地模拟一個計算環境,但是這些都不是非常完美的解決方案,都有缺點存在。可能需要下載下傳非常龐大的環境,比如像阿裡的計算節點往往有非常龐大的運作環境,是以不會很容易就下載下傳下來。而本地運作可以做非常簡單的計算環境,但是往往卻和伺服器端不完全一樣,也無法完全複現這個問題,是以選用了remote attach,當出現問題的時候可以與伺服器端進行attach。

深入阿裡雲大資料IDE–MaxCompute Studio

要實作上述的功能其實可以将ide與伺服器端的debug連接配接,因為計算節點要想啟動一個程序可能需要拉起的服務,是以可以與伺服器端進行通信進行連接配接。但是要想真正地去部署時往往會出現很大的問題,因為本地和伺服器端網絡往往不是聯通的,并且還存在安全認證的問題。為了解決安全認證連接配接的問題,可以現在伺服器端進行安全的認證,然後通過中間的proxy對于請求進行連接配接。

深入阿裡雲大資料IDE–MaxCompute Studio

是以這樣就解決了在分布式中如何在上萬台機器的叢集中重新開機udf的jvm的環境,因為可能有資料處理的中間檔案,如何将這些儲存起來,以及如何支援多個使用者debug的proxy的擴充也是實作上的難點問題。

深入阿裡雲大資料IDE–MaxCompute Studio

同樣在ide裡面因為有中繼資料,是以可以與伺服器端進行連接配接,可以看表格或者函數的詳細資訊,這樣在開發時就可以輕松地擷取所擁有的資料資訊,如果沒有資料還可以內建阿裡maxcompute資料導入工具對于資料進行導入。還有一種情況就是作業送出完成之後可以展示一個腳本中多條語句的詳細執行計劃,這樣就可以幫助開發者了解腳本中的語句在伺服器端究竟執行了幾步,每步都可以看到執行的過程,每一步的輸入是什麼、輸出是什麼,可以發現究竟哪一步出現了資料傾斜。并且執行完成的作業都可以被列出來,這樣就可以看到作業的執行狀态以及詳細資訊。在作業的詳細資訊中可以看到該作業完整的執行計劃以及作業的回放,回放就是無論作業執行成功還是失敗都可以以短暫的時間重新回放一遍,這樣就可以幫助開發者發現作業中哪一個是瓶頸。而maxcompute studio在未來也會在作業分析部分提供更加豐富的功能,比如檢測資料作業的關鍵路徑或者對于曆史作業的對比,以此來快速地定位問題。

深入阿裡雲大資料IDE–MaxCompute Studio

回顧今天所分享的内容,實際上阿裡巴巴在統一的資料平台之上就會存在非常集中的資料開發需求,要想滿足這樣的需求就需要完善的工具來支援,這其實非常符合數加理念:在資料強大引擎之上需要能夠真正發揮作用的工具。maxcompute studio就是面向大資料開發者的工具,它能夠覆寫大資料開發中的開發、測試調試以及作業管理整個閉環。在編輯器上可以浏覽中繼資料,并給出智能的文法提示,當出現問題時可以像開發java程式為開發者從線上下載下傳樣例資料來送出sql驗證邏輯,當作業出現問題可以使用可視化的方式觀察執行計劃,并通過快速回放去定位問題,這樣就使得在統一的資料平台上進行快速開發成為可能,同時因為存在內建的開發環境就可以在上面友善地擴充資料的應用,可以在數加平台上實作自己的資料排程和資料監測功能,還可以通過ide對于開源資産進行管理或者遷移。

深入阿裡雲大資料IDE–MaxCompute Studio