天天看點

MaxCompute SQL與Hive對比分析及使用注意事項

摘要:一個使用過Hadoop的Hive架構的大資料開發工程師,往往基本掌握了阿裡雲的大資料計算服務MaxCompute的90%。本次分享主要通過詳細對比MaxCompute和Hive各個方面的異同及開發使用的注意事項,友善使用者來開發使用MaxCompute,實作從Hive秒速遷移到MaxCompute。

演講嘉賓簡介:劉建偉

以下内容根據演講視訊以及PPT整理而成。

本次分享主要圍繞以下四個方面:

一、MaxCompute和Hive對比内容介紹

二、MaxCompute介紹

三、MaxCompute和Hive對比

四、MaxCompute注意事項及對比總結

本文主要從檔案系統、排程系統、用戶端、SQL、Web UI、界面化操作、權限等方面對MaxCompute和Hive進行對比。其中SQL對比中将分别介紹建表語句、分區分桶、資料上傳下載下傳、外部表、SQL函數、UDF、MapReduce、SQL調優、檔案格式等方面的異同。

MaxCompute SQL與Hive對比分析及使用注意事項
MaxCompute 主要服務于批量結構化資料的存儲和計算,可以提供海量資料倉庫的解決方案以及針對大資料的分析模組化服務。下圖為MaxCompute系統架構。MaxCompute支援SQL查詢計算,自定義函數UDF實作複雜邏輯,MapReduce程式實作更具體的業務計算,支援Graph,面向疊代的圖計算處理架構,提供Java API連接配接操作SQLTask,基于DAG的處理、互動式記憶體計算、機器學習等計算類型及MPI疊代類的算法,簡化了企業大資料平台的應用架構。MaxCompute和Hive一樣可以使用SQL、UDF以及MapReduce開發。基于MaxCompute的Serverless無伺服器的設計思路,使用者隻需關心作業和資料,而無需關心底層分布式架構及運維。
MaxCompute SQL與Hive對比分析及使用注意事項

1. 檔案系統對比

MaxCompute和Hive檔案系統對比如下圖。

MaxCompute SQL與Hive對比分析及使用注意事項

飛天(Apsara)是由阿裡雲自主研發、服務全球的超大規模通用計算作業系統。飛天系統是分布式檔案存儲和計算系統。對于MaxCompute,可将飛天視為類似于Hadoop的架構,如Hive基于Hadoop,那麼可以了解為MaxCompute基于飛天系統。

2. 用戶端對比

Hive用戶端:使用者進入Hive用戶端執行show Database指令可以看到所有的資料庫以及查詢資料庫中對應的表。

MaxCompute SQL與Hive對比分析及使用注意事項

MaxCompute用戶端:

首先下載下傳并安裝MaxCompute用戶端到本地,可以看到MaxCompute用戶端頁面如下圖所示,這裡主要介紹一下MaxCompute的項目空間。

項目空間(Project)是 MaxCompute 的基本組織單元,它類似于傳統資料庫的Database 或 Schema 的概念,是進行多使用者隔離和通路控制的主要邊界 。一個使用者可以同時擁有多個項目空間的權限。通過安全授權,可以在一個項目空間中通路另一個項目空間中的對象,例如表(Table)、資源(Resource)、函數(Function)、 和執行個體Instance。MaxCompute除了指令行,用戶端還提供Python和Java的SDK進行通路。MaxCompute SDK的入口,可通過此類來擷取項目空間下的所有對象集合,包括Projects、Tables、Resources、Functions、Instances。

MaxCompute SQL與Hive對比分析及使用注意事項
構造 MaxCompute對象可通過傳入Aliyu Account執行個體來構造MaxCompute對象。程式示例如下圖所示。建立一個Aliyu Account執行個體,首先輸入“access_id"、“access_key"資訊。 odpsUrl是根據使用者自己的region填寫的endpoint,然後填寫project名稱。MaxCompute Tunnel資料通道是基于Tunnel SDK編寫的。使用者可以通過Tunnel向MaxCompute中上傳或者下載下傳資料。
MaxCompute SQL與Hive對比分析及使用注意事項

SQLTask:SQLTask是用于運作、處理SQL任務的接口。可以通過運作接口直接運作SQL。

