中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

解讀Apache Flink狀態(tài)生存時(shí)間特性:如何自動清理應(yīng)用程序狀態(tài)?

2019-07-23    來源:raincent

容器云強(qiáng)勢上線!快速搭建集群,上萬Linux鏡像隨意使用

作者:Fabian Hueske, Andrey Zagrebin

譯者:唐云

對于許多狀態(tài)流式計(jì)算程序來說,一個(gè)常見的需求是自動清理應(yīng)用程序的狀態(tài)(state),以便有效地控制狀態(tài)大小,或者控制程序訪問狀態(tài)的有效時(shí)間(例如受限于諸如 GDPR 等法律條規(guī))。Apache Flink 自 1.6.0 版本引入了狀態(tài)的生存時(shí)間(time-to-live,TTL)功能,使得應(yīng)用程序的狀態(tài)清理和有效的狀態(tài)大小管理成為可能。

在本文中,我們將討論引入狀態(tài)生存時(shí)間特性的動機(jī)并討論其相關(guān)用例。此外,我們還將演示如何使用和配置該特性。同時(shí),我們將會解釋 Flink 如何借用狀態(tài)生存時(shí)間特性在內(nèi)部管理狀態(tài),并對 Flink 1.8.0 中該功能引入的相關(guān)新特性進(jìn)行一些展示。本文章最后對未來的改進(jìn)和擴(kuò)展作了展望。

狀態(tài)的暫時(shí)性

有兩個(gè)主要原因可以解釋為什么狀態(tài)只應(yīng)該維持有限的時(shí)間。先設(shè)想一個(gè) Flink 應(yīng)用程序,它接收用戶登錄事件流,并為每個(gè)用戶存儲上一次登錄時(shí)的相關(guān)事件信息和時(shí)間戳,以改善高頻訪問用戶的體驗(yàn)。

控制狀態(tài)的大小。 狀態(tài)生存時(shí)間特性的主要使用場景,就是能夠有效地管理不斷增長的狀態(tài)大小。通常情況下,數(shù)據(jù)只需要暫時(shí)保存,例如用戶處在一次網(wǎng)絡(luò)連接會話中。當(dāng)用戶訪問事件結(jié)束時(shí),我們實(shí)際上就沒有必要保存該用戶的狀態(tài),來減少無謂的狀態(tài)存儲空間占用。Flink 1.8.0 引入的基于生存時(shí)間的后臺狀態(tài)清理機(jī)制,使得我們能夠自動地對無用數(shù)據(jù)進(jìn)行清理。此前,應(yīng)用程序開發(fā)人員必須采取額外的操作并顯式地刪除無用狀態(tài)以釋放存儲空間。這種手動清理過程不僅容易出錯(cuò),而且效率低下。以上述用戶登錄案例為例,因?yàn)檫@些不活躍用戶的相關(guān)信息會被自動過期清理掉,我們就不再需要額外存儲上次登錄的時(shí)間戳。

符合 (敏感) 數(shù)據(jù)保護(hù)的要求。 隨著數(shù)據(jù)隱私法規(guī)的發(fā)展(例如歐盟頒布的通用數(shù)據(jù)保護(hù)法規(guī) GDPR),遵守此類法規(guī)的相關(guān)要求,或?qū)?shù)據(jù)進(jìn)行敏感處理已經(jīng)成為許多應(yīng)用程序的首要任務(wù)。此類使用場景的典型案例包括需要僅在特定時(shí)間段內(nèi)保存數(shù)據(jù)并防止其后可以再次訪問該數(shù)據(jù)。這對于為客戶提供短期服務(wù)的公司來說是一個(gè)常見的挑戰(zhàn)。狀態(tài)生存時(shí)間這一特性,就保證了應(yīng)用程序僅在有限時(shí)間內(nèi)可以進(jìn)行訪問,有助于遵守?cái)?shù)據(jù)保護(hù)法規(guī)。

這兩個(gè)需求都可以通過狀態(tài)生存時(shí)間來解決,這個(gè)功能在鍵值變得不重要并且不再需要保存在存儲中時(shí),就可以周期性地、持續(xù)地刪除狀態(tài)中的鍵值。

對應(yīng)用狀態(tài)的持續(xù)清理

Apache Flink 的 1.6.0 版本引入了狀態(tài)生存時(shí)間特性。它使流處理應(yīng)用程序的開發(fā)人員能夠配置算子的狀態(tài),使其在定義的生存時(shí)間超時(shí)后被清除。在 Flink 1.8.0 中,該功能得到了進(jìn)一步擴(kuò)展,對 RocksDB 和堆內(nèi)存狀態(tài)后端(FsStateBackend和MemoryStateBackend)的舊數(shù)據(jù)進(jìn)行連續(xù)性的清理。

