全部產品
Search
文件中心

MaxCompute:MaxFrame常見問題

更新時間:Dec 26, 2025

本文介紹MaxFrame的常見報錯問題。

問題1:報錯invalid type INT for function UDF definition, you need to set odps.sql.type.system.odps2=true; in order to use it

  • 報錯原因:在未開啟MaxCompute 2.0資料類型版本的情況下,使用MaxCompute 2.0的資料類型,導致作業執行時出現錯誤。

  • 解決方案:通過Flag開啟MaxCompute 2.0資料類型,樣本如下:

    from maxframe import config
    # 在new_session之前添加
    config.options.sql.settings = {
      "odps.sql.type.system.odps2": "true"
    }
    

問題2:報錯UDF : No module named 'cloudpickle'

  • 報錯原因:缺少依賴的cloudpickle包。

  • 解決方案:引用MaxCompute基礎鏡像,樣本如下:

    from maxframe import config
    # 在new_session之前添加
    config.options.sql.settings = {
      "odps.session.image": "common",
    }
    

問題3:如何在DataFrame提交(apply)的UDF中實現資源複用

在部分UDF情境中,可能涉及到某些較多的資源建立或者銷毀行為(例如初始化資料庫連接、載入模型等),希望在每個UDF被載入時只會執行一次。

可以利用Python中函數參數預設值只被初始化一次的特性,實現資源複用。

例如,在下述UDF中,模型只會被載入一次。

def predict(s, _ctx={}):
  from ultralytics import YOLO
  # _ctx 的初始值是一個空 dict,在 Python 執行過程中只會被初始化一次。
  # 使用模型時,可以先判斷 _ctx 中是否存在該模型,不存在則執行載入,然後存入 dict 中。
  if not _ctx.get("model", None):
    model = YOLO(os.path.join("./", "yolo11n.pt"))
    _ctx["model"] = model
  model = _ctx["model"]

  # 後續調用模型的相關介面
  

下面給出了一個需要銷毀資源的UDF樣本,該樣本中使用了一個自訂的類MyConnector負責建立和關閉資料庫連接。

class MyConnector:

  def __init__(self):
    # 在 __init__ 中建立資料庫連接
    self.conn = create_connection()

  def __del__(self):
    # 在 __del__ 中關閉資料庫連接
    try:
      self.conn.close()
    except:
      pass


def process(s, connector=MyConnector()):
  # 直接調用 connector 內的資料庫連接,無需在 UDF 內部再次執行串連建立和關閉
  connector.conn.execute("xxxxx")
  
說明

初始化的實際執行次數取決於運行UDF的Worker數量,每個Worker執行UDF時都是一個單獨的Python環境。例如,某個UDF調用需要處理10萬行資料,總共被分配給了10個UDF Worker,每個Worker處理一萬條資料,則總共會執行10次初始化,每個Worker在處理1萬條資料的過程中,初始化過程只會執行一次。

問題4:如何在DataWorks資源群組(獨享和通用)更新MaxFrame版本?

問題5:MaxFrame自訂鏡像使用實踐

問題6:查詢報錯ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: java.lang.RuntimeException: sequence_row_id cannot be applied because of : no CMF

解決方案:查詢時需要加上index_col,程式碼範例如下:

df2=md.read_odps_table("tablename",index_col="cloumn").to_pandas()
df2=reset_index(inplace=True)

問題7:使用apply等帶自訂函數方法時報錯Cannot determine dtypes by calculating with enumerate data, please specify it as arguments

  • 報錯原因:MaxFrame嘗試推匯出UDF可能返回的DataFrame/Series類型,這些類型用於檢查和構建後續計算的Dataframe/Series,但在下列情況下可能無法正常獲得 dtypes。

    • 如果UDF在當前環境下無法正常執行,可能是依賴了一些自訂鏡像、第三方依賴或者傳入的參數有誤。

    • 如果指定了output_type,可能函數實際返回的類型與指定的output_type不符。

  • 解決方案:修改代碼或通過指定 `dtypes` 來告知MaxFrame當前UDF返回結果的類型,例如:

    • 返回一個包含一個 int 列的 DataFrame:df.apply(..., dtypes=pd.Series([np.int_]), output_type="dataframe")

    • 返回一個包含 A 和 B 兩列的 DataFrame:df.apply(..., dtypes={"A": np.int_, "B": np.str_}, output_type="dataframe")

    • 返回一個類型為 bool 名為 flag 的 Series:df.apply(..., dtype="bool", name="flag", output_type="series")

