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

MaxCompute:プログレッシブ計算

最終更新日:May 29, 2025

プログレッシブ計算は、ストリーム処理とバッチ処理を組み合わせて、リソース効率を向上させ、クエリ レイテンシを削減する方法です。このトピックでは、プログレッシブ計算の基本構成とチューニング構成について説明し、ジョブ スクリプトの例を示します。

背景情報

プログレッシブ計算では、増分データがキャプチャされ、中間結果が保持されます。これにより、リソース消費とクエリ レイテンシが削減され、実行スケジューリングとデータ粒度における柔軟性が向上します。次の例では、範囲クエリを使用して、製品の週間売上合計を計算します。従来のバッチ処理と比較して、プログレッシブ計算では、最初の実行後の各実行で計算負荷が 70% 削減されます。

  • 従来のバッチ処理:

    n+1日目(n>=7)から、n-5日目からn日目までのデータが重複して計算されます。

  • プログレッシブ計算:

    n+1日目(n>=7)から、当日の増分データのみが計算されます。次に、その結果と過去6日間の計算結果を組み合わせて、週間結果を取得します。これにより、冗長処理が排除され、計算負荷が 70% 削減されます。

    説明
    • 範囲クエリに対するプログレッシブ計算の最初の実行では、範囲内の各日の中間結果が計算されるため、バッチ処理よりも時間がかかる場合があります。したがって、ベースライン期間で最適なパフォーマンスを確保するために、事前に手動実行を行うことをお勧めします。

    • プログレッシブ計算中、中間結果は使用されなくなるまで保存されます。追加ストレージのコストは、冗長計算の排除によって相殺されます。したがって、プログレッシブ計算は、従来のバッチ処理よりも費用対効果が高く、高速です。

基本構成

プログレッシブ計算機能を初めて使用する場合は、開発 環境 でパフォーマンスをテストすることをお勧めします。パフォーマンスが期待どおりであれば、本番 環境 でこの機能を使用できます。この機能を使用するには、次の手順を実行します。

  1. ジョブの送信時に機能を有効にします。

    • 形式:

      set odps.progressive.enable=[true|false];
    • パラメーター:

      • true: プログレッシブ計算機能を有効にします。

      • false (デフォルト): プログレッシブ計算機能を無効にします。

  2. 計算モードを構成します。

    • 形式:

      set odps.progressive.range.query.input.partition.pattern=<pattern_value>;
    • パラメーター:

      pattern_value パラメーターの有効値:

      • PASS_BY_HOUR: 時間レベルまたは分レベルの スライドウィンドウ を使用してデータを処理します。適用可能な シナリオ には、過去 5 分間または過去 3 時間のデータのクエリが含まれます。

      • PASS_BY_HOUR_AND_DAY: 複数日の スライドウィンドウ を使用してデータを処理し、最新のウィンドウのデータを時間ごとに異なる パーティション に保存します。適用可能な シナリオ には、過去 3 時間または数日間のデータのクエリが含まれます。

      • PASS_BY_DAY: 複数日の スライドウィンドウ を使用してデータを処理します。適用可能な シナリオ には、過去 3 日間のデータのクエリが含まれます。

      • INCREASING: 複数日にわたる累積ウィンドウを使用してデータを処理し、最新のウィンドウのデータを日ごとに異なる パーティション に保存します。適用可能な シナリオ には、過去 50 日間または過去 3 年間のデータのクエリが含まれます。

      • INCREASING_IN_A_MONTH: 今月の初日から今日までの累積ウィンドウを使用します。

      • INCREASING_IN_A_YEAR: 今年の初日から今日までの累積ウィンドウを使用します。

  3. (オプション) 前の手順で pattern_value パラメーターを PASS_BY_HOUR に設定した場合、ビジネス要件に基づいて、より細かい粒度を表す時間列を指定できます。

    • 形式

      • オプション 1:

        set odps.progressive.range.query.time.partition.col.names=default:<col_name_day>:<col_name_hour>:<col_name_minute>|<col_name_day>:<col_name_hour>:<col_name_minute>|...;
      • オプション 2:

        set odps.progressive.range.query.time.partition.col.names=<table_name>:<col_name_day>:<col_name_hour>:<col_name_minute>|<col_name_day>:<col_name_hour>:<col_name_minute>|...;
      • オプション 3:

        set odps.progressive.range.query.time.partition.col.names=default:<col_name_day>:<col_name_hour>:<col_name_minute>,<table_name>:<col_name_day>:<col_name_hour>:<col_name_minute>,..;
    • パラメーター:

      • default: 指定された 条件 を満たすすべてのテーブルが検索されることを指定します。このパラメーターはキーワードです。

      • table_name: 時間列 をクエリするテーブルの名前を指定します。複数のテーブルを指定できます。例: set odps.progressive.range.query.time.partition.col.names=table_1:day:hour,table_2:hour:minute;

      • <col_name_day>:<col_name_hour>:<col_name_minute>: クエリする 時間列 を指定します。複数の列を指定できます。例: set odps.progressive.range.query.time.partition.col.names=table_1:day:hour|day:hour2,table_2:day:hour:minute|day:hour2;

    • 構成例:

      1. 1時間ごとにプログレッシブ計算を実行します。

        set odps.progressive.range.query.input.partition.pattern=PASS_BY_HOUR:1;
      2. より細かい粒度の 時間列 を指定します。

        set odps.progressive.range.query.time.partition.col.names=default:ds:hh|dt:hour;