在 Flink 的DataStream API 中,應(yīng)用程序狀態(tài)是由狀態(tài)描述符(state descriptor)來定義的。狀態(tài)生存時(shí)間是通過將StateTtlConfiguration對象傳遞給狀態(tài)描述符來配置的。下面的 Java 示例演示了如何創(chuàng)建狀態(tài)生存時(shí)間的配置,并將其提供給狀態(tài)描述符,該狀態(tài)描述符將用戶的上次登錄時(shí)間保存為Long值:

import org.apache.flink.api.common.state.StateTtlConfig;
import org.apache.flink.api.common.time.Time;
import org.apache.flink.api.common.state.ValueStateDescriptor;

StateTtlConfig ttlConfig = StateTtlConfig
.newBuilder(Time.days(7))
.setUpdateType(StateTtlConfig.UpdateType.OnCreateAndWrite)
.setStateVisibility(StateTtlConfig.StateVisibility.NeverReturnExpired)
.build();

ValueStateDescriptor<Long> lastUserLogin =
new ValueStateDescriptor<>("lastUserLogin", Long.class);

lastUserLogin.enableTimeToLive(ttlConfig);

Flink 提供了多個(gè)選項(xiàng)來配置狀態(tài)生存時(shí)間:

什么時(shí)候重置生存時(shí)間? 默認(rèn)情況下,當(dāng)狀態(tài)被修改時(shí),生存時(shí)間就會被更新。我們也可以在讀操作訪問狀態(tài)時(shí)更新相關(guān)項(xiàng)的生存時(shí)間,但這樣要花費(fèi)額外的寫操作來更新時(shí)間戳。

已經(jīng)過期的數(shù)據(jù)是否可以訪問? 狀態(tài)生存時(shí)間機(jī)制使用的是惰性策略來清除過期狀態(tài)。這可能導(dǎo)致應(yīng)用程序會嘗試讀取過期但尚未刪除的狀態(tài)。用戶可以配置對這樣的讀取請求是否返回過期狀態(tài)。無論哪種情況,過期狀態(tài)都會在之后立即被刪除。雖然返回已經(jīng)過期的狀態(tài)有利于數(shù)據(jù)可用性,但不返回過期狀態(tài)更符合相關(guān)數(shù)據(jù)保護(hù)法規(guī)的要求。

哪種時(shí)間語義被用于定義生存時(shí)間? 在 Apache Flink 1.8.0 中,用戶只能根據(jù)處理時(shí)間(Processing Time)定義狀態(tài)生存時(shí)間。未來的 Flink 版本中計(jì)劃支持事件時(shí)間(Event Time)。

關(guān)于狀態(tài)生存時(shí)間的更多信息,可以參考 Flink官方文檔。

在實(shí)現(xiàn)上,狀態(tài)生存時(shí)間特性會額外存儲上一次相關(guān)狀態(tài)訪問的時(shí)間戳。雖然這種方法增加了一些存儲開銷,但它允許 Flink 在訪問狀態(tài)、創(chuàng)建檢查點(diǎn)、恢復(fù)或存儲清理過程時(shí)可以檢查過期狀態(tài)。

“取走垃圾數(shù)據(jù)”

在訪問狀態(tài)對象時(shí),F(xiàn)link 將檢查其時(shí)間戳,并在狀態(tài)過期時(shí)清除狀態(tài)(是否返回過期狀態(tài),則取決于配置的過期數(shù)據(jù)可見性)。由于這種訪問時(shí)才刪除的特性,除非被垃圾回收,否則那些永遠(yuǎn)不被訪問過期數(shù)據(jù)將仍然占用存儲空間。

那么,在沒有顯示處理過期狀態(tài)的情況下,如何刪除這些數(shù)據(jù)呢?通常,我們可以配置不同的策略進(jìn)行后臺刪除。

保證完整快照中不包含過期數(shù)據(jù)

Flink 1.6.0 已經(jīng)支持在創(chuàng)建檢查點(diǎn)(Checkpoint)或保存點(diǎn)(Savepoint)的完整快照時(shí)不包含過期狀態(tài)。需要注意的是,創(chuàng)建增量快照時(shí)并不支持剔除過期狀態(tài)。完整快照時(shí)的過期狀態(tài)剔除必須如下例所示進(jìn)行顯示啟用:

StateTtlConfig ttlConfig = StateTtlConfig
.newBuilder(Time.days(7))
.cleanupFullSnapshot()
.build();

上述配置并不會影響本地狀態(tài)存儲的大小,但是整個(gè)作業(yè)的完整快照的大小將會減小。只有當(dāng)用戶從快照重新加載其狀態(tài)到本地時(shí),才會清除用戶的本地狀態(tài)。

由于上述這些限制,在 Flink 1.6.0 中程序仍需要過期后主動刪除狀態(tài)。為了改善用戶體驗(yàn), Flink 1.8.0 引入了兩種自主清理策略,分別針對兩種狀態(tài)后端類型:

堆內(nèi)存狀態(tài)后端的增量清理

