すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:MaxFrame のよくある質問

最終更新日:Dec 27, 2025

このトピックでは、MaxFrame でよく発生するエラーについて説明します。

問題 1:エラー「invalid type INT for function UDF definition, you need to set odps.sql.type.system.odps2=true; to use it」

  • 原因: このエラーは、MaxCompute V2.0 データの型を使用しているにもかかわらず、MaxCompute V2.0 データの型バージョンが有効になっていないために発生します。これにより、実行中にジョブが失敗します。

  • 解決策:この問題を解決するには、フラグを使用して MaxCompute V2.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"]

  # その後、関連するモデル API を呼び出します。
  

次の例は、リソースを破棄する必要がある 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()):
  # コネクタ内のデータベース接続を直接呼び出します。UDF 内で再度接続を作成およびクローズする必要はありません。
  connector.conn.execute("xxxxx")
  
説明

初期化が実行される回数は、UDF ワーカーの数によって異なります。各ワーカーは個別の Python 環境を持っています。たとえば、UDF 呼び出しが 100,000 行のデータを処理し、タスクが 10 個の UDF ワーカーに割り当てられた場合、各ワーカーは 10,000 行を処理します。この場合、初期化は合計 10 回実行されます。各ワーカーに対して、初期化プロセスは一度だけ実行されます。

