架構(gòu)
Apache Flink是一個框架和分布式處理引擎,用于對無界和有界數(shù)據(jù)流進(jìn)行有狀態(tài)計算。Flink設(shè)計為在所有常見的集群環(huán)境中運行,以內(nèi)存速度和任何規(guī)模執(zhí)行計算。
在這里,我們解釋了Flink架構(gòu)的重要方面。
處理無界和有界數(shù)據(jù)
任何類型的數(shù)據(jù)都是作為事件流產(chǎn)生的。信用卡交易,傳感器測量,機(jī)器日志或網(wǎng)站或移動應(yīng)用程序上的用戶交互,所有這些數(shù)據(jù)都作為流生成。 數(shù)據(jù)可以作為無界或有界流處理。
- 無界流有一個開始但沒有定義的結(jié)束。它們不會在生成時終止并提供數(shù)據(jù)。必須持續(xù)處理無界流,即必須在攝取事件后立即處理事件。無法等待所有輸入數(shù)據(jù)到達(dá),因為輸入是無界的,并且在任何時間點都不會完成。處理無界數(shù)據(jù)通常要求以特定順序(例如事件發(fā)生的順序)攝取事件,以便能夠推斷結(jié)果完整性。
- 有界流具有定義的開始和結(jié)束??梢栽趫?zhí)行任何計算之前通過攝取所有數(shù)據(jù)來處理有界流。處理有界流不需要有序攝取,因為可以始終對有界數(shù)據(jù)集進(jìn)行排序。有界流的處理也稱為批處理。
Apache Flink擅長處理無界和有界數(shù)據(jù)集。精確控制時間和狀態(tài)使Flink的運行時能夠在無界流上運行任何類型的應(yīng)用程序。有界流由算法和數(shù)據(jù)結(jié)構(gòu)內(nèi)部處理,這些算法和數(shù)據(jù)結(jié)構(gòu)專門針對固定大小的數(shù)據(jù)集而設(shè)計,從而產(chǎn)生出色的性能。
部署應(yīng)用程序在任何地方
Apache Flink是一個分布式系統(tǒng),需要計算資源來執(zhí)行應(yīng)用程序。Flink集成了所有常見的集群資源管理器,如Hadoop YARN、Apache Mesos和Kubernetes,但也可以設(shè)置為作為獨立集群運行。
Flink被設(shè)計成能夠很好地工作于前面列出的每個資源管理器。這是通過特定于資源管理器的部署模式實現(xiàn)的,這種部署模式允許Flink以其慣用的方式與每個資源管理器交互。
在部署Flink應(yīng)用程序時,F(xiàn)link根據(jù)應(yīng)用程序的配置并行性自動識別所需的資源,并從資源管理器請求它們。如果發(fā)生故障,F(xiàn)link將通過請求新的資源來替換失敗的容器。提交或控制應(yīng)用程序的所有通信都是通過REST調(diào)用進(jìn)行的。這簡化了Flink在許多環(huán)境中的集成。
以任何規(guī)模運行應(yīng)用程序
Flink設(shè)計用于在任何規(guī)模上運行有狀態(tài)流應(yīng)用程序。應(yīng)用程序被并行化成數(shù)千個任務(wù),這些任務(wù)分布在一個集群中并發(fā)執(zhí)行。因此,應(yīng)用程序?qū)嶋H上可以利用無限數(shù)量的cpu、主內(nèi)存、磁盤和網(wǎng)絡(luò)IO。此外,F(xiàn)link很容易保持非常大的應(yīng)用狀態(tài)。它的異步和增量檢查點算法確保了對處理延遲的最小影響,同時保證了精確的一次狀態(tài)一致性。
利用內(nèi)存中的性能
有狀態(tài)Flink應(yīng)用程序針對本地狀態(tài)訪問進(jìn)行了優(yōu)化。任務(wù)狀態(tài)總是在內(nèi)存中維護(hù),如果狀態(tài)大小超過可用內(nèi)存,則在具有訪問效率的磁盤數(shù)據(jù)結(jié)構(gòu)中維護(hù)。因此,任務(wù)通過訪問本地(通常是在內(nèi)存中)狀態(tài)來執(zhí)行所有計算,從而產(chǎn)生非常低的處理延遲。Flink通過定期和異步檢查本地狀態(tài)到持久存儲,保證了在發(fā)生故障時的精確一次狀態(tài)一致性。
應(yīng)用
Apache Flink是一個用于對無界和有界數(shù)據(jù)流進(jìn)行有狀態(tài)計算的框架。Flink在不同的抽象級別提供多個API,并為常見用例提供專用庫。
在這里,我們介紹Flink易于使用和富有表現(xiàn)力的API和庫。
流媒體應(yīng)用程序構(gòu)塊
可以由流處理框架構(gòu)建和執(zhí)行的應(yīng)用程序類型由框架控制流,狀態(tài)和時間的程度來定義。在下文中,我們描述了流處理應(yīng)用程序的這些構(gòu)建塊,并解釋了Flink處理它們的方法。
流
顯然,流是流處理的一個基本方面。但是,流可能具有不同的特性,這些特性會影響流可以且應(yīng)該如何處理。Flink是一個通用的處理框架,可以處理任何類型的流。
- 有界的和無界的流:流可以是無界的或有界的,即,固定大小的數(shù)據(jù)集。Flink具有處理無界流的復(fù)雜特性,但也有專門的操作符來有效地處理有界流。
- 實時流和記錄流:所有數(shù)據(jù)都作為流生成。有兩種處理數(shù)據(jù)的方法。當(dāng)流生成或?qū)⑵涑志没酱鎯ο到y(tǒng)(例如文件系統(tǒng)或?qū)ο蟠鎯?時實時處理,并在稍后處理。Flink應(yīng)用程序可以處理記錄或?qū)崟r流。
狀態(tài)
每個重要的流應(yīng)用程序都是有狀態(tài)的,即只有對單個事件應(yīng)用轉(zhuǎn)換的應(yīng)用程序才需要狀態(tài)。運行基本業(yè)務(wù)邏輯的任何應(yīng)用程序都需要記住事件或中間結(jié)果,以便在以后的時間點訪問它們,例如在收到下一個事件時或在特定持續(xù)時間之后。
應(yīng)用程序狀態(tài)是Apache Flink的一等公民??梢酝ㄟ^查看Flink在狀態(tài)處理環(huán)境中提供的所有功能來查看。
- 多狀態(tài)基元(Multiple State Primitives):Flink為不同的數(shù)據(jù)結(jié)構(gòu)提供狀態(tài)基元,例如原子值,列表或映射。開發(fā)人員可以根據(jù)函數(shù)的訪問模式選擇最有效的狀態(tài)原語。
- 可插拔狀態(tài)后端(Pluggable State Backends):應(yīng)用程序狀態(tài)由可插拔狀態(tài)后端管理和檢查點。Flink具有不同的狀態(tài)后端,可以在內(nèi)存或RocksDB中存儲狀態(tài),RocksDB是一種高效的嵌入式磁盤數(shù)據(jù)存儲。也可以插入自定義狀態(tài)后端。
- 完全一次的狀態(tài)一致性(Exactly-once state consistency):Flink的檢查點和恢復(fù)算法可確保在發(fā)生故障時應(yīng)用程序狀態(tài)的一致性。因此,故障是透明處理的,不會影響應(yīng)用程序的正確性。
- 非常大的狀態(tài)(Very Large State):由于其異步和增量檢查點算法,F(xiàn)link能夠維持幾TB的應(yīng)用程序狀態(tài)。
- 可擴(kuò)展的應(yīng)用程序(Scalable Applications):Flink通過將狀態(tài)重新分配給更多或更少的工作人員來支持有狀態(tài)應(yīng)用程序的擴(kuò)展。
時間
時間是流媒體應(yīng)用的另一個重要組成部分 大多數(shù)事件流都具有固有的時間語義,因為每個事件都是在特定時間點生成的。此外,許多常見的流計算基于時間,例如窗口聚合,會話化,模式檢測和基于時間的連接。流處理的一個重要方面是應(yīng)用程序如何測量時間,即事件時間和處理時間的差異。
Flink提供了一組豐富的與時間相關(guān)的功能。
- Event-time Mode:使用事件時間語義處理流的應(yīng)用程序根據(jù)事件的時間戳計算結(jié)果。因此,無論是否處理記錄的或?qū)崟r的事件,事件時間處理都允許準(zhǔn)確和一致的結(jié)果。
- 支持Watermark:Flink使用Watermark來推斷事件時間應(yīng)用中的時間。Watermark也是一種靈活的機(jī)制,可以權(quán)衡結(jié)果的延遲和完整性。
- 延遲數(shù)據(jù)處理(Late Data Handling):當(dāng)使用 watermark 在事件時間模式下處理流時,可能會發(fā)生在所有相關(guān)事件到達(dá)之前已完成計算。這類事件被稱為遲發(fā)事件。Flink具有多種處理延遲事件的選項,例如通過側(cè)輸出重新路由它們以及更新以前完成的結(jié)果。
- 處理時間模式(Processing-time Mode):除了事件時間模式之外,F(xiàn)link還支持處理時間語義,該處理時間語義執(zhí)行由處理機(jī)器的掛鐘時間觸發(fā)的計算。處理時間模式適用于具有嚴(yán)格的低延遲要求的某些應(yīng)用,這些要求可以容忍近似結(jié)果。
分層api
Flink 根據(jù)抽象程度分層,提供了三種不同的 API。每一種 API 在簡潔性和表達(dá)力上有著不同的側(cè)重,并且針對不同的應(yīng)用場景。

