全部產品
Search
文件中心

Hologres:對接MaxCompute常見問題與診斷

更新時間:Jun 30, 2024

本文為您介紹使用Hologres對接MaxCompute時的常見報錯及解決方案。

基本概念

  • Hologres與MaxCompute的對比。

    對比項

    MaxCompute

    Hologres

    使用情境

    ETL(Extract-Transform-Load)加工,面向資料明細層(DWD,Data Warehouse Detail)和資料服務層(DWS,Data WareHouse Service)。

    互動式查詢、線上資料服務,面嚮應用的資料服務(ADS)。

    使用者使用

    非同步執行作業。

    同步的Query。

    叢集資源

    共用大叢集,SaaS模式。

    獨享叢集,PaaS模式。

    計算引擎

    基於Job Execution模型,將作業轉化為Stage,每個Stage按需申請計算資源,執行過程中通過File持久化。

    基於MPP模型,精細化記憶體資源管理,執行引擎常駐記憶體,使用者態細粒度SQL運算元調度,計算不落盤。

    調度方式

    進程層級,運行時按需申請、分配。

    輕量級線程,資源啟動時預留。

    擴充性

    幾乎不受限制。

    複雜查詢盡量避免跨多節點資料Shuffle。

    儲存格式

    列式。

    行式、列式、行列共存。

    儲存成本

    基於Pangu,成本低。

    基於Pangu,利用SSD做緩衝加速,成本相對高。

    介面標準

    MaxCompute SQL,類Hive。

    PostgreSQL。

  • Hologres外部表格和內部表的適用情境

    • 建立外部表格直接加速查詢

      外部表格不儲存資料,資料存放區在MaxCompute中,且外部表格沒有索引,全靠CPU資源進行計算,因此外部表格比較適用於小資料量,低QPS(Queries-per-second)的查詢。

    • 匯入資料至Hologres內部表進行加速查詢

      內部表的資料存放區在Hologres中,當有資料更新、複雜查詢、高QPS的查詢時,建議匯入內部表,能充分發揮Hologres底層的效能優勢。

效能調優

效能退化:MaxCompute外部表格發生Schema Evolution之後,查詢效能大幅下降

  • 下降原因:Hologres加速查詢MaxCompute外部表格預設走HQE直讀鏈路,當MaxCompute外部表格結構發生變更後,會回退到SQE鏈路,訪問鏈路更長,導致查詢效能下降。

  • 解決方案:通過hologres.hg_query_log來查詢慢Query。如果engine_type為SQE,可以確認MaxCompute Schema Evolution鏈路切換為SQE導致效能下降。可以嘗試重新構建需要進行表結構變更的MaxCompute外部表格來解決該問題。

常見報錯

報錯:SERVER_INTERNAL_ERROR message: GetRecordBatch() is not implemented.

查詢MaxCompute外表時報錯:query next from foreign table executor failed, GetRecordBatch() is not implemented

  • 報錯原因:當前MaxCompute的表類型不是Cflie類型的表,Hologres暫不支援該類型的表。

  • 解決方案:在查詢資料SQL前添加如下GUC。

    set hg_experimental_enable_access_odps_with_table_api =on;

報錯:ERROR: not an ORC file