問題 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 などの UDF を使用するメソッドでエラー「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` を指定して UDF の戻り値の型を MaxFrame に通知します。例:

    • int 型の列を 1 つ含む DataFrame を返す場合: df.apply(..., dtypes=pd.Series([np.int_]), output_type="dataframe")

    • A と B の 2 つの列を含む 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 と同じ方法でフラグを追加する方法

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 文字列フィールドを解析する方法

MaxFrame V1.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_requirementsforce_rebuild=True を追加します。

    3. または、PythonPack を使用して依存関係をインストールすることを回避できます。必要な依存関係をオフラインでパッケージ化し、MaxFrame リソースとしてアップロードしてから、ジョブで参照できます。MaxFrame は自動的に依存関係を呼び出し可能なコンテキストに追加します。

      PyODPS-Pack は、このプロセスを簡素化するツールです。PyODPS-Pack は、互換性の問題を回避するために、同じ環境の manylinux Docker コンテナーを自動的に読み込んでパッケージングします。現在、X86 Linux マシンで実行されます。M シリーズの ARM チップを搭載した Apple デバイスは、現時点ではサポートされていません。

      MaxFrame で MaxCompute リソースを使用するには、@with_resources を使用します。

問題 13: ODPS-0123055:User script exception

  • 原因: これは MaxFrame で最も一般的なタイプのエラーです。このエラーは、applyapply_chunkflatmapmap、および transform などのオペレーターで UDF を実行する際に発生します。エラーメッセージは、送信された UDF が Python の例外をスローしたことを示しています。主な原因は次のとおりです。

    • コードに論理エラーがあります。コードのロジックを確認してください。

    • エラー処理ロジックに欠陥があり、未処理の例外をスローします。try-except ブロックが、考えられるすべての例外を正しく処理するかどうかを確認してください。

    • UDF がネットワークにアクセスしています。デフォルトでは、MaxCompute UDF コンテナーではネットワークアクセスが無効になっています。

    • オペレーターで `dtype` または `dtypes` を使用して宣言された出力型が、UDF によって返される実際の型と一致しません。

    • UDF が、ランタイム環境にない依存関係を参照しています。これにより、ユーザーのコードが正しく逆シリアル化されなくなります。

  • エラーメッセージの説明

    ODPS-0123055:User script exception エラーのほとんどは Python の例外です。失敗したインスタンスの stderr を確認できます。

    たとえば、JSON 以外の文字列に対して JSON 読み込み操作を実行するとエラーが発生します。これはデータ処理でよくある問題です。

    def simple_failure(row):
        import json
    
        text = row["json_text"]
        data = json.loads(text)
        return data
    
    
    df = md.read_pandas(pd.DataFrame({"json_text": ["123", "456", "789"]}))
    df.apply(
        simple_failure, axis=1, dtypes={"text": np.str_}, output_type="dataframe"
    ).execute()
    

    対応するエラーメッセージは以下のとおりです。メッセージには、エラーが simple_failure 関数の 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")))
      
      # A という名前の str 列を含む DataFrame を返すことを宣言します
      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 を使用して正しくインストールされたか、またはリソースとしてランタイム環境に含まれているかを確認してください。

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

  • 原因:UDF がタイムアウトしました。

  • エラーメッセージの説明

    UDF の実行中に、kInstanceMonitorTimeoutCRASH_EXIT (通常は UDF のパフォーマンス不良が原因) などのエラーメッセージが表示されることがあります。

    このエラーは通常、UDF がタイムアウトしたことを意味します。MaxCompute のオフラインコンピューティングシナリオでは、UDF の実行時間は通常、行バッチによって監視されます。UDF が指定された時間内に指定された行数の処理を完了しない場合、タイムアウトして失敗します。関連する構成は次のとおりです。

    from maxframe import options
    options.sql.settings = {
        # バッチサイズ。デフォルト:1024。最小値:1。
        "odps.sql.executionengine.batch.rowcount": "1",
        # バッチタイムアウト。デフォルト:1800。最大値:3600。
        "odps.function.timeout": "3600",
    }
    
  • 解決策

    必要に応じて、バッチサイズとバッチタイムアウトを変更します。

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

  • 原因:MaxCompute ジョブには最大タイムアウト期間があります。デフォルトは 24 時間です。ジョブが 24 時間を超えて実行されると、失敗します。

  • エラーメッセージの説明

    CDN マッピングシステムは、ジョブがタイムアウトしたと判断し、ジョブを終了します。ジョブのステータスは「失敗」に変わります。ジョブが DataWorks で実行されている場合、異なるタイムアウト期間が適用される場合があります。詳細については、DataWorks チームにお問い合わせください。この場合、ジョブのステータスは「キャンセル」になります。

  • 解決策

    必要に応じて、最大ジョブ実行時間を調整できます。

    from maxframe import options
    
    # MaxFrame セッションの最大生存時間を設定します
    options.session.max_alive_seconds = 72 * 60 * 60
    # MaxFrame セッションの最大アイドルタイムアウトを設定します
    options.session.max_idle_seconds = 72 * 60 * 60
    options.sql.settings = {
        # SQL ジョブの最大実行時間を設定します。デフォルト:24 時間。最大:72 時間。
        "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 などのフラグを使用して分割タスクの数を指定すると、このエラーが発生することがあります。

  • エラーメッセージの説明

    このエラーは通常、データがソーステーブルに書き込まれたときにメタファイルが生成されなかったことを示します。その結果、ソーステーブルのメタデータを直接取得できず、ソーステーブルを正確にチャンク化できません。

  • 解決策

    1. 代わりに odps.stage.mapper.split.size フラグを使用してください。単位はメガバイト (MB) です。デフォルト値は 256、最小値は 1 です。

    2. 正確なチャンク化が必要な場合は、CMF の再生成を検討してください。これを行うには、MaxCompute チームにお問い合わせください。

      さらに、テーブルへの書き込み時にメタファイルが生成されるようにするには、次のフラグを追加できます。

      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",
      }
      

      将来的には、正確な分割機能の安定性を確保するためのより良い方法を検討します。

問題 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

  • 原因:テーブルへのデータ書き込み中またはシャッフルプロセス中に、大きすぎる文字列が検出されました。文字列の長さが許容される最大長を超えています。

  • エラーメッセージの説明

    コンピューティングの安定性を確保するため、MaxCompute はストレージレイヤーで読み書き可能な単一文字列の最大長を 268,435,456 文字に制限しています。

  • 解決策

    1. エラーの原因となっている可能性のあるデータを切り捨てるか破棄することを検討してください。ReadOdpsQuery では、LENGTH を使用してデータをフィルタリングできます。

    2. 保存する前に、gzip などを使用してデータを圧縮することを検討してください。これにより、文字列の長さとサイズを大幅に削減できます。

    def compress_string(input_string):
      """
        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 関数を含むジョブが失敗します。

  • エラーメッセージの説明

    これは通常、UDF または AI 関数の実行中にメモリ不足 (OOM) エラーが発生したことを示します。

  • 解決策

    1. MaxCompute チームに連絡して、実際のメモリ使用量を確認します。

    2. より多くのメモリを使用して UDF または AI 関数を実行します。

      UDF の場合、@with_running_options を使用してメモリを設定できます。

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

      AI 関数では、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

  • 原因:テーブルの読み取りまたは書き込み時に、指定されたスキーマ、プロジェクト、またはテーブル情報が見つかりません。

  • エラーメッセージの説明:計算が依存するメタデータが見つかりません。その結果、ジョブを実行できません。

  • 解決策

    1. SQL で使用されているプロジェクト、スキーマ、およびテーブル情報が正しいかどうかを確認します。正しくない場合は、情報を修正して操作をリトライします。

    2. MaxCompute チームにお問い合わせください。

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

  • 原因:UDF を含むジョブが失敗します。

  • エラーメッセージの説明:UDF はランタイム中に異常な信号を送信します。

  • 解決策

    1. UDF が信号を使用してキャンセル、タイムアウト、またはその他の信号をプロセスに送信しているかどうかを確認します。

    2. トラブルシューティングについては、MaxCompute チームにお問い合わせください。

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

  • 原因:このエラーは、UDF を含むジョブに関連しています。

  • エラーメッセージの説明:UDF はランタイムで十分なメモリを要求できないため、ベクターの挿入が失敗します。ビジネスコード、依存ライブラリ、およびメモリ設定を確認してください。

  • 解決策

    1. UDF のメモリ問題を確認します。ネイティブの依存ライブラリにメモリ問題があるかどうか、またそれらが最新バージョンであるかどうかを確認します。UDF によって要求されるメモリを増やします。

    2. トラブルシューティングについては、MaxCompute チームにお問い合わせください。

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

  • 原因:ソーステーブルが大きい場合、どのジョブでも発生する可能性があります。分割フラグを誤って設定することも、この問題の原因となる可能性があります。

  • エラーメッセージの説明

    MaxCompute SQL ジョブでは、設定が構成されていない場合、ソーステーブルはデフォルトでチャンク化され、分散方式で処理されます。デフォルトのチャンクサイズは 256 MB です。作成されたチャンクの総数が 99,999 を超えると、このエラーが発生します。

  • 解決策

    1. odps.stage.mapper.split.size フラグを使用します。単位はメガバイト (MB) です。デフォルト値は 256 で、最小値は 1 です。より大きい値を設定して、チャンクの総数が 99,999 未満になるようにします。

    2. odps.sql.split.dop フラグを使用します。最小値は 1 です。このフラグは、期待されるターゲットチャンク数を指定します。

    3. さまざまな制約により、最終的なチャンク数が期待されるターゲット数と等しくならない場合があります。チャンク数を上限に近づけて設定すると、エラーが発生する可能性があります。複数回調整しても両方の方法が失敗する場合は、MaxCompute チームにお問い合わせください。

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

  • 原因:このエラーは、1 日以上実行される長時間実行の MaxFrame ジョブで発生する可能性があります。

  • エラーメッセージの説明

    内部の MaxFrame データ定義言語 (DDL) タスクが失敗します。この失敗は通常、単一の計算ステージが 24 時間以上実行され、同じセッション内の先祖ノードのテーブルが期限切れになった場合に発生します。

    これらのテーブルは通常、計算プロセス中に作成される一時テーブルであり、具体的には df.execute() の呼び出し後に生成されます。to_odps_table で指定されたシンクテーブルでは、通常この問題は発生しません。

  • 解決策

    一時テーブルに長い生存時間 (TTL) を設定します。単位は日です。デフォルトでは、一時テーブルの TTL は 1 日です。コンピューティングジョブに複数のオペレーターがあり、それらが異なる日にまたがって実行される可能性がある場合は、このパラメーターを設定する必要があります。

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

問題 26:NoTaskServerResponseError

  • 原因:Jupyter Notebook で MaxFrame セッションを作成し、いくつかのジョブを実行します。その後、次のスクリプトを実行する前に 1 時間以上一時停止します。このエラーが発生する可能性があります。

  • エラーメッセージの説明

    MaxFrame セッションが期限切れになり、見つかりません。

  • 解決策

    1. セッションを再作成します。ただし、前のセルからの計算状態は保持されません。

    2. 一時停止が予想され、後でジョブの実行を続行したい場合は、次のパラメーターを設定する必要があります。

    from maxframe import options
    
    # 有効期限を 24 時間に設定します。デフォルトは 1 時間です。
    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 値が含まれており、結果が出力されます。これには、Jupyter Notebook での自動出力も含まれます。

  • エラーメッセージの説明

    MaxFrame データは DataFrame 上に構築されます。データがローカルに読み込まれると、pandas DataFrame に変換されます。pandas では、BIGINT および INT 型のデータは NULL にできません。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` 値が設定されており、多くのマッパーインスタンスが生成されます。

    3. 大きな `reducer.num` 値または `joiner.num` 値が設定されており、多くのリデューサーまたはジョイナーインスタンスが生成されます。

  • エラーメッセージの説明

    シャッフルデータが大きすぎるため、Job Master のメモリ不足 (OOM) エラーが発生します。

  • 解決策

    1. マッパーとリデューサー/ジョイナーの数を減らします。最大数は 10,000 を超えないようにしてください。

    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 が大きなリソースに依存しています。

  • エラーメッセージの説明

    UDF が依存できるリソースの合計サイズは 2048 MB です。この制限を超えるジョブは実行できません。

  • 解決策

    外部ボリュームアクセラレーションを使用して、Object Storage Service (OSS) から対応するリソースをダウンロードしてみてください。この方法では、ダウンロード速度が速くなり、制限も高くなります。

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

  • 原因:処理中のデータに配列、マップ、または構造体が含まれています。

  • エラーメッセージの説明

    1. これは型宣言の問題である可能性があります。期待されるターゲット列が配列、マップ、または構造体型ではありません。

    2. これは MaxFrame 型システムのバグである可能性があります。

  • 解決策

    1. pip install -U maxframe を実行して MaxFrame クライアントをアップグレードし、操作をリトライします。

    2. トラブルシューティングについては、MaxFrame チームにお問い合わせください。

問題 31: Shuffle output too large

解決策:`odps.sql.sys.flag.fuxi_JobMaxInternalFolderSize` フラグを使用して、シャッフルスペースのサイズをメガバイト (MB) 単位で指定します。