ProcessFunction
ProcessFunction 是 Flink 所提供的最具表達(dá)力的接口。ProcessFunction 可以處理一或兩條輸入數(shù)據(jù)流中的單個事件或者歸入一個特定窗口內(nèi)的多個事件。它提供了對于時間和狀態(tài)的細(xì)粒度控制。開發(fā)者可以在其中任意地修改狀態(tài),也能夠注冊定時器用以在未來的某一時刻觸發(fā)回調(diào)函數(shù)。因此,你可以利用 ProcessFunction 實現(xiàn)許多有狀態(tài)的事件驅(qū)動應(yīng)用所需要的基于單個事件的復(fù)雜業(yè)務(wù)邏輯。
DataStream API
DataStream API為許多通用的流處理操作提供了處理原語。這些操作包括窗口、逐條記錄的轉(zhuǎn)換操作,在處理事件時進(jìn)行外部數(shù)據(jù)庫查詢等。DataStream API 支持 Java 和 Scala 語言,預(yù)先定義了例如map()、reduce()、aggregate() 等函數(shù)。你可以通過擴(kuò)展實現(xiàn)預(yù)定義接口或使用 Java、Scala 的 lambda 表達(dá)式實現(xiàn)自定義的函數(shù)。
SQL & Table API
Flink 支持兩種關(guān)系型的 API,Table API 和 SQL。這兩個 API 都是批處理和流處理統(tǒng)一的 API,這意味著在無邊界的實時數(shù)據(jù)流和有邊界的歷史記錄數(shù)據(jù)流上,關(guān)系型 API 會以相同的語義執(zhí)行查詢,并產(chǎn)生相同的結(jié)果。Table API 和 SQL 借助了 Apache Calcite來進(jìn)行查詢的解析,校驗以及優(yōu)化。它們可以與 DataStream 和 DataSet API 無縫集成,并支持用戶自定義的標(biāo)量函數(shù),聚合函數(shù)以及表值函數(shù)。
Flink 的關(guān)系型 API 旨在簡化數(shù)據(jù)分析、數(shù)據(jù)流水線和 ETL 應(yīng)用的定義。
Libraries
Flink具有幾個用于常見數(shù)據(jù)處理用例的庫。 這些庫通常嵌入在API中,而不是完全獨立的。 因此,他們可以從API的所有功能中受益,并與其他庫集成。
- 復(fù)雜事件處理(Complex Event Processing: CEP):模式檢測是事件流處理的一個非常常見的用例。Flink的CEP庫提供了一個API來指定事件的模式(考慮正則表達(dá)式或狀態(tài)機(jī))。CEP庫與Flink的DataStream API集成,以便在DataStreams上評估模式。CEP庫的應(yīng)用程序包括網(wǎng)絡(luò)入侵檢測、業(yè)務(wù)流程監(jiān)視和欺詐檢測。
- DataSet API: DataSet API是Flink的核心API,用于批處理應(yīng)用程序。DataSet API的原語包括map、reduce、(外部)join、co-group和iterate。所有操作都由算法和數(shù)據(jù)結(jié)構(gòu)支持,這些算法和數(shù)據(jù)結(jié)構(gòu)對內(nèi)存中的序列化數(shù)據(jù)進(jìn)行操作,如果數(shù)據(jù)大小超過內(nèi)存預(yù)算,則會溢出到磁盤。Flink的DataSet API的數(shù)據(jù)處理算法受到傳統(tǒng)數(shù)據(jù)庫操作符的啟發(fā),如混合哈希連接或外部合并排序。
- Gelly: Gelly是一個用于可伸縮圖形處理和分析的庫。Gelly是在數(shù)據(jù)集API的基礎(chǔ)上實現(xiàn)的,并與之集成。因此,它得益于可伸縮和健壯的操作符。Gelly提供了內(nèi)置的算法,比如標(biāo)簽傳播(label propagation)、三角形枚舉(triangle enumeration)和頁面排名(page rank),但也提供了一個Graph API,簡化了自定義圖形算法的實現(xiàn)。
運維
Apache Flink 是一個針對無界和有界數(shù)據(jù)流進(jìn)行有狀態(tài)計算的框架。由于許多流應(yīng)用程序旨在以最短的停機(jī)時間連續(xù)運行,因此流處理器必須提供出色的故障恢復(fù)能力,以及在應(yīng)用程序運行期間進(jìn)行監(jiān)控和維護(hù)的工具。
Apache Flink 非常注重流數(shù)據(jù)處理的可運維性。因此在這一小節(jié)中,我們將詳細(xì)介紹 Flink 的故障恢復(fù)機(jī)制,并介紹其管理和監(jiān)控應(yīng)用的功能。
7 * 24小時穩(wěn)定運行
在分布式系統(tǒng)中,服務(wù)故障是常有的事,為了保證服務(wù)能夠7*24小時穩(wěn)定運行,像Flink這樣的流處理器故障恢復(fù)機(jī)制是必須要有的。顯然這就意味著,它(這類流處理器)不僅要能在服務(wù)出現(xiàn)故障時候能夠重啟服務(wù),而且還要當(dāng)故障發(fā)生時,保證能夠持久化服務(wù)內(nèi)部各個組件的當(dāng)前狀態(tài),只有這樣才能保證在故障恢復(fù)時候,服務(wù)能夠繼續(xù)正常運行,好像故障就沒有發(fā)生過一樣。
Flink通過幾下多種機(jī)制維護(hù)應(yīng)用可持續(xù)運行及其一致性:
- checkpoint的一致性: Flink的故障恢復(fù)機(jī)制是通過建立分布式應(yīng)用服務(wù)狀態(tài)一致性檢查點實現(xiàn)的,當(dāng)有故障產(chǎn)生時,應(yīng)用服務(wù)會重啟后,再重新加載上一次成功備份的狀態(tài)檢查點信息。結(jié)合可重放的數(shù)據(jù)源,該特性可保證精確一次(exactly-once)的狀態(tài)一致性。
- 高效的檢查點: 如果一個應(yīng)用要維護(hù)一個TB級的狀態(tài)信息,對此應(yīng)用的狀態(tài)建立檢查點服務(wù)的資源開銷是很高的,為了減小因檢查點服務(wù)對應(yīng)用的延遲性(SLAs服務(wù)等級協(xié)議)的影響,F(xiàn)link采用異步及增量的方式構(gòu)建檢查點服務(wù)。
- 端到端的精確一次: Flink 為某些特定的存儲支持了事務(wù)型輸出的功能,及時在發(fā)生故障的情況下,也能夠保證精確一次的輸出。
- 集成多種集群管理服務(wù): Flink已與多種集群管理服務(wù)緊密集成,如 Hadoop YARN, Mesos, 以及 Kubernetes。當(dāng)集群中某個流程任務(wù)失敗后,一個新的流程服務(wù)會自動啟動并替代它繼續(xù)執(zhí)行。
- 內(nèi)置高可用服務(wù): Flink內(nèi)置了為解決單點故障問題的高可用性服務(wù)模塊,此模塊是基于Apache ZooKeeper技術(shù)實現(xiàn)的,Apache ZooKeeper是一種可靠的、交互式的、分布式協(xié)調(diào)服務(wù)組件。
Flink能夠更方便地升級、遷移、暫停、恢復(fù)應(yīng)用服務(wù)
Flink的 Savepoint 服務(wù)就是為解決升級服務(wù)過程中記錄流應(yīng)用狀態(tài)信息及其相關(guān)難題而產(chǎn)生的一種唯一的、強(qiáng)大的組件。一個 Savepoint,就是一個應(yīng)用服務(wù)狀態(tài)的一致性快照,因此其與checkpoint組件的很相似,但是與checkpoint相比,Savepoint 需要手動觸發(fā)啟動,而且當(dāng)流應(yīng)用服務(wù)停止時,它并不會自動刪除。Savepoint 常被應(yīng)用于啟動一個已含有狀態(tài)的流服務(wù),并初始化其(備份時)狀態(tài)。
監(jiān)控和控制應(yīng)用服務(wù)
Flink與許多常見的日志記錄和監(jiān)視服務(wù)集成得很好,并提供了一個REST API來控制應(yīng)用服務(wù)和查詢應(yīng)用信息。具體表現(xiàn)如下:
- Web UI方式: Flink提供了一個web UI來觀察、監(jiān)視和調(diào)試正在運行的應(yīng)用服務(wù)。并且還可以執(zhí)行或取消組件或任務(wù)的執(zhí)行。
- 日志集成服務(wù):Flink實現(xiàn)了流行的slf4j日志接口,并與日志框架log4j或logback集成。
- 指標(biāo)服務(wù): Flink提供了一個復(fù)雜的度量系統(tǒng)來收集和報告系統(tǒng)和用戶定義的度量指標(biāo)信息。度量信息可以導(dǎo)出到多個報表組件服務(wù),包括 JMX, Ganglia, Graphite, Prometheus, StatsD, Datadog, 和 Slf4j.
- 標(biāo)準(zhǔn)的WEB REST API接口服務(wù): Flink提供多種REST API接口,有提交新應(yīng)用程序、獲取正在運行的應(yīng)用程序的Savepoint服務(wù)信息、取消應(yīng)用服務(wù)等接口。REST API還提供元數(shù)據(jù)信息和已采集的運行中或完成后的應(yīng)用服務(wù)的指標(biāo)信息。
應(yīng)用場景
概述
Apache Flink因其豐富的功能而成為開發(fā)和運行多種不同類型應(yīng)用程序的絕佳選擇。Flink的功能包括對流和批處理的支持,復(fù)雜的狀態(tài)管理,事件時間處理語義以及狀態(tài)的一致性保證。此外,F(xiàn)link可以部署在各種資源管理器上(如YARN,Apache Mesos和Kubernetes),也可以作為裸機(jī)硬件上的獨立群集。Flink配置為高可用性,沒有單點故障。Flink提供高吞吐量和低延遲,并為世界上一些最苛刻的流處理應(yīng)用程序提供支持。
下面,我們將探討由Flink提供支持的最常見類型的應(yīng)用程序,并指出實際示例。
- 事件驅(qū)動型的應(yīng)用程序
- 數(shù)據(jù)分析型的應(yīng)用程序
- 數(shù)據(jù)管道型的應(yīng)用程序
事件驅(qū)動型的應(yīng)用程序
事件驅(qū)動型的應(yīng)用程序是一個有狀態(tài)的應(yīng)用程序,它從一個或多個事件流中提取事件,并通過觸發(fā)計算、狀態(tài)更新或外部操作對傳入事件做出反應(yīng)。
傳統(tǒng)應(yīng)用程序設(shè)計具有分離的計算和數(shù)據(jù)存儲層,在此體系結(jié)構(gòu)中,應(yīng)用程序從遠(yuǎn)程事務(wù)數(shù)據(jù)庫中讀取數(shù)據(jù)并將數(shù)據(jù)持久化。
相反,事件驅(qū)動的應(yīng)用程序基于有狀態(tài)流處理應(yīng)用程序。在這種設(shè)計中,數(shù)據(jù)和計算是共同定位的,這產(chǎn)生了本地(內(nèi)存或磁盤)數(shù)據(jù)訪問。通過定期將檢查點寫入遠(yuǎn)程持久存儲來實現(xiàn)容錯。
事件驅(qū)動的應(yīng)用程序不是查詢遠(yuǎn)程數(shù)據(jù)庫,而是在本地訪問其數(shù)據(jù),從而在吞吐量和延遲方面產(chǎn)生更好的性能。遠(yuǎn)程持久存儲的檢查點可以異步和遞增完成。因此,檢查點對常規(guī)事件處理的影響非常小。
幾種典型的事件驅(qū)動型應(yīng)用程序:
欺詐識別
異常檢測
基于規(guī)則的警報
業(yè)務(wù)流程監(jiān)控
Web應(yīng)用程序(社交網(wǎng)絡(luò))
數(shù)據(jù)分析型應(yīng)用程序
數(shù)據(jù)分析工作從原始數(shù)據(jù)中提取信息。傳統(tǒng)上,數(shù)據(jù)分析是在記錄事件的有界數(shù)據(jù)集上作為批量查詢或應(yīng)用程序執(zhí)行。為了將最新數(shù)據(jù)合并到分析結(jié)果中,必須將其添加到分析的數(shù)據(jù)集中,并重新運行查詢或應(yīng)用程序。結(jié)果將寫入存儲系統(tǒng)或作為報告發(fā)出。
借助先進(jìn)的流處理引擎,還可以實時地執(zhí)行分析。流式查詢或應(yīng)用程序不是讀取有限數(shù)據(jù)集,而是攝取實時事件流,并在消耗事件時不斷生成和更新結(jié)果。結(jié)果要么寫入外部數(shù)據(jù)庫,要么保持為內(nèi)部狀態(tài)。儀表板應(yīng)用程序可以從外部數(shù)據(jù)庫讀取最新結(jié)果或直接查詢應(yīng)用程序的內(nèi)部狀態(tài)。Apache Flink支持流式和批量分析應(yīng)用程序。
與批量分析相比,連續(xù)流分析的優(yōu)勢不僅限于低延遲。與批量查詢相比,流式查詢不必處理輸入數(shù)據(jù)中的人為邊界,這些邊界是由定期導(dǎo)入和輸入的有界性質(zhì)引起的。
另一方面是更簡單的應(yīng)用程序架構(gòu)。批量分析管道由若干獨立組件組成,以定期調(diào)度數(shù)據(jù)提取和查詢執(zhí)行??煽康夭僮鬟@樣的管道并非易事,因為一個組件的故障會影響管道的后續(xù)步驟。相比之下,在像Flink這樣的復(fù)雜流處理器上運行的流分析應(yīng)用程序包含從數(shù)據(jù)攝取到連續(xù)結(jié)果計算的所有步驟。
幾種典型的數(shù)據(jù)分析型應(yīng)用程序:
電信網(wǎng)絡(luò)的質(zhì)量監(jiān)控
分析移動應(yīng)用程序中的產(chǎn)品更新和實驗評估
對消費者技術(shù)中的實時數(shù)據(jù)進(jìn)行特別分析
大規(guī)模圖分析
數(shù)據(jù)管道型應(yīng)用程序
提取 - 轉(zhuǎn)換 - 加載(ETL)是在存儲系統(tǒng)之間轉(zhuǎn)換和移動數(shù)據(jù)的常用方法。通常會定期觸發(fā)ETL作業(yè),以將數(shù)據(jù)從事務(wù)數(shù)據(jù)庫系統(tǒng)復(fù)制到分析數(shù)據(jù)庫或數(shù)據(jù)倉庫。
數(shù)據(jù)管道與ETL作業(yè)具有相似的用途。它們可以轉(zhuǎn)換和豐富數(shù)據(jù),并可以將數(shù)據(jù)從一個存儲系統(tǒng)移動到另一個存儲系統(tǒng)。但是,它們以連續(xù)流模式運行,而不是定期觸發(fā)。因此,他們能夠從連續(xù)生成數(shù)據(jù)的源中讀取記錄,并以低延遲將其移動到目的地。例如,數(shù)據(jù)管道可能會監(jiān)視文件系統(tǒng)目錄中的新文件并將其數(shù)據(jù)寫入事件日志。
連續(xù)數(shù)據(jù)流水線優(yōu)于周期性ETL作業(yè)的原因是減少了將數(shù)據(jù)移動到目的地的延遲。此外,數(shù)據(jù)管道更通用,可用于更多用例,因為它們能夠連續(xù)消耗和發(fā)送數(shù)據(jù)。
幾種典型的數(shù)據(jù)管道型應(yīng)用:
電子商務(wù)中的實時搜索索引構(gòu)建
電子商務(wù)中持續(xù)的ETL