摘要:一個使用過Hadoop的Hive框架的大數據開發工程師,每每基本掌握了阿里雲的大數據計算服務MaxCompute的90%。本次分享主要經過詳細對比MaxCompute和Hive各個方面的異同及開發使用的注意事項,方便用戶來開發使用MaxCompute,實現從Hive秒速遷移到MaxCompute。算法
演講嘉賓簡介:劉建偉sql
如下內容根據演講視頻以及PPT整理而成。
本次分享主要圍繞如下四個方面:
1、MaxCompute和Hive對比內容介紹
2、MaxCompute介紹
3、MaxCompute和Hive對比
4、MaxCompute注意事項及對比總結數據庫
1、MaxCompute和Hive對比內容介紹
本文主要從文件系統、調度系統、客戶端、SQL、Web UI、界面化操做、權限等方面對MaxCompute和Hive進行對比。其中SQL對比中將分別介紹建表語句、分區分桶、數據上傳下載、外部表、SQL函數、UDF、MapReduce、SQL調優、文件格式等方面的異同。
2、MaxCompute介紹
MaxCompute 主要服務於批量結構化數據的存儲和計算,能夠提供海量數據倉庫的解決方案以及針對大數據的分析建模服務。下圖爲MaxCompute系統架構。MaxCompute支持SQL查詢計算,自定義函數UDF實現複雜邏輯,MapReduce程序實現更具體的業務計算,支持Graph,面向迭代的圖計算處理框架,提供Java API鏈接操做SQLTask,基於DAG的處理、交互式內存計算、機器學習等計算類型及MPI迭代類的算法,簡化了企業大數據平臺的應用架構。MaxCompute和Hive同樣可使用SQL、UDF以及MapReduce開發。基於MaxCompute的Serverless無服務器的設計思路,用戶只需關心做業和數據,而無需關心底層分佈式架構及運維。
3、MaxCompute和Hive對比
1. 文件系統對比
MaxCompute和Hive文件系統對好比下圖。
飛天(Apsara)是由阿里雲自主研發、服務全球的超大規模通用計算操做系統。飛天系統是分佈式文件存儲和計算系統。對於MaxCompute,可將飛天視爲相似於Hadoop的框架,如Hive基於Hadoop,那麼能夠理解爲MaxCompute基於飛天系統。
2. 客戶端對比
Hive客戶端:用戶進入Hive客戶端執行show Database命令能夠看到全部的數據庫以及查詢數據庫中對應的表。
MaxCompute客戶端:
首先下載並安裝MaxCompute客戶端到本地,能夠看到MaxCompute客戶端頁面以下圖所示,這裏主要介紹一下MaxCompute的項目空間。
項目空間(Project)是 MaxCompute 的基本組織單元,它相似於傳統數據庫的Database 或 Schema 的概念,是進行多用戶隔離和訪問控制的主要邊界 。一個用戶能夠同時擁有多個項目空間的權限。經過安全受權,能夠在一個項目空間中訪問另外一個項目空間中的對象,例如表(Table)、資源(Resource)、函數(Function)、 和實例Instance。MaxCompute除了命令行,客戶端還提供Python和Java的SDK進行訪問。MaxCompute SDK的入口,可經過此類來獲取項目空間下的全部對象集合,包括Projects、Tables、Resources、Functions、Instances。
構造 MaxCompute對象可經過傳入Aliyu Account實例來構造MaxCompute對象。程序示例以下圖所示。建立一個Aliyu Account實例,首先輸入「access_id"、「access_key"信息。 odpsUrl是根據用戶本身的region填寫的endpoint,而後填寫project名稱。MaxCompute Tunnel數據通道是基於Tunnel SDK編寫的。用戶能夠經過Tunnel向MaxCompute中上傳或者下載數據。
SQLTask:SQLTask是用於運行、處理SQL任務的接口。能夠經過運行接口直接運行SQL。
注意:每次只能提交運行一個SQL語句,若爲腳本模式能夠一次提交多個SQL 。運行接口返回Instance實例,經過Instance獲取SQL的運行狀態及運行結果。程序示例以下圖所示。建立類後輸入accessId,accessKey信息。而後建立一個Odps實例對象,同時輸入endpoint。關於SQLTask的具體介紹可參考官方文檔。
3. Hive SQL與MaxCompute SQL對比
(1)建表語句對比:MaxCompute SQL與Hive SQL建表語句對好比下圖所示。Hive SQL建表語句須要定義其分隔符、文件格式等。而MaxCompute建表不須要指定分隔符,指定文件存儲路徑,指定文件的存儲格式。因爲MaxCompute是基於阿里雲飛天文件系統,用戶無需關心文件存儲格式,壓縮格式,存儲路徑等,這些操做由阿里雲來完成。用戶沒必要疲於文件存儲成本、壓縮性價比、讀寫速度等優化,能夠將精力集中在業務開發上。
(2)數據上傳和下載:Hive數據上傳和下載須要經過load命令以及文件路徑(load date inpath)。MaxCompute中可經過命令工具Tunnel進行數據上傳和下載。
Upload:MaxCompute上傳數據,支持文件或目錄(指一級目錄)的上傳,每一次上傳只支持數據上傳到一張表或表的一個分區。若上傳到分區表則必須指定上傳的分區,多級分區須要指定到末級分區。示例以下:tunnel upload log.txt爲數據文件,test_project爲項目空間,.test_table爲表名,最後爲分區信息。
Download:從MaxCompute的表中下載數據,只支持下載到單個文件,每一次下載只支持下載一張表或一個分區到一個文件。分區表須要指定下載的分區,多級分區則須要指定到末級分區。
(3)分區分桶:Hive和MaxCompute都支持分區分桶,其中分區用法一致。
分桶操做其實是將一個大文件根據某個字段hash分爲多個小文件,適當的分桶可提高查詢效率。分桶使用方法以下表所示。
在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和OSS的Owner是同一帳號時,在Service中只需寫"odps.aliyuncs.com",不是同一帳號時,須要在Service中填寫"MaxCompute的Owner雲帳號id@odps.aliyuncs.com"。安全
--當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雲帳號id@odps.aliyuncs.com" ] } } ], "Version": "1" }
(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信息案例。
點擊上圖SQL,能夠看到具體執行任務的LogView語句信息頁面以下:
目錄中Status是上述所介紹的四種狀態信息。經過SubStatus History能夠看到任務運行過程當中的詳細信息,包括任務等待、準備、執行、結束等詳細執行過程信息。
下方一行爲Task信息:
點擊Result能夠查看運行結果;
點擊Detail能夠看到任務運行過程當中的詳細信息。
上圖左側Fuxi Job DAG會根據任務指定詳細執行計劃,生成一個DAG(有向無環)圖。右側上方Fuxi Jobs爲具體狀態信息。右側下方爲Instance信息,經過Instance信息能夠看到整個任務的執行情況,包括失敗數、運行數、長尾信息等,可便於對SQL進行相應優化。 Summary是Job運行結束後才能夠查看的信息,主要包括Job消耗的CPU、內存、Job輸入的表名、記錄數和字節數。經過Summary也能夠分析Job是否有長尾,並進行相應優化。所以Logview是MaxCompute開發過程當中排查、發現問題的重要工具。
5. 界面化操做對比
Hive能夠藉助hue工具來操做查詢數據,但其交互性不是很強。MaxCompute中阿里雲的產品基本上都是界面化操做,可拖拽,開發門檻很是低。所以很是適合初學大數據或者沒有相關開發人力的公司。MaxCompute的界面化操做能夠結合Dataworks作數據同步、權限控制、數據管理和其餘數據源交互、定時調度等。
6. 權限對比
Hive中權限操做支持ACL受權。MaxCompute支持ACL受權以及Policy權限受權。
Policy權限受權: 在RAM訪問控制頁面權限策略管理中,點擊新建自定義權限,選擇腳本模式,就能夠編寫Policy權限。以下圖所示爲具體權限內容。用戶在開發過程當中,可使用ACL權限或Policy權限受權。建立Policy權限策略後,建立一個RAM角色,爲角色制定策略,就會擁有一個相應權限以進行開發。
4、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使用限制
以下圖所示:具體參考官方文檔介紹。
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異同總結 架構
查看更多:https://yqh.aliyun.com/detail..._content=g_1000106254框架
上雲就看雲棲號:更多雲資訊,上雲案例,最佳實踐,產品入門,訪問:https://yqh.aliyun.com/less