FeatureDB概述
特征數(shù)據(jù)庫(下文簡稱FeatureDB)是阿里云PAI平臺下特征平臺(PAI-FeatureStore)提供的數(shù)據(jù)庫服務(wù),可以作為FeatureStore的在線數(shù)據(jù)源,提供在線特征存儲功能,并為搜索推薦廣告等服務(wù)提供高性能的讀寫優(yōu)化。本文為您介紹什么是FeatureDB,以及FeatureDB的功能與優(yōu)勢。
什么是FeatureDB
FeatureDB是FeatureStore提供的高性能分布式存儲數(shù)據(jù)庫,支持KV、KKV格式的數(shù)據(jù),并支持以結(jié)構(gòu)化的方式將數(shù)組存儲為Array,將KV存儲為Map類型。通過Array、Map類型存儲數(shù)據(jù),可以為后續(xù)的讀寫、推理服務(wù)提供更高的性能。FeatureDB已經(jīng)全面支持離線特征和實時特征的生產(chǎn)、更新與消費鏈路,同時也支持用戶行為序列特征。
產(chǎn)品特性
FeatureDB針對FeatureStore特征讀取特性實現(xiàn)了如下功能和優(yōu)化:
支持讀寫KV、KKV類型特征。
支持讀寫MaxCompute復(fù)雜類型特征(Array、Map)。
支持全量拉取FeatureView下的所有特征數(shù)據(jù)。
支持毫秒級輪詢更新實時特征數(shù)據(jù)。
支持秒級TTL,自動清理過期數(shù)據(jù)。
按量計費,根據(jù)實際讀寫數(shù)據(jù)量進行計費。
FeatureDB可以對FeatureView的數(shù)據(jù)進行分片存儲,通過調(diào)整分片數(shù)來滿足不同場景的讀寫性能需求,并且支持副本,以保障數(shù)據(jù)的穩(wěn)定與安全。其中,分片數(shù)量可以根據(jù)特征存儲的數(shù)據(jù)量進行調(diào)整:
5分片(默認):適用于千萬級以下的數(shù)據(jù)量。
10分片:適用于千萬級以上、億級以下的數(shù)據(jù)量。
20分片:適用于億級以上的數(shù)據(jù)量。
產(chǎn)品優(yōu)勢
高性價比
對于特征存儲規(guī)模較小的客戶,使用FeatureDB可以降低使用成本。
滿足高頻更新需求
當使用實時統(tǒng)計特征時,需每隔幾秒及時更新實時特征到多個EasyRec Processor(模型推理服務(wù))實例的存儲中,這對高頻更新有較高的要求,F(xiàn)eatureDB可以滿足這一需求。
支持復(fù)雜類型特征
在搜索推廣業(yè)務(wù)中,Array和Map類型的特征、用戶行為長序列特征及其SideInfo被廣泛使用。如果復(fù)雜類型特征以字符串形式存儲,在應(yīng)用時需要進行序列化為Map類型,會降低性能。
FeatureDB支持存儲復(fù)雜類型數(shù)據(jù),并支持同步MaxCompute2.0復(fù)雜類型數(shù)據(jù)到FeatureDB,進行高性能讀取操作。
支持彈性擴容
對于規(guī)模較大的客戶,能夠根據(jù)特征視圖靈活增加分片數(shù)量,提高讀寫性能。
解決監(jiān)控盲點
當集成第三方數(shù)據(jù)源時,整個數(shù)據(jù)鏈路的監(jiān)控變得困難,特別是在實時特征方面。FeatureDB能夠監(jiān)控每個視圖粒度的讀寫QPS、RT、數(shù)據(jù)更新延時和存儲用量等關(guān)鍵性能指標。
產(chǎn)品功能
配置FeatureDB數(shù)據(jù)源
具體操作,請參見配置數(shù)據(jù)源。
寫入特征
對于離線特征,可以使用FeatureStore Python SDK通過DataWorks每天例行運行調(diào)度任務(wù),將MaxCompute里的數(shù)據(jù)同步到FeatureDB中。
對于實時特征,目前可通過以下兩種方式同步數(shù)據(jù)。
方式一:直接通過Java SDK寫入特征數(shù)據(jù)。
// 配置 regionId, 阿里云賬號, FeatureStore project Configuration configuration = new Configuration("cn-beijing", Constants.accessId, Constants.accessKey,"fs_demo_featuredb" ); // 配置 FeatureDB 用戶名,密碼 configuration.setUsername(Constants.username); configuration.setPassword(Constants.password); // 如果使用公網(wǎng)鏈接 FeatureStore, 參考上面的域名信息 // 如果使用 VPC 環(huán)境,不需要設(shè)置 //configuration.setDomain(Constants.host); ApiClient client = new ApiClient(configuration); // 如果使用公網(wǎng)鏈接 設(shè)置 usePublicAddress = true, vpc 環(huán)境不需要設(shè)置 // FeatureStoreClient featureStoreClient = new FeatureStoreClient(client, Constants.usePublicAddress); FeatureStoreClient featureStoreClient = new FeatureStoreClient(client ); Project project = featureStoreClient.getProject("fs_demo_featuredb"); if (null == project) { throw new RuntimeException("project not found"); } FeatureView featureView = project.getFeatureView("user_test_2"); if (null == featureView) { throw new RuntimeException("featureview not found"); } List<Map<String, Object>> writeData = new ArrayList<>(); // 模擬構(gòu)造數(shù)據(jù)寫入 for (int i = 0; i < 10; i++) { Map<String, Object> data = new HashMap<>(); data.put("user_id", i); data.put("string_field", String.format("test_%d", i)); data.put("int32_field", i); data.put("int64_field", Long.valueOf(i)); data.put("float_field", Float.valueOf(i)); data.put("double_field", Double.valueOf(i)); data.put("boolean_field", i % 2 == 0); writeData.add(data); } for (int i = 0; i < 100;i++) { featureView.writeFeatures(writeData); } // 這里只需要調(diào)用一次,如果全部數(shù)據(jù)寫完,確保全部寫入完成,調(diào)用此接口后,無法再調(diào)用 writeFeatures featureView.writeFlush();
方式二:使用實時計算Flink生產(chǎn)實時特征,通過配置Flink Connector寫入。具體操作,請參見設(shè)置Flink Connector。
讀取特征
您可以使用FeatureStore SDK(Go/Java)或EasyRec Processor讀取特征。
FeatureStore SDK(Go/Java )支持離線/實時特征的KV點查。通過指定特征的JoinID(主鍵)值與特征名稱,即可在毫秒內(nèi)完成鍵值對(KV)查詢,獲取目標特征數(shù)據(jù)。FeatureStore SDK(Go/Java)也支持行為序列特征的KKV查詢。通過指定UserID(用戶ID)值,即可查詢到拼裝好的序列特征結(jié)果。
EasyRec Processor已集成FeatureStore Cpp SDK,支持將FeatureDB的特征數(shù)據(jù)全量拉入內(nèi)存,并支持毫秒級輪詢更新實時特征數(shù)據(jù)到內(nèi)存,從而實現(xiàn)更高性能的讀取。
監(jiān)控指標
如果使用FeatureDB作為在線數(shù)據(jù)源,創(chuàng)建特征視圖后,單擊目標視圖右側(cè)的數(shù)據(jù)監(jiān)控,可查看該視圖的讀寫QPS和RT等指標。
實時特征鏈路
FeatureStore提供的存儲服務(wù)主要包括三部分:Feature Service(接入層)、消息隊列(DataHub)和FeatureDB。
在實時特征中,用戶可以通過FeatureStore Java SDK或Flink Connector調(diào)用Feature Service服務(wù),將特征數(shù)據(jù)寫入FeatureDB。通過Feature Service寫入的數(shù)據(jù),也會同步到用戶的MaxCompute表中,可以用于實時特征的樣本導(dǎo)出,進一步的模型訓(xùn)練。
對于存儲在FeatureDB中的特征數(shù)據(jù), 用戶可以通過FeatureStore的Java/Go SDK讀取,也可以通過 EasyRec Processor全量拉取特征存入本地緩存中,以實現(xiàn)更高性能的讀取。對于實時特征,可以毫秒級獲取最新特征信息。
性能測試
以下是讀取FeatureDB特征的性能壓測示例,特征表數(shù)據(jù)選取的推薦情景數(shù)據(jù),總數(shù)據(jù)行數(shù)是8671932,數(shù)據(jù)僅供參考。
在線數(shù)據(jù)源 | 特征字段數(shù)量(列數(shù)) | 讀取keys數(shù)量(行數(shù)) | 平均耗時 | TP99 |
FeatureDB | 260 | 1 | 3.25毫秒 | 4.34毫秒 |
FeatureDB | 260 | 10 | 3.52毫秒 | 4.62毫秒 |
FeatureDB | 260 | 50 | 4.51毫秒 | 6.05毫秒 |
FeatureDB | 260 | 200 | 8.23毫秒 | 10.52毫秒 |
FeatureDB | 260 | 500 | 12.96毫秒 | 16.55毫秒 |
FeatureDB | 260 | 1000 | 17.61毫秒 | 21.26毫秒 |