漸進式計算(Progressive Computing)是處于傳統的流計算和批處理之間的一種計算方式,具有高資源利用率和低延遲的優勢。本文為您介紹漸進式計算的基礎配置、作業調優配置以及使用示例。

背景信息

漸進式計算能夠處理增量數據并維護中間結果數據,提高了在計算資源消耗、執行時間調度、查詢延遲、數據處理粒度等方面的靈活性。例如在范圍查詢(Range Query)場景下(即查詢一段時間范圍內的數據),使用傳統批處理方式和漸進式計算方式每次統計過去一周的產品總銷量,漸進式計算方式除首次執行外,其余每次執行的計算量減少了70%。如下所示:
  • 傳統批處理方式:
    第n(n>=7)天執行需要處理[n-6,n]區間的數據;第n+1天執行需要處理[n-5,n+1]區間的數據。可以看出,第n+1天執行過程中有6天的數據是被重復計算的。如下圖所示:重復數據圖
  • 漸進式計算方式:
    第n(n>=7)天執行需要處理[n-6,n]區間的數據;第n+1天執行需要處理[n,n+1]區間的數據。即第n+1天執行只需要處理當天的增量數據,再和之前6天計算好的數據整合后得到過去一周的結果。第n+1天執行時的數據不會被重復計算,因此計算量減少了70%。
    說明
    • 由于范圍查詢場景在第一次使用漸進式計算時,需要計算出每一天的中間結果,因此部分作業的運行時間會比普通模式還要長,建議用戶先手動在漸進式計算模式下運行一次,以免在基線時段第一次運行影響結果產出時間。
    • 由于漸進式計算會存儲每天的中間結果,因此會占用額外的存儲空間,中間結果會在不再會被使用的時候自動回收。額外空間開銷成本和運行開銷成本相比,總體上漸進式計算仍然會節省費用,運行速度更快。

漸進式計算基礎配置

第一次開啟漸進式計算時,建議先在開發環境進行測試,確保性能達到預期效果后再在生產環境啟用。請您按如下步驟配置漸進式計算:
  1. 在提交作業時配置漸進式計算。
    • 配置格式:
      set odps.progressive.enable=[true|false];
    • 參數說明:
      • true:表示使用漸進式計算方式處理提交的作業。
      • false:默認值為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小時或最近3天的數據。
      • PASS_BY_DAY:輸入數據為多天且非遞增。適用于查詢最近3天的數據。
      • INCREASING:輸入數據為多天且遞增,最近時間范圍內的一個分區按天分區存儲。適用于查詢最近50天或最近3年的數據。
      • INCREASING_IN_A_MONTH:輸入數據為本月所有數據。適用于計算從當前月一日開始到當前的作業。
      • INCREASING_IN_A_YEAR:輸入數據為本年所有數據。適用于計算從當前年一月一日開始到當前的作業。
  3. (可選)如果漸進式計算模式為PASS_BY_HOUR時,您需根據實際作業周期長短,配置更細粒度時間列名。如果漸進式計算為其他模式,則不需要配置。
    • 配置格式
      • 格式一:
        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>|...;
      • 格式二:
        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>|...;
      • 格式三:
        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. 配置漸進式計算模式的基礎單位為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;

漸進式計算調優配置

  • 強制設置中間表存儲方式為cluster table。
    漸近式計算過程中如果生成中間表,在讀取中間表數據后會將數據重新組合(shuffle)。如果將中間表存儲方式設置為cluster table,計算性能會顯著提高。
    • 配置格式:
      set range.query.force.cluster.table=[true|false];
    • 參數說明:
      • true:強制設置中間表存儲方式為cluster table。
      • false:默認為false。系統會根據是否有shuffle操作,自動選擇不同的存儲方式。
        說明 建議您強制設置為cluster table存儲方式。
  • 設置作業并發運行實例數。
    漸進式計算初次執行時需要刷新涉及漸進式計算周期范圍內的歷史數據,此時會同時運行很多子任務。為了避免資源被全部占用,導致其它作業不能正確運行,建議您設置作業并發運行的最大實例數。
    • 配置格式:
      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';
  2. 第二天(第二次)查詢

    第一天執行作業腳本后,系統會根據每一個分區的數據進行計算,并將計算結果以天為單位保存到7個中間表中。在第二天查詢時間列范圍為[20200802,20200808]的數據時,首先會單獨計算20200808列的數據,再和第一次運行生成7個中間表的數據整合起來得到最終結果。