查詢外部表格時報錯:ERROR: status { code: SERVER_INTERNAL_ERROR message: "hos_exception: Invalid argument: ../../../src/OrcFileMetaHelper.cc(234)-<operator()>: not an ORC file

  • 報錯原因:MaxCompute的表是Stream表,資料是通過Tunnel等流式寫入,當前Hologres直讀MaxCompute外部表格時暫不支援查詢該狀態的表。

  • 解決方案:在查詢資料SQL前添加如下GUC。

    set hg_experimental_enable_access_odps_with_table_api=on;
    set hg_experimental_enable_access_odps_orc_via_holo =off;

報錯:specified partitions count in MaxCompute table: exceeds the limitation of 512, please add stricter partition filter or set axf_MaxCompute_partition_limit.或者Build desc failed: Exceeds the partition limitation of 512, current match xxx partitions.

  • 報錯原因:

    當前Hologres支援查詢最多分區數為512個,查詢超過此限制。

  • 解決方案:

    • 請添加分區過濾條件,使一次查詢不超過512個分區。

    • 請將資料匯入Hologres內部表,則沒有分區限制,詳情請參見使用SQL匯入MaxCompute的資料至Hologres

    • 使用如下命令調整每次Query命中的分區數,預設為512,最大為1024,不建議調整太大,否則會影響查詢效能。

      -- V1.1及以上版本
      set hg_foreign_table_max_partition_limit = 128;
      -- V0.10版本
      set hg_experimental_foreign_table_max_partition_limit = xxx ;
      說明

      如果MaxCompute配置了多級分區,會按照最細粒度分區單位進行分區命中計數。

報錯:Build desc failed: Exceeds the scan limitation of 200 GB, current scan xxx GB.

  • 報錯原因:

    Hologres中預設最大的底層資料掃描量為200GB,此資料量是命中MaxCompute分區之後的掃描資料量,和MaxCompute自身儲存資料量無關,查詢超出此限制導致報錯。

  • 解決方案:

    • 增加過濾條件,命中更少的分區,使一次Query的掃描資料量在200GB以內。

    • 請將MaxCompute表資料匯入至Hologres中,再進行查詢,詳情請參見使用SQL匯入MaxCompute的資料至Hologres

    • (不推薦)使用set hg_experimental_foreign_table_max_scan_size = xxx;命令設定參數調巨量資料量限制(其中xxx可以替換為業務的資料量,如400,單位為GB)。但是過分調大外部表格資料量限制,可能無法得到預期的效能,也可能造成執行個體OOM(Out Of Memory),影響正常使用。

報錯:query next from foreign table executor failed, Not implemented.

  • 報錯原因:MaxCompute表資料寫入時使用Streaming Tunnel的方式寫入,寫入命令為tunnel.createStreamUploadSession。Hologres讀取資料時需要開啟兩個GUC。

  • 解決方案:

    • 添加如下兩個配置項。

      說明

      僅Hologres V1.3及以上版本支援該GUC。

      set hg_experimental_enable_access_odps_with_table_api=on;
      set hg_experimental_enable_access_odps_orc_via_holo =off;
    • 如果執行個體版本低於V1.3版本,建議在MaxCompute側停止streaming寫入,然後通過以下語句對資料進行Merge:

      set odps.merge.task.mode=sql;
      set odps.merge.lock.expire.time=0;
      ALTER TABLE tablename [PARTITION] MERGE SMALLFILES;

報錯:Build desc failed: failed to check permission: Currently not supported table type "view".

報錯原因:目前暫時不支援MaxCompute的View。

報錯:Build desc failed: failed to get foreign table split:MaxCompute-0010000: System internal error - get input pangu dir meta fai.

  • 報錯原因:

    Hologres讀取MaxCompute的配置未及時更新。

  • 解決方案:

    請過幾分鐘重試,若是重試好幾次都未成功,請聯絡支援人員處理。

報錯:ERROR: Query:[xxx] Build desc failed: failed to get foreign table split:ERPC_ERROR_CONNECTION_CLOSED.

  • 報錯原因:

    MaxCompute小檔案過多,導致請求的META超過遠端程序呼叫協議(RPC,Remote Procedure Call Protocol)1GB的最大限制。

  • 解決方案:

    • 請執行以下命令進行小檔案合并。

      set MaxCompute.merge.task.mode=sql;
      set MaxCompute.merge.lock.expire.time=0;
      ALTER TABLE <tablename> [PARTITION] MERGE SMALLFILES;
    • HologresV0.10.21及以上版本已最佳化,請升級Hologres執行個體,詳情請參見執行個體升級

    • 請聯絡MaxCompute支援人員從源頭解決,如果資料量不大可直接將資料寫入Hologres。

報錯:ERROR: status { code: SERVER_INTERNAL_ERROR message: "hos_exception: IO error: Failed to execute pangu open normal file, err: PanguParameterInvalidException" }.

  • 報錯原因:

    Hologres HQE不支援直讀MaxCompute Pangu加密資料。

  • 解決方案:

    請執行 ALTER DATABASE <dbname> SET hg_experimental_enable_access_odps_orc_via_holo = false;命令將外部表格的執行引擎修改為SQE,使用SQE訪問MaxCompute加密資料,該配置是資料庫層級配置,需要重新建立串連才會生效;您也可執行Session層級設定:SET hg_experimental_enable_access_odps_orc_via_holo = false;

報錯:failed to import foreign schema:Failed to get MaxCompute table:Not enable schema evolution.

  • 報錯原因:

    對MaxCompute表的中繼資料做了修改。

  • 解決方案:

    • 請升級Hologres執行個體版本至V1.3及以上版本,通過加入即時數倉Hologres交流群申請升級執行個體或自助升級,加群方式請參見如何擷取更多的線上支援?

    • 更新了MaxCompute外部表格Schema之後(例如增加列、刪除列操作),請執行IMPORT FOREIGN SCHEMA來做重新整理。

    • 如果執行了IMPORT FOREIGN SCHEMA還報錯的話,請重建立一次MaxCompute的表,再建外部表格,因為MaxCompute修改Schema之後進入到schema evolution狀態,Hologres無法讀取這種狀態的表。

報錯:Open ORC file failed for schema mismatch. Reader schema:

  • 報錯原因:

    MaxCompute的表為ORC格式,表的DECIMAL類型儲存方式改變(一般是MaxCompute新加了DECIMAL欄位或者MaxCompute做了灰階配置變更),導致Hologres讀MaxCompute的DECIMAL類型出錯。

  • 解決方案:

    • 請執行set MaxCompute.storage.orc.enable.binary.decimal=false命令,重新導下MaxCompute資料。

    • 請將MaxCompute的表的DECIMAL類型改為DOUBLE類型,再重新重新整理一遍資料。

報錯:failed to import foreign schema:Failed to get MaxCompute table:Not enable acid table.

  • 報錯原因:

    MaxCompute表是事務(Transactional)表。

  • 解決方案:

    當前不支援MaxCompute的Transactional表,建議改為普通表。

報錯:Request denied, may caused by server busy.

  • 報錯原因:

    外部表格資源佔滿,CPU用量嚴重超出。

  • 解決方案:

    • 請最佳化SQL,使SQL更加充分合理的使用資源,詳情請參見最佳化MaxCompute外部表格的查詢效能

    • 降低並發度。

      1. 使用show hg_foreign_table_executor_max_dop;命令查看當前配置。

      2. 使用如下命令降低並發度,推薦調整為當前配置的一半。

        -- 文法樣本
        set hg_foreign_table_executor_max_dop = <並發數>; 
        -- 使用樣本 
        set hg_foreign_table_executor_max_dop = 18;

        並發數:外部表格單個執行節點讀取外部表格資料的並發度,預設值為256,取值範圍為0-1024。修改後的風險: 並發度太大可能造成執行個體OOM,導致匯入、查詢失敗,甚至執行個體重啟,以至於服務不可用。並發度太小會導致外表查詢、外表匯入內表效能較差。

    • 請匯入資料至Hologres內部表,內部表可以設定索引,使查詢效能更好,詳情請參見使用SQL匯入MaxCompute的資料至Hologres

匯入資料報錯:Query executor exceeded total memory limitation xxxxx: yyyy bytes used.

  • 報錯原因:

    資料量太大或者匯入邏輯太複雜,導致超出了記憶體限制。(執行個體由多個節點群組成,一個節點標準的記憶體上限是64GB,節點記憶體會分為三部分,三分之一用於計算,三分之一用於緩衝,三分之一用於中繼資料。這裡的報錯是計算記憶體超出了限制。)

  • 解決方案:

    1. 查看執行計畫

      可以執行explain analyze sql;命令查看執行計畫中具體的資料行數。當匯入Query包含查詢,但部分表沒有analyze,或者analyze過,但資料又有更新導致不準確,導致查詢最佳化工具決策串連順序有誤,會引起記憶體開銷過高。

      對所有參與的內表、外表執行analyze tablename;命令,更新表的統計元資訊,可以協助查詢最佳化工具產生更優的執行計畫。

    2. 設定單行匯入條數

      當表的列數較多,單行資料量較大時,單次讀取的資料量會更大,通過在SQL前加以下參數來控制單次讀取資料的行數,可以有效減少OOM情況。

      set hg_experimental_query_batch_size = 1024;  -- 預設值為8192
      insert into holo_table select * from mc_table;
    3. 降低匯入的並發度。

      降低匯入並發度,也會有效減少匯入處理程序中的記憶體開銷,並發度通過參數hg_foreign_table_executor_max_dop控制,預設為執行個體的Core數,可以在匯入時設定更小的參數,降低匯入的記憶體使用量。

      set hg_foreign_table_executor_max_dop = 8;
      insert into holo_table select * from mc_table;
    4. 排查外表重複資料是否過多。

      如果以上操作都做完了,還是匯入不了,如果使用的是insert on conflict命令,請排查是否外表重複資料太多,重複資料太多也會導致匯入效能不好,可以在MaxCompute做重複資料去重,再進行匯入,詳情請參見多行資料合併為一行資料

    5. 升級新版本動態調整記憶體。

      Hologres從V1.1.24版本開始,會對記憶體進行動態調整,後台會即時重新整理當前記憶體水位,若是有空閑,則會分配更多記憶體給計算使用,請升級Hologres至最新版本,具體操作請參見執行個體升級

    6. 擴容。

      如果以上操作都做完了,匯入資料還是不成功,請對Hologres擴容,詳情請參見升配

報錯:Timestamp overflow detected while converting timestampfrom orc VectorBatch to arrow.

  • 報錯原因:

    在MaxCompute表中有TIMESTAMP類型,使用Tunnel寫入後TIMESTAMP精度會變成納秒,目前Hologres暫不支援精度為納秒的TIMESTAMP。

  • 解決方案:

    • 在MaxCompute中將TIMESTAMP類型轉換為DateTime類型。

    • Hologres執行個體升級版本到 V1.1.70及以上版本。

報錯:You have NO privilege 'MaxCompute:Select' on xxx.

  • 報錯原因:

    當前帳號不具備MaxCompute表的查詢(Select)許可權。

  • 解決方案:

    請聯絡MaxCompute管理員在MaxCompute中授予當前帳號查詢表(Select)的許可權,具體操作請參見MaxCompute許可權

報錯:The sensitive label of column 'xxx' is 2, but your effective label is 0.

  • 報錯原因:

    當前帳號只有MaxCompute表的部分欄位許可權。

  • 解決方案:

    • 核對有許可權的帳號和報錯的帳號是否為同一個帳號,若確實沒有許可權,可以去申請MaxCompute的許可權,或者只過濾有許可權的欄位查詢。

    • 若是有許可權,並且也只查詢了有許可權的欄位,在執行個體比較老的版本可能存在缺陷,您可以在執行的Query前增加如下命令解決報錯問題。

      set hg_experimental_enable_MaxCompute_executor=on;  
      set hg_experimental_enable_query_master=on;

報錯:query next from foreign table executor failed validate userinfao

  • 報錯原因:

    未正確對Hologres的AliyunHologresEncryptionDefaultRole進行授權,或者因為緩衝的原因,授權未超過3小時也可能偶發出現此報錯。

  • 解決方案:

    對帳號授權AliyunHologresEncryptionDefaultRolePolicy角色,詳情請參見查詢MaxCompute加密資料(BYOK模式)

查詢外部表格速度慢如何解決?

建議最佳化SQL,詳情請參見最佳化MaxCompute外部表格的查詢效能

查詢外部表格報錯:You have NO privilege 'odps:Select' on xxx

  • 問題現象

    當您在Hologres管理主控台建立外部表格之後,查詢外部表格時報錯提示“You have NO privilege 'odps:Select' on xxx”。

  • 問題原因

    當前帳號不具備MaxCompute表的查詢(Select)許可權。

  • 解決方案

    需要MaxCompute管理員在MaxCompute中授予當前帳號查詢表(Select)的許可權,具體操作請參見MaxCompute許可權

查詢外部表格報錯:The sensitive label of column 'xxx' is 2, but your effective label is 0

  • 問題現象

    當您在Hologres管理主控台建立外部表格之後,查詢外部表格時報錯提示“The sensitive label of column 'xxx' is 2, but your effective label is 0”。

  • 問題原因

    當前帳號只有MaxCompute表的部分欄位許可權。

  • 解決方案

    您可以選擇如下三種方法中的一種來解決該問題:

    • (推薦)建議您搜尋加入即時數倉Hologres交流群申請將當前執行個體版本升級至V0.8,詳情請參見如何擷取更多的線上支援?

    • 您可以在執行的Query前增加如下參數解決報錯問題。

      set hg_experimental_enable_odps_executor=on; 
      set hg_experimental_enable_query_master=on;
    • 擷取MaxCompute表全部欄位的許可權,具體操作請參見MaxCompute許可權

跨project訪問MaxCompute表報錯:You have NO privilege 'odps:Select' on xxx

  • 問題現象

    當前帳號已經具備MaxCompute表查詢許可權,但是跨project訪問MaxCompute表報錯”You have NO privilege 'odps:Select' on xxx“。

  • 問題原因

    若是當前帳號已經具備MaxCompute已經有表的查詢許可權,跨project訪問MaxCompute表還是報錯,則MaxCompute當前可能採用的是package授權,您需要添加SQL語句解決該問題。

  • 解決方案

    當前如果MaxCompute是project授權方式,在Hologres中,您可以在SQL前添加如下參數解決。

    // V0.7版本的執行個體請執行以下語句授權
    set seahawks.seahawks_internal_current_odps_project='holoprojectname';
    //V0.8版本的執行個體請執行以下語句授權
    set hg_experimental_odps_current_project_name = 'holoprojectname';

建立外部表格報錯:You have NO privilege 'odps:List' on xxx

  • 問題現象

    當您在Hologres管理主控台使用HoloWeb或DataStudio可視化建立外部表格時報錯提示“You have NO privilege 'odps:List' on xxx”。

  • 問題原因

    當前帳號在MaxCompute中不具備查看所有表(List)的許可權。

  • 解決方案

建立外部表格時報錯:Access denied by project ip white list: sourceIP:'xxxx' is not in white list. project: xxxx

  • 問題現象

    當您在Hologres管理主控台使用HoloWeb建立外部表格時報錯提示“Access denied by project ip white list: sourceIP:'xxxx' is not in white list. project: xxxx”。

  • 問題原因

    當前MaxCompute叢集設定了白名單訪問,Holoweb不在白名單內。

  • 解決方案

    當MaxCompute專案開啟白名單功能時,僅允許白名單內的裝置訪問專案空間;非白名單內的裝置訪問專案空間時,即使擁有正確的AccessKey ID及AccessKey Secret,也無法通過鑒權。因此需要將報錯資訊中的IP設定為白名單才可以建立外表,具體操作請參見設定IP白名單

建立外部表格時報錯:You don't exist in project xxx

  • 問題現象

    當您在建立外部表格時報錯提示“You don't exist in project xxx”。

  • 問題原因

    執行建立外部表格的帳號不具有訪問對應MaxCompute Project的許可權。

  • 解決方案

    請先確認需要訪問的MaxCompute Project名稱,如果Project名稱錯誤請先換成正確的Project名。如果Project名稱正確仍然報同樣的錯誤,需要前往MaxCompute中給報錯的帳號授權,詳情請參見許可權概述