問題8:如何按照SQL的方式添加flag?

from maxframe import config
config.options.sql.settings = {
    "odps.stage.mapper.split.size": "8",
    "odps.stage.joiner.num": "20"
}

問題9:如何在MaxFrame開發中引用三方包?

參考引用第三方包及鏡像

from maxframe.udf import with_resources


@with_resources("resource_name")
def process(row):
    ...
    

問題10:任務報錯TypeError: Cannot accept arguments append_partitions

檢查PyODPS版本,升級到0.12.0可以解決。

問題11:如何拆解大量JSON字串欄位

MaxFramev1.0.0及以上版本的SDK支援通過如下方式拆解大量JSON字串欄位:

https://maxframe.readthedocs.io/en/latest/reference/dataframe/generated/maxframe.dataframe.Series.mf.flatjson.html

問題12:ODPS-0010000: Fuxi job failed - Job failed for unknown reason, cannot get jobstatus

  • 錯誤原因:顯示或間接使用 @with_python_requirements 等方式安裝依賴時安裝失敗,導致作業無法繼續運行。

  • 錯誤資訊解釋ODPS-0010000: Fuxi job failed - Job failed for unknown reason, cannot get jobstatus

    在PythonPack的Logview的stderr中應當能見到更詳細的資訊,例如下方所見的網路連接失敗錯誤等。

    詳細錯誤資訊

    ...
      File "/root/.venv/lib/python3.11/site-packages/odps/models/instance.py", line 469, in _call_with_retry
        return utils.call_with_retry(func, **retry_kw)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/root/.venv/lib/python3.11/site-packages/odps/utils.py", line 996, in call_with_retry
        return func(*args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^
      File "/root/.venv/lib/python3.11/site-packages/odps/models/instance.py", line 556, in _get_resp
        return self._client.get(self.resource(), action="taskstatus")
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/root/.venv/lib/python3.11/site-packages/odps/rest.py", line 332, in get
        return self.request(url, "get", stream=stream, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/root/.venv/lib/python3.11/site-packages/odps/rest.py", line 213, in request
        return self._request(url, method, stream=stream, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/root/.venv/lib/python3.11/site-packages/odps/rest.py", line 310, in _request
        res = self.session.send(
              ^^^^^^^^^^^^^^^^^^
      File "/root/.venv/lib/python3.11/site-packages/requests/sessions.py", line 703, in send
        r = adapter.send(request, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/root/.venv/lib/python3.11/site-packages/requests/adapters.py", line 700, in send
        raise ConnectionError(e, request=request)
    requests.exceptions.ConnectionError: HTTPConnectionPool(host='service.cn-beijing-intranet.maxcompute.aliyun-inc.com', port=80): Max retries exceeded with url: /api/projects/odps_monitor_odps_cn_beijing_i/instances/20250620142836623g059jg5q8pk?taskstatus&curr_project=odps_monitor_odps_cn_beijing_i (Caused by NameResolutionError("<urllib3.connection.HTTPConnection object at 0x7f326dca0510>: Failed to resolve 'service.cn-beijing-intranet.maxcompute.aliyun-inc.com' ([Errno -2] Name or service not known)"))
    [2025-06-20 14:28:40,903 pythonpack.taskcaller WARNING] Set pack result: Unexpected error occurred, is_succeeded=False
    
  • 解決方案

    1. PythonPack內部錯誤,考慮安裝Pip依賴打包的節點暫時無法正常地訪問依賴倉庫,可以首先考慮重試,如果重試仍然無法解決,請聯絡MaxFrame團隊。

    2. 如果是周期性作業,為了保證作業的穩定性,可以考慮在使用PythonPack時,直接緩衝打包成功的結果,並在之後的每天作業中直接使用緩衝的結果。對結果緩衝的使用方法如下:

      from maxframe import options
      # 設定 pythonpack 的結果為 prod,這樣在之後的作業中,pythonpack 結果會直接使用緩衝
      options.pythonpack.task.settings = {"odps.pythonpack.production": "true"}
      

      如果要忽略緩衝,需要在@with_python_requirements中添加force_rebuild=True

    3. 也可以考慮暫時不使用PythonPack來安裝依賴,離線打包好對應的依賴,上傳為MaxFrame Resource,並在對應的作業中引用,MaxFrame會自動將依賴添加到可調用的上下文中。

      PyODPS-Pack是一個簡化這個流程的工具,PyODPS-Pack會自動裝載相同環境的manylinux docker容器進行打包以避免出現相容性問題,目前可以在 X86 Linux 機器上運行(M 系列的 ARM 晶片的蘋果裝置暫時不支援)。

      在MaxFrame中使用MaxCompute Resource,可以使用@with_resources

問題13:ODPS-0123055:User script exception

  • 錯誤原因:這類錯誤是MaxFrame中最常見的出錯類型,發生在UDF的執行中,例如 applyapply_chunkflatmapmaptransform 等運算元。該錯誤資訊代表提交的UDF函數運行中拋出了Python異常。目前這類異常主要由以下幾個因素導致:

    • 代碼本身存在問題,需要再次檢查代碼邏輯。

    • 錯誤處理邏輯存在問題,拋出了沒有被正確處理的異常,需要再次檢查try-except塊是否正確的處理了所有的異常。

    • 在 UDF 中訪問了網路,而在預設情況下MaxCompute UDF容器中網路是關閉的。

    • 運算元中使用dtype或者dtypes聲明的輸出類型與UDF中實際返回的類型不符。

    • 在UDF中引用了一些運行環境中缺少的依賴,導致無法正確的還原序列化客戶的代碼。

  • 錯誤資訊解釋

    ODPS-0123055:User script exception報錯大部分為Python異常,可以查看失敗的執行個體的stderr

    以如下測試為例,對一個非JSON字串執行JSON loads,一定會出現錯誤,這在資料處理中非常常見。

    1. def simple_failure(row):
    2.    import json
    3.
    4.    text = row["json_text"]
    5.    data = json.loads(text)
    6.    return data
    7.
    8.
    9. df = md.read_pandas(pd.DataFrame({"json_text": ["123", "456", "789"]}))
    10. df.apply(
    11.     simple_failure, axis=1, dtypes={"text": np.str_}, output_type="dataframe"
    12. ).execute()
    

    對應的報錯資訊如下所示,報錯資訊中清晰地指出錯誤發生在 simple_failure 函數中,對應的程式碼是line 5,也就是data = json.loads(text)這一行:

    ScriptError: ODPS-0123055: InstanceId: 20250622063246442gquihia95z2
    ODPS-0123055:User script exception - Traceback (most recent call last):
      File "/home/admin/mf_udf_ref_20250622062907997gvwps9irzzc_user_udf_139907101614080.py", line 130, in wrapped
        return func(self, *args, **kw)
               ^^^^^^^^^^^^^^^^^^^^^^^
      File "/home/admin/mf_udf_ref_20250622062907997gvwps9irzzc_user_udf_139907101614080.py", line 262, in process
        for result in self.user_func(*args):
      File "/home/admin/mf_udf_ref_20250622062907997gvwps9irzzc_user_udf_139907101614080.py", line 230, in user_func_caller
        _user_function_results = _user_function(data, *_args, **_kw_args)
                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/var/folders/_8/v9wr7xm54bz0rj5pl4p9dkww0000gn/T/ipykernel_18735/2599074506.py", line 5, in simple_failure
      File "/usr/ali/python3.11.7/lib/python3.11/json/__init__.py", line 346, in loads
        return _default_decoder.decode(s)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/ali/python3.11.7/lib/python3.11/json/decoder.py", line 337, in decode
        obj, end = self.raw_decode(s, idx=_w(s, 0).end())
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/ali/python3.11.7/lib/python3.11/json/decoder.py", line 355, in raw_decode
        raise JSONDecodeError("Expecting value", s, err.value) from None
    json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
     | fatalInstance: Odps/meta_dev_20250622063246442gquihia95z2_SQL_0_0_0_job_0/M1#0_0
    

    只要函數能正常序列化,通過對棧的分析,基本能獲得到錯誤發生的位置。

    而如果引用了一些運行環境中缺少的依賴,會導致UDF無法被正常序列化,報錯資訊中會提示找不到依賴,錯誤資訊中會明顯提示出導致無法被序列化的對象或依賴,以如下為例。

    # 假定本地安裝了 xxhash 並匯入
    import xxhash
    
    
    def type_failure(row):
        # 在 udf 裡引用 xxhash
        return str(xxhash.xxh64("hello maxfrmae"))
    
    
    df = md.read_pandas(pd.DataFrame(np.random.randn(3, 5), columns=list("ABCDE")))
    df.apply(
        type_failure, axis=1, dtypes={"hash_value": np.str_}, output_type="dataframe"
    ).execute()
    

    報錯會出現如下所示的異常棧,即MaxFrame在運行中嘗試unpickle本地的函數失敗了,提示No module named 'xxhash',這也是一個非常精準的報錯資訊。

    File "/home/admin/mf_udf_ref_20250622070426909g26q6zdfar2_user_udf_140362144866304.py", line 209, in __init__
    
        _user_function = cloudpickle.loads(base64.b64decode(b'gAWVnwIAAAAAAACMF2Nsb3VkcGlja2xlLmNsb3VkcGlja2xllIwOX21ha2VfZnVuY3Rpb26Uk5QoaACMDV9idWlsdGluX3R5cGWUk5SMCENvZGVUeXBllIWUUpQoSwFLAEsASwFLBUsDQ1CXAHQBAAAAAAAAAAAAAHQCAAAAAAAAAAAAAKACAAAAAAAAAAAAAAAAAAAAAAAAAABkAaYBAACrAQAAAAAAAAAApgEAAKsBAAAAAAAAAABTAJROjA5oZWxsbyBtYXhmcm1hZZSGlIwDc3RylIwGeHhoYXNolIwFeHhoNjSUh5SMA3Jvd5SFlIxNL3Zhci9mb2xkZXJzL184L3Y5d3I3eG01NGJ6MHJqNXBsNHA5ZGt3dzAwMDBnbi9UL2lweWtlcm5lbF8xODczNS81NTM2OTIzNjYucHmUjAx0eXBlX2ZhaWx1cmWUaBJLBEMdgADdCw6Ndo98inzQHCzRDy3UDy3RCy7UCy7QBC6UQwCUKSl0lFKUfZQojAtfX3BhY2thZ2VfX5ROjAhfX25hbWVfX5SMCF9fbWFpbl9flHVOTk50lFKUjBxjbG91ZHBpY2tsZS5jbG91ZHBpY2tsZV9mYXN0lIwSX2Z1bmN0aW9uX3NldHN0YXRllJOUaBx9lH2UKGgZaBKMDF9fcXVhbG5hbWVfX5RoEowPX19hbm5vdGF0aW9uc19flH2UjA5fX2t3ZGVmYXVsdHNfX5ROjAxfX2RlZmF1bHRzX1+UTowKX19tb2R1bGVfX5RoGowHX19kb2NfX5ROjAtfX2Nsb3N1cmVfX5ROjBdfY2xvdWRwaWNrbGVfc3VibW9kdWxlc5RdlIwLX19nbG9iYWxzX1+UfZRoDGgAjAlzdWJpbXBvcnSUk5RoDIWUUpRzdYaUhlIwLg=='), buffers=[ ])
    
                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      File "/usr/ali/python3.11.7/lib/python3.11/site-packages/cloudpickle/cloudpickle.py", line 649, in subimport
        __import__(name)
    ModuleNotFoundError: No module named 'xxhash'
    
  • 以下是其他幾種類型錯誤的錯誤碼和錯誤資訊

    • 錯誤的傳回型別:

      def type_failure(row):
          text = row["A"]
          # 返回一個 float
          return text
      
      df = md.read_pandas(pd.DataFrame(np.random.randn(3, 5), columns=list("ABCDE")))
      
      # 聲明返回一個 dataframe 包含一個名字為 A 的 str 列
      df.apply(type_failure, axis=1, dtypes={"A": np.str_}, output_type="dataframe").execute()
      

      會提醒期望一個unicode,也就是str,但是得到了一個 float 類型。這些資訊通常由 dtypes 或者 dtype 指定,請確保聲明的類型與函數裡實際返回的類型一致。

      ScriptError: ODPS-0123055: InstanceId: 202506220642291g87d6xot20d
      ODPS-0123055:User script exception - Traceback (most recent call last):
        File "/home/admin/mf_udf_ref_20250622062907997gvwps9irzzc_user_udf_139905326100480.py", line 130, in wrapped
          return func(self, *args, **kw)
                 ^^^^^^^^^^^^^^^^^^^^^^^
        File "/home/admin/mf_udf_ref_20250622062907997gvwps9irzzc_user_udf_139905326100480.py", line 263, in process
          self.forward(*result)
      TypeError: return value expected <class 'unicode'> but <class 'float'> found, value: 1.8263596267666997
       | fatalInstance: Odps/meta_dev_202506220642291g87d6xot20d_SQL_0_0_0_job_0/M1#0_0
      
      • 未開啟網路訪問的情況下訪問

      def request_aliyun_com(row):
          import requests
      
          url = "https://github.com/aliyun/alibabacloud-odps-maxframe-client"
          response = requests.get(url)
          return response.text
      
      
      df.apply(
          request_aliyun_com, axis=1, dtypes={"content": np.str_}, output_type="dataframe"
      ).execute()
      

      對應的錯誤資訊:

      ScriptError: ODPS-0123055: InstanceId: 20250622070516226gzo61d9idlr
      ODPS-0123055:User script exception - Traceback (most recent call last):
        File "/usr/ali/python3.11.7/lib/python3.11/site-packages/urllib3/connection.py", line 196, in _new_conn
          sock = connection.create_connection(
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        File "/usr/ali/python3.11.7/lib/python3.11/site-packages/urllib3/util/connection.py", line 85, in create_connection
          raise err
        File "/usr/ali/python3.11.7/lib/python3.11/site-packages/urllib3/util/connection.py", line 73, in create_connection
          sock.connect(sa)
      ConnectionRefusedError: [Errno 111] Connection refused
      
  • 解決方案

    1. 對於異常報錯,需要分析棧資訊,找到導致報錯的函數,然後嘗試修複。

    2. 修複之後可以嘗試在本地執行,只需要構造對應的資料在本地當作普通的Python函數調用即可。例如:

    def udf_func(row):
        import json
    
        text = row["json_text"]
        data = json.loads(text)
        return data
    
    # 構造輸入傳入,在本地測試函數邏輯
    udf_func(pd.Series(['{"hello": "maxfrmae"}'], index=["json_text"]))
    
    1. 對於網路訪問的問題,需要開啟網路訪問,參考網路開通流程

    2. 對於還原序列化失敗,請仔細檢查是否有非預期的依賴被引入,以及是否報錯提示的依賴有正確的使用pythonpack安裝或者使用resource攜帶到運行環境中。

問題14:ODPS-0123144: Fuxi job failed - kInstanceMonitorTimeout CRASH_EXIT, usually caused by bad udf performance

  • 錯誤原因:UDF運行逾時。

  • 錯誤資訊解釋

    在UDF運行中,可能會出現kInstanceMonitorTimeout或者CRASH_EXIT, usually caused by bad udf performance的錯誤資訊。

    這通常意味著UDF運行逾時了。在MaxCompute離線計算情境中,UDF通常按batch rows來監控已耗用時間,如果某個UDF在M時間裡沒有運行完 N條,就會導致逾時失敗,配置方式如下:

    from maxframe import options
    options.sql.settings = {
        # batch 大小,預設 1024,最小 1
        "odps.sql.executionengine.batch.rowcount": "1",
        # batch 逾時時間,預設 1800,最大 3600
        "odps.function.timeout": "3600",
    }
    
  • 解決方案

    根據實際情況,修改batch大小和batch逾時時間。

問題15:ODPS-0123144: Fuxi job failed - fuxi job failed, Job exceed live limit

  • 錯誤原因:MaxCompute 的作業有最大逾時時間,預設為24小時,超過24小時就會導致作業運行失敗。

  • 錯誤資訊解釋

    調度系統認為作業逾時,殺掉了作業,作業本身會顯示 Failed 狀態。如果是 DataWorks 上啟動並執行作業,可能會有另外的逾時時間,需要詢問 DataWorks 團隊(會呈現 Cancel 狀態)。

  • 解決方案

    根據實際需要調整作業最大運行時間長度。

    from maxframe import options
    
    # 設定 MaxFrame Session 最長存留時間
    options.session.max_alive_seconds = 72 * 60 * 60
    # 設定 MaxFrame Session 最長空閑逾時時間
    options.session.max_idle_seconds = 72 * 60 * 60
    options.sql.settings = {
        # 設定 SQL 作業最長已耗用時間,預設 24h,最長 72h
        "odps.sql.job.max.time.hours": 72,
    }
    

問題16:0130071:[0,0] Semantic analysis exception - physical plan generation failed: unable to retrive row count of file pangu://xxx

  • 錯誤原因:使用 odps.sql.split.dop 等Flag指定切分任務數量時,可能會出現該錯誤。

  • 錯誤資訊解釋

    通常表示在源表寫入時未產生 meta 檔案,無法直接擷取到源表的元資訊,因此無法對源表進行精確切分。

  • 解決方案

    1. 使用 odps.stage.mapper.split.size 進行代替,單位是 MB,預設是 256,最小為 1。

    2. 必要精確切分時,請考慮重建cmf,請聯絡MaxCompute團隊

      此外,如果考慮寫出表時需要確保meta檔案的產生,可以考慮添加如下Flag:

      from maxframe import options
      
      options.sql.settings = {
          "odps.task.merge.enabled": "false",
          "odps.sql.reshuffle.dynamicpt": "false",
          "odps.sql.enable.dynaparts.stats.collection": "true",
          "odps.optimizer.dynamic.partition.is.first.nth.value.split.enable": "false",
          "odps.sql.stats.collection.aggressive":"true",
      }
      

      我們後續會考慮更優的方式確保精確 split 功能的穩定性。

問題17:ODPS-0130071:[x,y] Semantic analysis exception

  • 錯誤原因:ReadOdpsQuery情境中如果出現該錯誤,通常表示 SQL 本身存在語義問題。

  • 錯誤資訊解釋

    通常表示 SQL 本身存在語義問題。

  • 解決方案

    1. 檢查SQL文法。

    2. 升級MaxFrame用戶端,pip install --upgrade maxframe;

    3. 如果還不能解決請聯絡MaxFrame團隊。

問題18:ODPS-0020041:StringOutOfMaxLength:String length X is larger than maximum Y

  • 錯誤原因:向表中寫入資料時,或shuffle過程中,出現了超長的字串,字串長度超過了允許的最大長度。

  • 錯誤資訊解釋

    MaxCompute中為了確保計算的穩定性,在儲存層面限制了最大的單個可讀寫的字串長度。最大為268435456。

  • 解決方案

    1. 考慮截斷或丟棄可能出錯的資料,在ReadOdpsQuery中可以使用LENGTH過濾。

    2. 考慮壓縮資料存入,例如 gzip 等,可能會明顯縮小字串長度和大小。

    def compress_string(input_string):
      """
        Compresses a string using gzip.
        """
      encoded_string = input_string.encode('utf-8')
      compressed_bytes = gzip.compress(encoded_string)
      return compressed_bytes
    
    1. 聯絡MaxCompute團隊支援特定資料。

問題19:ODPS-0010000:System internal error - fuxi job failed, caused by: process exited with code 0

  • 錯誤原因:包含 UDF/AI Function 的作業運行失敗。

  • 錯誤資訊解釋

    通常表示 UDF/AI Function 運行過程中出現了 OOM。

  • 解決方案

    1. 聯絡MaxCompute團隊確認實際記憶體使用量。

    2. 使用更大的記憶體運行UDF或者AI Function

      對於 UDF,可以使用 @with_running_options 設定記憶體。

      @with_running_options(memory="8GB")
      def udf_func(row):
          return row
      

      對於 AI Function,可以在函數中設定 running_options={"memory": "8GB"} 設定記憶體。

問題20:ODPS-0123131:User defined function exception - internal error - Fatal Error Happended

  • 錯誤原因:讀寫外表情境。

  • 錯誤資訊解釋:通常表示讀寫外表過程中出現了一些內部錯誤。

  • 解決方案:聯絡MaxCompute團隊

問題21:ODPS-0010000:System internal error - com.aliyun.odps.metadata.common.MetastoreServerException: 0420111:Database not found

  • 錯誤原因:讀寫表時無法找到指定的 schema/project/table 等資訊。

  • 錯誤資訊解釋:計算中依賴的中繼資料無法被找到,作業無法正常運行。

  • 解決方案

    1. 檢查 SQL 中使用的 project.schema.table 等資訊是否正確,修改後重試。

    2. 聯絡MaxCompute團隊。

問題22:ODPS-0010000:System internal error - fuxi job failed, caused by: process killed by signal 7

  • 錯誤原因:包含 UDF 的作業運行失敗。

  • 錯誤資訊解釋:UDF運行時發出異常訊號。

  • 解決方案

    1. 檢查是否在 UDF 中使用 signal 向進程發送了 cancel,timeout 等訊號。

    2. 聯絡 MaxCompute 團隊排查。

問題23:ODPS-0010000:System internal error - fuxi job failed, caused by: StdException:vector::_M_range_insert

  • 錯誤原因:UDF 相關作業。

  • 錯誤資訊解釋:UDF 中運行時無法申請到足夠的記憶體,插入 vector 失敗,需要檢查業務代碼、依賴庫和記憶體設定。

  • 解決方案

    1. 檢查 UDF 中是否有記憶體問題,native 依賴庫是否存在記憶體問題,版本是否最新,調大 UDF 記憶體申請量。

    2. 聯絡 MaxCompute 團隊排查。

問題24:ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: task:M1 instance count exceeds limit 99999

  • 錯誤原因:源表比較大的情境下,任何作業都有可能。如果錯誤地設定了 split flag,可能也會導致該問題。

  • 錯誤資訊解釋

    MaxCompute SQL 作業中,在沒有任何設定的情況下,預設按 256MB 大小對源表進行分塊分散式處理,但如果按 256MB 切分後,總共切分出的塊數量超過 99999,就會導致該錯誤。

  • 解決方案

    1. 使用 odps.stage.mapper.split.size 代替,單位是 MB,預設是 256,最小為 1,可以設定到更大的參數確保切分總數小於 99999。

    2. 使用 odps.sql.split.dop 代替,最小為1,指定切分預期目標數量。

    3. 在各種條件限制下,最終切出來的資料數量可能不等於預期目標數量,因此壓著上限設定切分數可能報錯。如果上述兩種方法多次調整後均不生效,請聯絡 MaxCompute 團隊。

問題25:ODPS-0110061:Failed to run ddltask - ODPS-0130131:Table not found

  • 錯誤原因:MaxFrame 長時間啟動並執行作業(超過一天)可能出現該錯誤。

  • 錯誤資訊解釋

    MaxFrame 內部 ddltask 運行失敗,通常為單個 stage 的計算步驟已耗用時間超過 24h 的情況下,同 session 上遊節點的表到期了。

    這類表通常為計算過程中產生的暫存資料表,即 df.execute() 調用後產生的表。to_odps_table 指定的結果表通常不會有該問題出現。

  • 解決方案

    對暫存資料表設定更大的到期時間,單位為天,預設情況下暫存資料表的到期時間是 1 天。如果計算作業的多個運算元可能跨天,通常需要設定該參數。

    options.sql.settings = {
        "session.temp_table_lifecycle": 3,
    }
    

問題26:NoTaskServerResponseError

  • 錯誤原因:Jupyter Notebook中,MaxFrame建立了 session並運行了部分作業後,停頓了超過 1h,再向下運行指令碼時,可能會出現該錯誤。

  • 錯誤資訊解釋

    MaxFrame Session 已經到期,找不到對應的 Session 了。

  • 解決方案

    1. 重新建立 Session,但 cell 前的計算狀態不會被保留下來。

    2. 如果有預期的可能會間隔一段時間,並希望可以繼續運行,需要設定

    from maxframe import options
    
    # 設定為 24h 到期,預設 1h
    options.session.max_idle_seconds = 60 * 60 * 24
    

問題27:IntCastingNaNError: Cannot convert non-finite values (NA or inf) to integer: Error while type casting for column 'xx'

  • 錯誤原因:有列類型為BIGINT或者為INT,但其中包含了NULL或者INF,且print運行結果(也包括在 jyputer notebook 中的自動列印)。

  • 錯誤資訊解釋

    MaxFrame 的資料構建在 DataFrame 之上,在本地載入資料時,資料會被轉換為 Pandas DataFrame。在 Pandas 中,BIGINT和INT類型的資料均不能為 NULL(會被作為FLOAT)。

  • 解決方案

    MaxFrame 團隊正著手解決這個問題,但類型系統較為複雜,目前還不能給出明確的時間。暫時可考慮如下方法:

    1. 列印之前使用 fillna 填充NULL

    2. 列印之前使用 astype 轉換為FLOAT

    3. 非必要情況不要列印該列。

問題28:ODPS-0010000:System internal error - fuxi job failed, SQL job failed after failover for too many times

  • 錯誤原因

    1. 包含 Reduce/Join 的作業

    2. 且設定了較大的 split.dop 或者較小的 split.size,產生了大量的 mapper instance

    3. 且設定了較大的 reducer.num/joiner.num,產生了大量的 reducer/joiner instance

  • 錯誤資訊解釋

    Shuffle 資料過大,導致 Job Master OOM。

  • 解決方案

    1. 調小 mapper 和 reducer/joiner 的數量,最大不要超過 10000

    2. 聯絡 MaxCompute 團隊。

問題29:ODPS-0010000:System internal error - task/common/task_resource_helper.cpp(747): OdpsException: ODPS-0020011:Invalid parameter - Total resource size must be <= 2048MB

  • 錯誤原因:包含 UDF 的作業,且 UDF 依賴了較大的 Resource。

  • 錯誤資訊解釋

    UDF 允許依賴的資源的總大小為 2048MB,超過的作業將無法運行。

  • 解決方案

    嘗試使用 external volume 加速的方式從 oss 下載對應的資源,具備更快的下載速率和更高的限制。

問題30:ODPS-0130071:[22,132] Semantic analysis exception - column values_list in source has incompatible type ARRAY/MAP/STRUCT

  • 錯誤原因:處理的資料包含了數組、字典、結構體。

  • 錯誤資訊解釋

    1. 可能是型別宣告問題,預期的目標列並非數組、字典、結構體。

    2. 可能是 MaxFrame 類型系統的 BUG。

  • 解決方案

    1. 升級 MaxFrame 用戶端 pip install -U maxframe 後重試

    2. 聯絡 MaxFrame 團隊進行排查

問題31:Shuffle output too large

解決方案:使用 odps.sql.sys.flag.fuxi_JobMaxInternalFolderSize flag 指定Shuffle 空間大小,單位是 MB。