注意:每次隻能送出運作一個SQL語句,若為腳本模式可以一次送出多個SQL 。運作接口傳回Instance執行個體,通過Instance擷取SQL的運作狀态及運作結果。程式示例如下圖所示。建立類後輸入accessId,accessKey資訊。然後建立一個Odps執行個體對象,同時輸入endpoint。關于SQLTask的具體介紹可參考官方文檔。

MaxCompute SQL與Hive對比分析及使用注意事項
MaxCompute SQL與Hive對比分析及使用注意事項

3. Hive SQL與MaxCompute SQL對比

(1)建表語句對比:MaxCompute SQL與Hive SQL建表語句對比如下圖所示。Hive SQL建表語句需要定義其分隔符、檔案格式等。而MaxCompute建表不需要指定分隔符,指定檔案存儲路徑,指定檔案的存儲格式。由于MaxCompute是基于阿裡雲飛天檔案系統,使用者無需關心檔案存儲格式,壓縮格式,存儲路徑等,這些操作由阿裡雲來完成。使用者不必疲于檔案存儲成本、壓縮成本效益、讀寫速度等優化,可以将精力集中在業務開發上。

MaxCompute SQL與Hive對比分析及使用注意事項
(2)資料上傳和下載下傳:Hive資料上傳和下載下傳需要通過load指令以及檔案路徑(load date inpath)。MaxCompute中可通過指令工具Tunnel進行資料上傳和下載下傳。
MaxCompute SQL與Hive對比分析及使用注意事項
Upload: MaxCompute上傳資料,支援檔案或目錄(指一級目錄)的上傳,每一次上傳隻支援資料上傳到一張表或表的一個分區。若上傳到分區表則必須指定上傳的分區,多級分區需要指定到末級分區。示例如下:tunnel upload log.txt為資料檔案,test_project為項目空間,.test_table為表名,最後為分區資訊。
MaxCompute SQL與Hive對比分析及使用注意事項
Download: 從MaxCompute的表中下載下傳資料,隻支援下載下傳到單個檔案,每一次下載下傳隻支援下載下傳一張表或一個分區到一個檔案。分區表需要指定下載下傳的分區,多級分區則需要指定到末級分區。
MaxCompute SQL與Hive對比分析及使用注意事項

(3)分區分桶: Hive和MaxCompute都支援分區分桶,其中分區用法一緻。

分桶操作實際上是将一個大檔案根據某個字段hash分為多個小檔案,适當的分桶可提升查詢效率。分桶使用方法如下表所示。

MaxCompute SQL與Hive對比分析及使用注意事項

在Hive中使用分桶指令需要執行指令hive.enforce.bucketiong=true;使用關鍵字clustered by指定分區依據的列名,以及指定分桶數。在MaxCompute中是底層進行分桶操作。在MaxCompute中可以在建表時指定clustered by中的Hash Key,MaxCompute将對指定列進行Hash運算,根據Hash值分散到各個Bucket中。為避免資料傾斜和熱點,取得較好的并行執行效果,clustered by字段列宜選擇取值範圍大、重複鍵值少的列。為達到join優化目的,應考慮選取常用的Join/Aggregation Key,即類似傳統資料庫中的主鍵。

(4)外部表(External Table):Hive可以通過外部表的功能進行操作,例如Hbase、ES的資料。

MaxCompute2.0支援外部表功能。MaxCompute通過外部表來映射阿裡雲的OTS和OSS兩個資料存儲産品來處理非結構化的資料,例如音頻、視訊資料等。在外部表操作過程中需要注意外部表的建表語句以及權限問題。MaxCompute非結構化資料架構通過External Table與各種資料的關聯,關聯OSS上開源格式資料的External Table的建表的DDL語句格式如下所示。包括列資訊、分區資訊、檔案格式、arn資訊等。

DROP TABLE [IF EXISTS] <external_table>;
CREATE EXTERNAL TABLE [IF NOT EXISTS] <external_table>
(<column schemas>)
[PARTITIONED BY (partition column schemas)]
[ROW FORMAT SERDE '<serde class>'
  [WITH SERDEPROPERTIES ('odps.properties.rolearn'='${roleran}' [,'name2'='value2',...])]
]
STORED AS <file format>
LOCATION 'oss://${endpoint}/${bucket}/${userfilePath}/';
           

該文法格式與Hive建立表的文法格式接近,但需注意以下問題:

1)column schemas:外部表的column schemas必須與具體OSS上存儲的資料的schema相符合,否則會報錯。