此方法只適用于堆內(nèi)存狀態(tài)后端(FsStateBackend和MemoryStateBackend)。其基本思路是在存儲后端的所有狀態(tài)條目上維護(hù)一個(gè)全局的惰性迭代器。某些事件(例如狀態(tài)訪問)會觸發(fā)增量清理,而每次觸發(fā)增量清理時(shí),迭代器都會向前遍歷刪除已遍歷的過期數(shù)據(jù)。以下代碼示例展示了如何啟用增量清理:

StateTtlConfig ttlConfig = StateTtlConfig
.newBuilder(Time.days(7))
// check 10 keys for every state access
.cleanupIncrementally(10, false)
.build();

如果啟用該功能,則每次狀態(tài)訪問都會觸發(fā)清除。而每次清理時(shí),都會檢查一定數(shù)量的狀態(tài)條目是否過期。其中有兩個(gè)調(diào)整參數(shù)。第一個(gè)定義了每次清理時(shí)要檢查的狀態(tài)條目數(shù)。第二個(gè)參數(shù)是一個(gè)標(biāo)志位,用于表示是否在每條記錄處理(Record processed)之后(而不僅僅是訪問狀態(tài),State accessed),都還額外觸發(fā)清除邏輯。

關(guān)于這種方法有兩個(gè)重要的注意事項(xiàng):首先是增量清理所花費(fèi)的時(shí)間會增加記錄處理的延遲。其次,如果沒有狀態(tài)被訪問(State accessed)或者沒有記錄被處理(Record processed),過期的狀態(tài)也將不會被刪除。

RocksDB 狀態(tài)后端利用后臺壓縮來清理過期狀態(tài)

如果使用 RocksDB 狀態(tài)后端,則可以啟用另一種清理策略,該策略基于 Flink 定制的 RocksDB 壓縮過濾器(Compaction filter)。RocksDB 會定期運(yùn)行異步的壓縮流程以合并數(shù)據(jù)并減少相關(guān)存儲的數(shù)據(jù)量,該定制的壓縮過濾器使用生存時(shí)間檢查狀態(tài)條目的過期時(shí)間戳,并丟棄所有過期值。

使用此功能的第一步,需要設(shè)置以下配置選項(xiàng):state.backend.rocksdb.ttl.compaction.filter.enabled。一旦配置使用 RocksDB 狀態(tài)后端后,如以下代碼示例將會啟用壓縮清理策略:

StateTtlConfig ttlConfig = StateTtlConfig
.newBuilder(Time.days(7))
.cleanupInRocksdbCompactFilter()
.build();

需要注意的是啟用 Flink 的生存時(shí)間壓縮過濾機(jī)制后,會放緩 RocksDB 的壓縮速度。

使用定時(shí)器進(jìn)行狀態(tài)清理

另一種手動清除狀態(tài)的方法是基于 Flink 的計(jì)時(shí)器,這也是社區(qū)評估的一個(gè)想法。使用這種方法,將為每個(gè)狀態(tài)訪問注冊一個(gè)清除計(jì)時(shí)器。這種方法的清理更加精準(zhǔn),因?yàn)闋顟B(tài)一旦過期就會被立刻刪除。但是由于計(jì)時(shí)器會與原始狀態(tài)一起存儲會消耗空間,開銷也更大一些。

未來展望

除了上面提到的基于計(jì)時(shí)器的清理策略之外,F(xiàn)link 社區(qū)還計(jì)劃進(jìn)一步改進(jìn)狀態(tài)生存時(shí)間特性。可能的改進(jìn)包括為事件時(shí)間(Event Time)添加生存時(shí)間的支持(目前只支持處理時(shí)間)和為可查詢狀態(tài)(Queryable state)啟用狀態(tài)生存時(shí)間機(jī)制。

總結(jié)

狀態(tài)可訪問時(shí)間的限制和應(yīng)用程序狀態(tài)大小的控制,是狀態(tài)流處理領(lǐng)域的常見挑戰(zhàn),F(xiàn)link 的 1.8.0 版本通過添加對過期狀態(tài)對象連續(xù)性后臺清理的支持,顯著改進(jìn)了狀態(tài)生存時(shí)間特性。新的清理機(jī)制可以不再需要手動實(shí)現(xiàn)狀態(tài)清理的工作,而且由于惰性清理的機(jī)制,執(zhí)行效率也更高?偟脕碚f,狀態(tài)生存時(shí)間方便用戶控制應(yīng)用程序狀態(tài)的大小,使得用戶可以將精力集中在應(yīng)用程序的核心邏輯開發(fā)上。

原文鏈接:

https://flink.apache.org/2019/05/19/state-ttl.html

標(biāo)簽: 數(shù)據(jù)清理 數(shù)據(jù)保護(hù)

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:當(dāng)前區(qū)塊鏈技術(shù)存在的八大問題

下一篇:深度學(xué)習(xí)在CV領(lǐng)域已觸及天花板?