チューニング構成

  • 中間テーブルのストレージ方法を指定します。

    プログレッシブ計算では、中間テーブルのデータは計算前にシャッフルされます。計算パフォーマンスを向上させるには、次の 構成 を追加して、中間テーブルをクラスタテーブルとして保存します。

    • 形式:

      set range.query.force.cluster.table=[true|false];
    • パラメーター:

      • true: 中間テーブルをクラスタテーブルとして保存します。

      • false (デフォルト): シャッフル操作の有無に基づいて、システムがストレージメソッドを自動的に選択します。

        説明

        このパラメーターを true に設定することをお勧めします。

  • 同時 インスタンス の最大数を指定します。

    プログレッシブ計算の最初の実行は、指定された時間範囲内のすべてのデータが処理されるため、リソースを大量に消費します。最初の実行中に過剰なリソース消費を防ぐために、次の 構成 を追加することをお勧めします。

    • 形式:

      set odps.progressive.combine.exec.time.limit.num=<number>;
    • パラメーター:

      number: 同時インスタンスの最大数。デフォルト値:15。このパラメーターを 1 以上の値に設定します。

      説明

      ジョブの実際の稼働状況に基づいて値を指定します。不適切な値は実行効率に影響します。

例

  1. 最初の実行

    このプログレッシブ計算の例では、複数日のスライド タイムウィンドウ が使用されます。クエリする最初の タイムウィンドウ は [20200801,20200807] です。ジョブ スクリプトの例:

    set odps.progressive.enable=true;
    set odps.progressive.range.query.input.partition.pattern=PASS_BY_DAY;
    
    CREATE TABLE adl_aegis_webshell_test_neoke AS
    SELECT
    request_datetime,host,uri,src_ip,src_port,dst_ip,dst_port,method,post_data,user_agent,ret_code,cookie,
    referer,x_forward_for,rsp_content_type,rqs_content_type,content_length,jump_location,set_cookie,ttl,
    get_bigwebshell_uri(uri) AS nopar_uri,internet_ip
    FROM secbase.adl_aegis_webshell_newadd_beaverlog
    WHERE ds >= TO_CHAR(DATEADD(TO_DATE('20200807','yyyymmdd'),-6,'dd') ,'yyyymmdd')
    AND ds <= '20200807';
    // プログレッシブ計算を有効にします。
    // 計算モードを日単位のウィンドウに設定します。
    // 20200801 から 20200807 までのデータを処理します。
    
  2. 2回目以降の実行

    最初の実行では、システムは各 パーティション の結果を計算し、7 つの中間テーブルに結果を保存します。各テーブルは、指定された タイムウィンドウ 内の 1 日に対応します。2 日目の 2 回目の実行では、ジョブは タイムウィンドウ [20200802, 20200808] 内のデータを処理します。20200808 列に対応するデータは個別に計算され、7 つの中間テーブルの結果と組み合わされて最終結果が得られます。