2)ROW FORMAT SERDE:非必選選項,隻有在使用一些特殊的格式(例如TEXTFILE)時才需要使用。

3)WITH SERDEPROPERTIES:當關聯OSS權限使用STS模式授權時,需要該參數指定odps.properties.rolearn屬性,屬性值為RAM中具體使用的Role的Arn資訊。使用者可以在配置STORED AS 的同時通過說明file format檔案格式。

4)如果不使用STS模式授權,則需指定odps.properties.rolearn屬性,或直接在Location傳入明文AccessKeyId和AccessKeySecret資訊(因資訊有保密性不建議使用)。并且子賬号AccessKeyId和AccessKeySecret資訊需要自行儲存,因為AccessKeyId和AccessKeySecret資訊隻提供一次,不支援後續查詢,一旦丢失需要重新綁定。

OSS外部表授權方式:

一鍵授權:當MaxCompute和OSS的Owner是同一個賬号時,可登入阿裡雲賬号後單擊

一鍵授權

,将跳轉到下圖所示界面,單擊同意授權。在通路控制更改子賬号添加管理對象存儲服務(OSS)權限(AliyunOSSFullAccess)。

MaxCompute SQL與Hive對比分析及使用注意事項

自定義授權:

  1. 新增一個RAM角色。如下圖所示,在RAM通路控制台點選“建立RAM角色"。
    MaxCompute SQL與Hive對比分析及使用注意事項
  2. 修改角色政策内容設定。下圖所示案例為給建立的RAM角色oss-admin添加的信任政策内容
    MaxCompute SQL與Hive對比分析及使用注意事項

當MaxCompute和OSS的Owner是同一賬号時,在Service中隻需寫"odps.aliyuncs.com",不是同一賬号時,需要在Service中填寫"MaxCompute的Owner雲賬号[email protected]"。

--當MaxCompute和OSS的Owner是同一個賬号,設定如下。
{
"Statement": [
{
 "Action": "sts:AssumeRole",
 "Effect": "Allow",
 "Principal": {
   "Service": [
     "odps.aliyuncs.com"
   ]
 }
}
],
"Version": "1"
}
--當MaxCompute和OSS的Owner不是同一個賬号,設定如下。
{
"Statement": [
{
 "Action": "sts:AssumeRole",
 "Effect": "Allow",
 "Principal": {
   "Service": [
     "MaxCompute的Owner雲賬号[email protected]"
   ]
 }
}
],
"Version": "1"
}           
  1. 授予角色通路OSS必要的權限AliyunODPSRolePolicy。如下圖所示,可以看見權限中有ListBuckets、GetObject、ListObjects等具體資訊,使用者可以根據需要自定義權限。
    MaxCompute SQL與Hive對比分析及使用注意事項
  2. 将權限AliyunODPSRolePolicy授權給該角色。如下圖所示,在角色後面點選添權重限,則被授權主體就是之前被授權的子賬号主體。在左側選擇權限政策,點選确定即可。
    MaxCompute SQL與Hive對比分析及使用注意事項

(5)自定義函數: Hive與MaxCompute均支援自定義函數UDF、UDTF、UDAF。MaxCompute 2.0版本更新後,Java UDF支援的資料類型從原來的BIGINT、STRING、DOUBLE、BOOLEAN擴充了更多基本的資料類型,同時還擴充支援了ARRAY、MAP、STRUCT以及Writable等複雜類型。使用複雜資料類型的方法,STRUCT對應com.aliyun.odps.data.Struct。com.aliyun.odps.data.Struct從反射看不出Field Name和Field Type,是以需要用@Resolve注解進行輔助。即如果需要在UDF中使用STRUCT等資料類型,要求在UDF Class上也标注@Resolve注解。但是當STRUCT類型中的field有很多字段時,需要手動添加@Resolve注解。針對此問題,可以使用Hive 中的GenericUDF去實作。MaxCompute 2.0支援Hive風格的UDF,部分Hive UDF、UDTF可以直接在MaxCompute上使用。

