プログレッシブ計算は、ストリーム処理とバッチ処理を組み合わせて、リソース効率を向上させ、クエリ レイテンシを削減する方法です。このトピックでは、プログレッシブ計算の基本構成とチューニング構成について説明し、ジョブ スクリプトの例を示します。
背景情報
プログレッシブ計算では、増分データがキャプチャされ、中間結果が保持されます。これにより、リソース消費とクエリ レイテンシが削減され、実行スケジューリングとデータ粒度における柔軟性が向上します。次の例では、範囲クエリを使用して、製品の週間売上合計を計算します。従来のバッチ処理と比較して、プログレッシブ計算では、最初の実行後の各実行で計算負荷が 70% 削減されます。
従来のバッチ処理:
n+1日目(n>=7)から、n-5日目からn日目までのデータが重複して計算されます。
プログレッシブ計算:
n+1日目(n>=7)から、当日の増分データのみが計算されます。次に、その結果と過去6日間の計算結果を組み合わせて、週間結果を取得します。これにより、冗長処理が排除され、計算負荷が 70% 削減されます。
説明範囲クエリに対するプログレッシブ計算の最初の実行では、範囲内の各日の中間結果が計算されるため、バッチ処理よりも時間がかかる場合があります。したがって、ベースライン期間で最適なパフォーマンスを確保するために、事前に手動実行を行うことをお勧めします。
プログレッシブ計算中、中間結果は使用されなくなるまで保存されます。追加ストレージのコストは、冗長計算の排除によって相殺されます。したがって、プログレッシブ計算は、従来のバッチ処理よりも費用対効果が高く、高速です。
基本構成
プログレッシブ計算機能を初めて使用する場合は、開発 環境 でパフォーマンスをテストすることをお勧めします。パフォーマンスが期待どおりであれば、本番 環境 でこの機能を使用できます。この機能を使用するには、次の手順を実行します。
ジョブの送信時に機能を有効にします。
形式:
set odps.progressive.enable=[true|false];パラメーター:
true: プログレッシブ計算機能を有効にします。
false (デフォルト): プログレッシブ計算機能を無効にします。
計算モードを構成します。
形式:
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: 今年の初日から今日までの累積ウィンドウを使用します。
(オプション) 前の手順で 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時間ごとにプログレッシブ計算を実行します。
set odps.progressive.range.query.input.partition.pattern=PASS_BY_HOUR:1;より細かい粒度の 時間列 を指定します。
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 以上の値に設定します。
説明ジョブの実際の稼働状況に基づいて値を指定します。不適切な値は実行効率に影響します。
例
最初の実行
このプログレッシブ計算の例では、複数日のスライド タイムウィンドウ が使用されます。クエリする最初の タイムウィンドウ は [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回目以降の実行
最初の実行では、システムは各 パーティション の結果を計算し、7 つの中間テーブルに結果を保存します。各テーブルは、指定された タイムウィンドウ 内の 1 日に対応します。2 日目の 2 回目の実行では、ジョブは タイムウィンドウ [20200802, 20200808] 内のデータを処理します。20200808 列に対応するデータは個別に計算され、7 つの中間テーブルの結果と組み合わされて最終結果が得られます。