漸進式計算(Progressive Computing)是處於傳統的Realtime Compute和批處理之間的一種計算方式,具有高資源使用率和低延遲的優勢。本文為您介紹漸進式計算的基礎配置、作業調優配置以及使用樣本。
背景資訊
漸進式計算能夠處理增量資料並維護中間結果資料,提高了在計算資源消耗、執行時間調度、查詢延遲、資料處理粒度等方面的靈活性。例如在範圍查詢(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%。
說明由於範圍查詢情境在第一次使用漸進式計算時,需要計算出每一天的中間結果,因此部分作業的已耗用時間會比普通模式還要長,建議使用者先手動在漸進式計算模式下運行一次,以免在基準時段第一次運行影響結果產出時間。
由於漸進式計算會儲存每天的中間結果,因此會佔用額外的儲存空間,中間結果會在不再會被使用的時候自動回收。額外空間開銷成本和運行開銷成本相比,總體上漸進式計算仍然會節省費用,運行速度更快。
漸進式計算基礎配置
第一次開啟漸進式計算時,建議先在開發環境進行測試,確保效能達到預期效果後再在生產環境啟用。請您按如下步驟配置漸進式計算:
在提交作業時配置漸進式計算。
配置格式:
set odps.progressive.enable=[true|false];參數說明:
true:表示使用漸進式計算方式處理提交的作業。
false:預設值為false。關閉漸進式計算方式。
配置漸進式計算模式:
配置格式:
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:輸入資料為本年所有資料。適用於計算從當前年一月一日開始到當前的作業。
(可選)如果漸進式計算模式為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小時。
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;
漸進式計算調優配置
強制設定中間表格儲存體方式為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;
說明請您根據實際作業運行情況設定作業並發啟動並執行最大執行個體數,執行個體數設定過大或者過小均會影響實際運行效率。
漸進式計算使用樣本
第一天新增作業。
使用漸進式計算方式查詢時間列範圍為[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';第二天(第二次)查詢。
第一天執行作業指令碼後,系統會根據每一個分區的資料進行計算,並將計算結果以天為單位儲存到7個中間表中。在第二天查詢時間列範圍為[20200802,20200808]的資料時,首先會單獨計算20200808列的資料,再和第一次運行產生7個中間表的資料整合起來得到最終結果。