(6)MapReduce開發:MapReduce是一個基于叢集的計算平台,是一個簡化分布式程式設計的計算架構,是一個将分布式計算抽象為Map和Reduce兩個階段的程式設計模型。MaxCompute提供三個版本的MapReduce程式設計接口:MaxCompute MapReduce、MapReduce(MR2)、Hadoop相容版本MapReduce。MaxCompute MapReduce是MaxCompute的原生接口,執行速度更快、開發更便捷、不暴露檔案系統。MR2是對MaxCompute MapReduce的擴充,支援更複雜的作業排程邏輯,MapReduce的實作方式與MaxCompute原生接口一緻。 Hadoop相容版本MapReduce特點是高度相容Hadoop MapReduce ,與MaxCompute MapReduce MR2不相容。

(7)SQL調優:MaxCompute和Hive基本SQL優化相似,例如常見的Key分布不均勻、資料傾斜、join長尾、視窗函數優化等。

4. Web UI對比

Hive任務依賴于Hadoop的HDFS和YARN提供的WebUI進行通路。MaxCompute使用Logview檢視Job 資訊。通過Logview可看到一個Job 的任務運作狀态、任務的運作結束、任務細節及每個步驟的進度等任務執行狀況。Job 送出到MaxCompute後将生成Logview的連結。可直接在浏覽器打開Logview連結檢視Job 資訊。Logview首頁分成上下兩部分,Instance資訊和Task資訊。

Instance資訊:使用者送出的SQL任務對應的MaxCompute Instance資訊,包含URL連結、項目、InstanceID、送出人、開始時間、結束時間和狀态(Status)等。Instance資訊部分可以單擊Status檢視目前隊列的Status詳細資訊,包含四種狀态,Waiting表示目前作業正在MaxCompute中處理,并沒有送出到分布式排程系統(Fuxi)中運作。Waiting List : n表示作業已送出至分布式排程系統(Fuxi)排隊等待運作,目前在隊列中處于第n位。Running則說明作業在分布式排程系統(Fuxi)中運作。以及成功狀态。

Task 資訊:該Instance對應的Task資訊,包括任務名稱、類型、狀态、運作結果(Result)、詳細資訊(Detail)、開始時間、結束時間、總運作時間(Latency)、進度。其中,Latency指運作總共消耗的時間,與其它頁面的Latency含義類似。Result是在Job運作結束後,可以看到運作結果。Detail是一個Job在運作中和結束後,均可以單擊Detail來檢視任務運作的具體情況。

案例:下面介紹一個Logview資訊案例。

MaxCompute SQL與Hive對比分析及使用注意事項

點選上圖SQL,可以看到具體執行任務的LogView語句資訊頁面如下:

MaxCompute SQL與Hive對比分析及使用注意事項

目錄中Status是上述所介紹的四種狀态資訊。通過SubStatus History可以看到任務運作過程中的詳細資訊,包括任務等待、準備、執行、結束等詳細執行過程資訊。

MaxCompute SQL與Hive對比分析及使用注意事項

下方一行為Task資訊:

MaxCompute SQL與Hive對比分析及使用注意事項

點選Result可以檢視運作結果;

MaxCompute SQL與Hive對比分析及使用注意事項

點選Detail可以看到任務運作過程中的詳細資訊。

MaxCompute SQL與Hive對比分析及使用注意事項

上圖左側Fuxi Job DAG會根據任務指定詳細執行計劃,生成一個DAG(有向無環)圖。右側上方Fuxi Jobs為具體狀态資訊。右側下方為Instance資訊,通過Instance資訊可以看到整個任務的執行狀況,包括失敗數、運作數、長尾資訊等,可便于對SQL進行相應優化。 Summary是Job運作結束後才可以檢視的資訊,主要包括Job消耗的CPU、記憶體、Job輸入的表名、記錄數和位元組數。通過Summary也可以分析Job是否有長尾,并進行相應優化。是以Logview是MaxCompute開發過程中排查、發現問題的重要工具。

MaxCompute SQL與Hive對比分析及使用注意事項

5. 界面化操作對比

Hive可以借助hue工具來操作查詢資料,但其互動性不是很強。MaxCompute中阿裡雲的産品基本上都是界面化操作,可拖拽,開發門檻非常低。是以非常适合初學大資料或者沒有相關開發人力的公司。MaxCompute的界面化操作可以結合Dataworks做資料同步、權限控制、資料管理和其他資料源互動、定時排程等。

6. 權限對比

Hive中權限操作支援ACL授權。MaxCompute支援ACL授權以及Policy權限授權。

Policy權限授權: 在RAM通路控制頁面權限政策管理中,點選建立自定義權限,選擇腳本模式,就可以編寫Policy權限。如下圖所示為具體權限内容。使用者在開發過程中,可以使用ACL權限或Policy權限授權。建立Policy權限政策後,建立一個RAM角色,為角色制定政策,就會擁有一個相應權限以進行開發。

MaxCompute SQL與Hive對比分析及使用注意事項
MaxCompute SQL與Hive對比分析及使用注意事項

四、MaxCompute注意事項

1. Java沙箱限制

MaxCompute MapReduce及UDF程式在分布式環境中運作時,受到Java沙箱的限制(MapReduce作業的主程式,例如MR Main則不受此限制),具體限制如下所示。

1)不允許直接通路本地檔案,隻能通過MaxCompute MapReduce/Graph提供的接口間接通路。讀取resources選項指定的資源,包括檔案、Jar包和資源表等。通過System.out和System.err輸出日志資訊,可以通過MaxCompute用戶端的Log指令檢視日志資訊。

2)不允許直接通路分布式檔案系統,隻能通過MaxCompute MapReduce/Graph通路到表的記錄。3)不允許JNI調用限制。

4)不允許建立Java線程,不允許啟動子程序執行Linux指令。

5)Java反射限制:suppressAccessChecks權限被禁止,無法setAccessible某個private的屬性或方法,以達到讀取private屬性或調用private方法的目的。

2. SQL使用限制

如下圖所示:具體參考官方文檔介紹。

MaxCompute SQL與Hive對比分析及使用注意事項
MaxCompute SQL與Hive對比分析及使用注意事項

3. MaxCompute資料操作

MaxCompute不支援直接對表資料進行删除(Delete)和更新(Update)文法操作。

更新(Update)資料:隻能将源分區或表資料導入到新分區或表(新分區或表可以與源分區或表相同),在導入過程中執行相應的更新邏輯。對于非分區列,隻支援重命名和建立列,不支援對列的删除。MaxCompute不支援Update語句,建議把更新後的結果篩選出來,然後用Insert Overwrite的方法寫回原表。

删除(Delete)資料:可以通過删除(Drop)表達到資料删除目的。非分區表可以通過TRUNCATE TABLE table_nam;語句清空表資料。分區表可以通過ALTER TABLE table_name DROP IF EXISTS PARTITION(分區名=‘具體分區值’)删除分區達到删除整個分區資料的目的。通過INSERT和WHERE條件把需要的資料導入到另一張新分區或表中或就地更新,INSERT語句支援源表和目的表是同一張表。

4. MaxCompute單字段限制8MB

處理思路:目前由于存儲機制限制,MaxCompute表中單個字段(多為String字段)的最大長度不能超過8MB。對于超過8MB的超大字段,建議拆分成多個字段。具體的拆分邏輯可以根據業務特性設計,保證每個字段不超過8MB即可。

常用方法:由于複雜結構的超大字段在資料開發和分析中會嚴重影響計算性能,是以建議使用者根據數倉建設規範來設計資料架構,避免超大字段。具有複雜結構的原始資料,作為ODS層,最好以壓縮的方式歸檔。定時(例如每天)對ODS層的增量資料做資料清洗,複雜字段拆分為多個簡單字段,然後存儲在CDM層的表中,便于資料的統計分析。

5. 設定相容Flag

預設模式是MaxCompute模式,如果要切換至Hive模式,需要開啟odps.sql.hive.compatible為True。odps.sql.hive.compatible表示是否打開Hive相容模式,其值預設為False。可通過以下兩種方法開啟Hive相容模式。開啟後才可以支援Hive指定的各種用法,例如inputRecordReader、outputRecordReader、Serde等。Hive相容後使用者建立外部表或開發MaxCompute SQL過程中可以從Hive平滑遷移到MaxCompute中。

--Project級别切換為Hive模式:setproject odps.sql.hive.compatible=True;

--Session級别切換為Hive模式:set odps.sql.hive.compatible=True。odps.sql.hive.compatible表示是否打開Hive相容模式,其值預設為False(禁止)。每執行一個Session都需要寫這句話。

最後做一個MaxCompute與Hive異同總結

MaxCompute SQL與Hive對比分析及使用注意事項

歡迎加入“MaxCompute開發者社群2群”,點選連結

MaxCompute開發者社群2群

申請加入或掃描二維碼

  • MaxCompute SQL與Hive對比分析及使用注意事項