數(shù)據(jù)集成工具:Apache Nifi:數(shù)據(jù)轉(zhuǎn)換與富集技術(shù)_第1頁
數(shù)據(jù)集成工具:Apache Nifi:數(shù)據(jù)轉(zhuǎn)換與富集技術(shù)_第2頁
數(shù)據(jù)集成工具:Apache Nifi:數(shù)據(jù)轉(zhuǎn)換與富集技術(shù)_第3頁
數(shù)據(jù)集成工具:Apache Nifi:數(shù)據(jù)轉(zhuǎn)換與富集技術(shù)_第4頁
數(shù)據(jù)集成工具:Apache Nifi:數(shù)據(jù)轉(zhuǎn)換與富集技術(shù)_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

數(shù)據(jù)集成工具:ApacheNifi:數(shù)據(jù)轉(zhuǎn)換與富集技術(shù)1數(shù)據(jù)集成工具:ApacheNifi:數(shù)據(jù)轉(zhuǎn)換與富集技術(shù)1.1介紹ApacheNifi1.1.1Nifi的歷史與發(fā)展ApacheNifi是一個易于使用、功能強大的數(shù)據(jù)處理和分發(fā)系統(tǒng)。它由美國國家安全局(NSA)開發(fā),并于2014年開源,隨后被Apache軟件基金會接納為頂級項目。Nifi的設(shè)計初衷是為了自動化數(shù)據(jù)流的處理,提供一種靈活的方式來管理、轉(zhuǎn)換和傳輸數(shù)據(jù)。它支持高度可配置的數(shù)據(jù)路由、轉(zhuǎn)換和系統(tǒng)中介邏輯,使得數(shù)據(jù)集成任務(wù)變得更加簡單和直觀。1.1.2Nifi的核心特性與優(yōu)勢核心特性圖形化界面:Nifi提供了一個直觀的拖放式用戶界面,允許用戶輕松創(chuàng)建和管理數(shù)據(jù)流。數(shù)據(jù)流可視化:用戶可以實時查看數(shù)據(jù)流的執(zhí)行情況,包括數(shù)據(jù)的來源、去向和處理過程。可擴展性:Nifi支持通過插件機制擴展其功能,可以處理各種數(shù)據(jù)格式和協(xié)議。安全性:Nifi提供了強大的安全特性,包括數(shù)據(jù)加密、訪問控制和審計日志,確保數(shù)據(jù)的安全傳輸和處理。容錯性:Nifi設(shè)計有容錯機制,能夠自動重試失敗的任務(wù),確保數(shù)據(jù)處理的連續(xù)性和完整性。優(yōu)勢易于部署和管理:Nifi可以在各種環(huán)境中輕松部署,包括本地、虛擬機和云環(huán)境。其管理界面使得監(jiān)控和調(diào)整數(shù)據(jù)流變得簡單。高性能:Nifi采用異步、事件驅(qū)動的架構(gòu),能夠處理高吞吐量的數(shù)據(jù)流,即使在大規(guī)模數(shù)據(jù)處理場景下也能保持高效。社區(qū)支持:作為Apache項目,Nifi擁有活躍的社區(qū)和豐富的資源,用戶可以從中獲得技術(shù)支持和解決方案。1.2數(shù)據(jù)轉(zhuǎn)換與富集技術(shù)1.2.1數(shù)據(jù)轉(zhuǎn)換在ApacheNifi中,數(shù)據(jù)轉(zhuǎn)換是通過使用“處理器”(Processors)來實現(xiàn)的。處理器是Nifi數(shù)據(jù)流中的基本構(gòu)建塊,它們可以執(zhí)行各種操作,如解析、轉(zhuǎn)換、過濾和格式化數(shù)據(jù)。例如,使用ConvertRecord處理器可以將數(shù)據(jù)從一種格式轉(zhuǎn)換為另一種格式。示例:使用ConvertRecord處理器將CSV數(shù)據(jù)轉(zhuǎn)換為JSON假設(shè)我們有以下CSV數(shù)據(jù):name,age,city

John,30,NewYork

Jane,25,LosAngeles我們可以使用以下Nifi配置來轉(zhuǎn)換此數(shù)據(jù)為JSON格式:創(chuàng)建數(shù)據(jù)源:使用GetFile處理器從文件系統(tǒng)讀取CSV數(shù)據(jù)。轉(zhuǎn)換數(shù)據(jù):使用ConvertRecord處理器,選擇CSVtoJSON轉(zhuǎn)換器。數(shù)據(jù)輸出:使用PutFile處理器將轉(zhuǎn)換后的JSON數(shù)據(jù)寫入文件系統(tǒng)。Nifi配置GetFile處理器:配置為監(jiān)聽包含CSV文件的目錄。ConvertRecord處理器:選擇CSVtoJSON轉(zhuǎn)換器,并配置輸入和輸出Schema。PutFile處理器:配置為將JSON數(shù)據(jù)寫入指定的輸出目錄。1.2.2數(shù)據(jù)富集數(shù)據(jù)富集(DataEnrichment)是指在數(shù)據(jù)流中添加額外的信息或元數(shù)據(jù),以增強數(shù)據(jù)的價值。在Nifi中,這可以通過使用特定的處理器來實現(xiàn),如EnrichRecord或LookupTable。示例:使用EnrichRecord處理器添加地理位置信息假設(shè)我們有以下用戶數(shù)據(jù):{

"name":"John",

"age":30,

"city":"NewYork"

}我們可以使用EnrichRecord處理器來查詢一個地理位置數(shù)據(jù)庫,以獲取用戶所在城市的詳細(xì)信息,如經(jīng)度和緯度,然后將這些信息添加到原始數(shù)據(jù)中。Nifi配置GetFile處理器:讀取包含用戶數(shù)據(jù)的JSON文件。EnrichRecord處理器:配置為查詢地理位置數(shù)據(jù)庫,并將結(jié)果添加到記錄中。PutFile處理器:將富集后的數(shù)據(jù)寫入文件系統(tǒng)。富集后的數(shù)據(jù)示例{

"name":"John",

"age":30,

"city":"NewYork",

"latitude":40.7128,

"longitude":-74.0060

}通過上述配置,Nifi能夠自動地將地理位置信息添加到用戶數(shù)據(jù)中,無需手動編寫復(fù)雜的代碼,大大簡化了數(shù)據(jù)富集的過程。1.3結(jié)論ApacheNifi通過其直觀的用戶界面、強大的數(shù)據(jù)處理能力和豐富的功能集,為數(shù)據(jù)集成、轉(zhuǎn)換和富集提供了全面的解決方案。無論是處理結(jié)構(gòu)化數(shù)據(jù)還是非結(jié)構(gòu)化數(shù)據(jù),Nifi都能夠提供靈活且高效的數(shù)據(jù)流管理,使得數(shù)據(jù)工程師和分析師能夠?qū)W⒂跀?shù)據(jù)的價值,而不是數(shù)據(jù)處理的細(xì)節(jié)。2安裝與配置Nifi2.1環(huán)境要求與準(zhǔn)備在開始安裝ApacheNifi之前,確保你的系統(tǒng)滿足以下要求:操作系統(tǒng):Nifi支持多種操作系統(tǒng),包括Linux、Windows和MacOS。推薦使用Linux系統(tǒng),因為它提供了更好的穩(wěn)定性和性能。Java環(huán)境:Nifi需要Java環(huán)境來運行,確保你的系統(tǒng)中安裝了Java8或更高版本。可以通過運行java-version命令來檢查Java版本。內(nèi)存:根據(jù)數(shù)據(jù)處理的復(fù)雜性和數(shù)據(jù)量,至少需要4GB的RAM,但8GB或更多是推薦的。磁盤空間:至少需要1GB的磁盤空間用于Nifi的安裝和數(shù)據(jù)存儲。2.1.1準(zhǔn)備工作下載Nifi:訪問ApacheNifi官方網(wǎng)站下載最新版本的Nifi。解壓文件:將下載的Nifi壓縮包解壓到你選擇的目錄中。檢查Java環(huán)境:確保Java環(huán)境已正確安裝。2.2安裝Nifi步驟2.2.1Linux系統(tǒng)安裝下載并解壓:使用wget或curl命令下載Nifi壓縮包,并解壓到指定目錄。wget/nifi/1.18.0/nifi-1.18.0-bin.tar.gz

tar-xzfnifi-1.18.0-bin.tar.gz設(shè)置環(huán)境變量:在你的.bashrc或.profile文件中設(shè)置Nifi的環(huán)境變量。exportNIFI_HOME=/path/to/nifi-1.18.0

exportPATH=$PATH:$NIFI_HOME/bin啟動Nifi:使用Nifi的啟動腳本來啟動服務(wù)。$NIFI_HOME/bin/nifi.shstart2.2.2Windows系統(tǒng)安裝下載并解壓:從官方網(wǎng)站下載Nifi的Windows版本,并解壓到指定目錄。配置環(huán)境變量:在系統(tǒng)環(huán)境變量中添加Nifi的路徑。啟動Nifi:雙擊nifi.bat文件來啟動Nifi服務(wù)。2.3配置Nifi基本設(shè)置2.3.1啟動Nifi無論在Linux還是Windows系統(tǒng)上,啟動Nifi后,可以通過瀏覽器訪問http://localhost:8080/nifi來打開Nifi的WebUI。2.3.2配置Nifi屬性Nifi的配置文件位于$NIFI_HOME/conf目錄下,主要的配置文件是perties。在這個文件中,你可以配置Nifi的各種屬性,包括:日志級別:設(shè)置Nifi的日志輸出級別。數(shù)據(jù)存儲位置:指定Nifi的數(shù)據(jù)存儲目錄。線程數(shù)量:配置Nifi處理數(shù)據(jù)的線程數(shù)量。例如,修改數(shù)據(jù)存儲位置:#在perties文件中修改數(shù)據(jù)存儲位置

nifi.flowfile.repository.directory=/path/to/your/data/repository2.3.3創(chuàng)建數(shù)據(jù)流在Nifi的WebUI中,你可以開始創(chuàng)建數(shù)據(jù)流。數(shù)據(jù)流由處理器、控制器服務(wù)和連接組成。處理器負(fù)責(zé)數(shù)據(jù)的讀取、轉(zhuǎn)換和寫入,控制器服務(wù)提供配置和管理功能,連接則定義了數(shù)據(jù)在處理器之間的流動路徑。示例:創(chuàng)建一個簡單的數(shù)據(jù)流添加處理器:在Nifi的畫布上添加一個GetFile處理器,用于讀取文件。配置處理器:配置GetFile處理器的屬性,包括輸入目錄和輸出目錄。<!--在Nifi的XML配置中,處理器的配置如下-->

<processorid="..."type="cessors.standard.GetFile">

<name>GetFile</name>

<scheduledState>ENABLED</scheduledState>

<schedulingPeriod>0sec</schedulingPeriod>

<executionNode>ALL</executionNode>

<properties>

<property>

<name>InputDirectory</name>

<value>/path/to/input/directory</value>

</property>

<property>

<name>OutputDirectory</name>

<value>/path/to/output/directory</value>

</property>

</properties>

</processor>添加轉(zhuǎn)換處理器:添加一個PutFile處理器,用于將轉(zhuǎn)換后的數(shù)據(jù)寫入到另一個目錄。連接處理器:使用連接將GetFile處理器的輸出連接到PutFile處理器的輸入。2.3.4配置控制器服務(wù)控制器服務(wù)提供對處理器的配置和管理,例如數(shù)據(jù)庫連接、加密服務(wù)等。在Nifi中,你可以創(chuàng)建和配置控制器服務(wù),然后將其與處理器關(guān)聯(lián)。示例:配置數(shù)據(jù)庫連接服務(wù)添加控制器服務(wù):在Nifi的WebUI中添加一個JDBCConnectionPool控制器服務(wù)。配置服務(wù)屬性:配置數(shù)據(jù)庫的URL、用戶名和密碼。<!--在Nifi的XML配置中,控制器服務(wù)的配置如下-->

<controllerServiceid="..."type="org.apache.nifi.services.jdbc.JdbcConnectionPoolService">

<name>DatabaseConnection</name>

<properties>

<property>

<name>URL</name>

<value>jdbc:mysql://localhost:3306/your_database</value>

</property>

<property>

<name>Username</name>

<value>your_username</value>

</property>

<property>

<name>Password</name>

<value>your_password</value>

</property>

</properties>

</controllerService>關(guān)聯(lián)處理器:將創(chuàng)建的控制器服務(wù)與需要使用數(shù)據(jù)庫連接的處理器關(guān)聯(lián)。通過以上步驟,你已經(jīng)成功安裝、配置并創(chuàng)建了一個基本的數(shù)據(jù)流在ApacheNifi中。接下來,你可以根據(jù)具體的數(shù)據(jù)集成需求,添加更多的處理器和控制器服務(wù),以及配置更復(fù)雜的數(shù)據(jù)流。3理解Nifi架構(gòu)3.1Nifi的組件:處理器、控制器服務(wù)、連接、流程文件3.1.1處理器(Processors)在ApacheNiFi中,處理器是執(zhí)行數(shù)據(jù)流操作的核心組件。它們可以讀取、寫入、轉(zhuǎn)換、路由、過濾或執(zhí)行其他操作來處理數(shù)據(jù)。每個處理器都有特定的功能,例如GetFile用于從文件系統(tǒng)中讀取數(shù)據(jù),PutFile用于將數(shù)據(jù)寫回到文件系統(tǒng),UpdateAttribute用于修改數(shù)據(jù)流文件的屬性等。示例:使用ExecuteScript處理器進(jìn)行數(shù)據(jù)轉(zhuǎn)換-**處理器名稱**:ExecuteScript

-**描述**:使用腳本語言(如Groovy、Python)執(zhí)行自定義的數(shù)據(jù)轉(zhuǎn)換邏輯。

-**配置**:

-選擇腳本引擎(例如Groovy)

-編寫腳本代碼//Groovy腳本示例:將JSON數(shù)據(jù)轉(zhuǎn)換為CSV

defjson=newgroovy.json.JsonSlurper().parseText(newString(content))

defcsv="${},${json.age},${json.gender}"

flowFile=session.write(flowFile,{it<<csv.getBytes()})

session.transfer(flowFile,REL_SUCCESS)此腳本將讀取的JSON數(shù)據(jù)轉(zhuǎn)換為CSV格式,并將結(jié)果寫回到數(shù)據(jù)流文件中。3.1.2控制器服務(wù)(ControllerServices)控制器服務(wù)提供對NiFi處理器和報告任務(wù)的配置和管理。它們可以是認(rèn)證服務(wù)、加密服務(wù)、數(shù)據(jù)庫連接服務(wù)等,用于支持處理器的運行。例如,StandardJDBCDatabaseClient控制器服務(wù)可以配置數(shù)據(jù)庫連接,供需要訪問數(shù)據(jù)庫的處理器使用。示例:使用StandardJDBCDatabaseClient連接數(shù)據(jù)庫-**控制器服務(wù)名稱**:StandardJDBCDatabaseClient

-**描述**:配置數(shù)據(jù)庫連接,使處理器能夠訪問數(shù)據(jù)庫。

-**配置**:

-數(shù)據(jù)庫類型(例如MySQL)

-數(shù)據(jù)庫URL

-用戶名和密碼3.1.3連接(Connections)連接定義了數(shù)據(jù)流文件從一個處理器到另一個處理器的路徑。它們可以是直接連接,也可以是通過隊列進(jìn)行緩沖的連接。連接還允許設(shè)置優(yōu)先級和數(shù)據(jù)流文件的過期策略。示例:創(chuàng)建連接在NiFi的畫布上,從一個處理器拖出連接線到另一個處理器,即可創(chuàng)建連接。在連接的屬性中,可以設(shè)置數(shù)據(jù)流文件的優(yōu)先級和過期策略。3.1.4流程文件(FlowFiles)流程文件是NiFi中數(shù)據(jù)的表示形式。它們包含數(shù)據(jù)內(nèi)容、屬性和元數(shù)據(jù)。流程文件在NiFi的畫布上從一個處理器流向另一個處理器,直到數(shù)據(jù)被最終處理或輸出。示例:流程文件的屬性-**屬性**:`filename`、`path`、`mime.type`等

-**描述**:這些屬性描述了流程文件的元數(shù)據(jù),如文件名、路徑和MIME類型。3.2Nifi的工作流設(shè)計原理NiFi的工作流設(shè)計基于數(shù)據(jù)流編程模型,其中數(shù)據(jù)被看作是通過一系列處理步驟(由處理器執(zhí)行)流動的實體。工作流設(shè)計的關(guān)鍵在于理解數(shù)據(jù)如何在不同的組件之間流動,以及如何通過配置這些組件來實現(xiàn)復(fù)雜的數(shù)據(jù)處理任務(wù)。3.2.1工作流設(shè)計步驟定義數(shù)據(jù)源:使用如GetFile、GetHTTP等處理器來讀取數(shù)據(jù)。數(shù)據(jù)處理:通過一系列處理器(如UpdateAttribute、SplitText、ExecuteScript)來轉(zhuǎn)換、過濾和富集數(shù)據(jù)。數(shù)據(jù)目標(biāo):使用如PutFile、PublishKafka等處理器來輸出或發(fā)送處理后的數(shù)據(jù)。錯誤處理:設(shè)計工作流時,應(yīng)考慮錯誤處理機制,如使用LogError處理器記錄錯誤,或使用RouteOnAttribute處理器根據(jù)屬性值進(jìn)行路由。3.2.2示例:設(shè)計一個簡單的數(shù)據(jù)富集工作流數(shù)據(jù)源:使用GetFile處理器從文件系統(tǒng)讀取數(shù)據(jù)。數(shù)據(jù)處理:使用UpdateAttribute處理器添加或修改流程文件的屬性。使用ExecuteScript處理器執(zhí)行數(shù)據(jù)轉(zhuǎn)換邏輯。使用LookupTable處理器從外部數(shù)據(jù)源(如數(shù)據(jù)庫)查找和富集數(shù)據(jù)。數(shù)據(jù)目標(biāo):使用PutFile處理器將富集后的數(shù)據(jù)寫回到文件系統(tǒng)。工作流設(shè)計圖在NiFi的畫布上,將上述組件連接起來,形成一個從數(shù)據(jù)源到數(shù)據(jù)目標(biāo)的完整路徑。確保每個處理器的配置正確,以實現(xiàn)預(yù)期的數(shù)據(jù)處理和富集功能。通過以上組件和設(shè)計原理的介紹,您可以開始構(gòu)建和優(yōu)化自己的數(shù)據(jù)集成工作流,利用ApacheNiFi的強大功能來處理和富集數(shù)據(jù)。4數(shù)據(jù)轉(zhuǎn)換技術(shù)4.1使用處理器進(jìn)行數(shù)據(jù)轉(zhuǎn)換在ApacheNiFi中,數(shù)據(jù)轉(zhuǎn)換是通過使用各種處理器來實現(xiàn)的。這些處理器可以修改、過濾、或以其他方式處理流文件中的內(nèi)容。下面,我們將詳細(xì)介紹幾個關(guān)鍵的處理器,以及如何使用它們來執(zhí)行數(shù)據(jù)轉(zhuǎn)換。4.1.1UpdateAttributeUpdateAttribute處理器用于修改流文件的屬性。這在數(shù)據(jù)集成過程中非常有用,例如,你可能需要更新文件名、添加時間戳、或者設(shè)置文件的來源或目的地。示例代碼:<processor>

<id>12345678-1234-1234-1234-1234567890ab</id>

<name>UpdateAttributeExample</name>

<type>cessors.standard.UpdateAttribute</type>

<bundle>

<groupId>org.apache.nifi</groupId>

<artifactId>nifi-standard-nar</artifactId>

<version>1.13.0</version>

</bundle>

<properties>

<property>

<name>AttributeExpressionLanguage</name>

<value>filename=${filename:replace('old','new')}</value>

</property>

</properties>

<scheduling>

<runDurationSec>0</runDurationSec>

<schedulingStrategy>EVENT_DRIVEN</schedulingStrategy>

<penalizationPeriodSec>300</penalizationPeriodSec>

<yieldPeriodSec>1</yieldPeriodSec>

</scheduling>

<execution>

<onTrigger>

<runDurationSec>0</runDurationSec>

<schedulingStrategy>EVENT_DRIVEN</schedulingStrategy>

<penalizationPeriodSec>300</penalizationPeriodSec>

<yieldPeriodSec>1</yieldPeriodSec>

</onTrigger>

</execution>

</processor>在這個例子中,我們使用UpdateAttribute處理器將所有流文件的filename屬性中的old替換為new。4.1.2ReplaceTextReplaceText處理器用于在流文件的內(nèi)容中替換文本。這對于標(biāo)準(zhǔn)化數(shù)據(jù)格式或修正數(shù)據(jù)中的錯誤非常有用。示例代碼:<processor>

<id>12345678-1234-1234-1234-1234567890cd</id>

<name>ReplaceTextExample</name>

<type>cessors.standard.ReplaceText</type>

<bundle>

<groupId>org.apache.nifi</groupId>

<artifactId>nifi-standard-nar</artifactId>

<version>1.13.0</version>

</bundle>

<properties>

<property>

<name>SearchValue</name>

<value>old</value>

</property>

<property>

<name>ReplaceValue</name>

<value>new</value>

</property>

</properties>

</processor>假設(shè)流文件的內(nèi)容為Thisisanoldfile,使用ReplaceText處理器后,內(nèi)容將被修改為Thisisannewfile。4.1.3SplitTextSplitText處理器用于將流文件的內(nèi)容分割成多個流文件。這在處理大量數(shù)據(jù)或需要按特定模式分割數(shù)據(jù)時非常有用。示例代碼:<processor>

<id>12345678-1234-1234-1234-1234567890ef</id>

<name>SplitTextExample</name>

<type>cessors.standard.SplitText</type>

<bundle>

<groupId>org.apache.nifi</groupId>

<artifactId>nifi-standard-nar</artifactId>

<version>1.13.0</version>

</bundle>

<properties>

<property>

<name>LineSplitCount</name>

<value>10</value>

</property>

</properties>

</processor>如果原始流文件包含100行文本,SplitText處理器將它分割成10個流文件,每個文件包含10行文本。4.2數(shù)據(jù)轉(zhuǎn)換策略與最佳實踐在設(shè)計數(shù)據(jù)轉(zhuǎn)換流程時,遵循一些策略和最佳實踐可以提高效率和可靠性。4.2.1使用AttributeExpressionLanguage(AEL)AEL是一種強大的語言,用于在處理器中動態(tài)地設(shè)置屬性。它允許你根據(jù)流文件的內(nèi)容或?qū)傩詠韯討B(tài)地修改屬性值。4.2.2避免不必要的數(shù)據(jù)復(fù)制在數(shù)據(jù)轉(zhuǎn)換過程中,盡量避免不必要的數(shù)據(jù)復(fù)制。例如,如果只需要修改流文件的屬性,使用UpdateAttribute處理器而不是PutFile或WriteFile處理器。4.2.3利用NiFi的流文件結(jié)構(gòu)流文件在NiFi中是一個靈活的數(shù)據(jù)結(jié)構(gòu),它包含內(nèi)容和屬性。利用這一點,你可以在轉(zhuǎn)換過程中同時修改內(nèi)容和屬性,而不需要額外的處理器。4.2.4使用批處理對于大型數(shù)據(jù)集,使用批處理可以顯著提高處理速度。例如,ExecuteStreamCommand處理器可以配置為批處理模式,以一次處理多個流文件。4.2.5監(jiān)控和調(diào)試在設(shè)計和運行數(shù)據(jù)轉(zhuǎn)換流程時,監(jiān)控和調(diào)試是必不可少的。使用NiFi的監(jiān)控工具,如LogAttribute和LogMessage處理器,可以幫助你理解流程的執(zhí)行情況,并及時發(fā)現(xiàn)和解決問題。通過遵循這些策略和最佳實踐,你可以構(gòu)建出高效、可靠、且易于維護(hù)的數(shù)據(jù)轉(zhuǎn)換流程。ApacheNiFi提供了一個強大的平臺,通過其豐富的處理器集合,你可以輕松地實現(xiàn)數(shù)據(jù)的轉(zhuǎn)換和富集,滿足各種數(shù)據(jù)集成需求。5數(shù)據(jù)富集技術(shù)5.1數(shù)據(jù)富集的概念與重要性數(shù)據(jù)富集(DataEnrichment)是指在原始數(shù)據(jù)的基礎(chǔ)上,通過添加額外的信息或數(shù)據(jù),來增強數(shù)據(jù)的價值和可用性。這一過程通常涉及到從多個數(shù)據(jù)源中收集數(shù)據(jù),然后將這些數(shù)據(jù)整合到一起,以提供更全面、更深入的洞察。數(shù)據(jù)富集對于數(shù)據(jù)分析、客戶關(guān)系管理、市場營銷、風(fēng)險評估等領(lǐng)域至關(guān)重要,因為它可以幫助組織更好地理解其數(shù)據(jù),從而做出更明智的決策。5.1.1重要性提高數(shù)據(jù)質(zhì)量:通過添加缺失的信息,數(shù)據(jù)富集可以提高數(shù)據(jù)的完整性和準(zhǔn)確性。增強決策能力:富集后的數(shù)據(jù)提供了更豐富的上下文,有助于更準(zhǔn)確地分析趨勢和模式。個性化服務(wù):在客戶數(shù)據(jù)中添加額外的屬性,如地理位置、購買歷史等,可以實現(xiàn)更個性化的服務(wù)和營銷策略。風(fēng)險評估:結(jié)合外部數(shù)據(jù),如信用評分、行業(yè)趨勢等,可以更準(zhǔn)確地評估業(yè)務(wù)風(fēng)險。5.2Nifi中的數(shù)據(jù)富集方法ApacheNiFi是一個強大的數(shù)據(jù)流處理和集成系統(tǒng),它提供了多種工具和處理器來實現(xiàn)數(shù)據(jù)富集。以下是一些在NiFi中進(jìn)行數(shù)據(jù)富集的常見方法:5.2.1使用EnrichHTTP處理器EnrichHTTP處理器允許NiFi從外部HTTP服務(wù)獲取數(shù)據(jù),然后將這些數(shù)據(jù)添加到流文件中。例如,如果流文件包含一個客戶ID,你可以使用EnrichHTTP處理器從一個外部API獲取該客戶的詳細(xì)信息,如地址、電話號碼等,并將這些信息添加到流文件中。示例假設(shè)我們有一個包含客戶ID的CSV文件,我們想要通過調(diào)用一個外部API來獲取每個客戶的詳細(xì)信息。以下是如何配置EnrichHTTP處理器的步驟:創(chuàng)建HTTP請求:設(shè)置EnrichHTTP處理器的URL,以指向API的端點。例如,/customer/{customerId}。設(shè)置請求方法:通常為GET或POST。添加查詢參數(shù)或請求體:如果API需要額外的參數(shù),可以在處理器中設(shè)置。解析響應(yīng):使用ExtractText或ConvertRecord處理器來解析API響應(yīng),并將其添加到原始流文件中。<!--NiFiXML配置示例-->

<processorclass="cessors.standard.EnrichHTTP">

<propertyname="URL"value="/customer/{customerId}"/>

<propertyname="HTTPMethod"value="GET"/>

<!--其他配置-->

</processor>5.2.2使用Join處理器Join處理器可以將多個流文件合并成一個,基于一個共同的屬性或鍵。這對于從多個數(shù)據(jù)源收集數(shù)據(jù)并將其整合到一個文件中非常有用。示例假設(shè)我們有兩個CSV文件,一個包含客戶的基本信息,另一個包含客戶的購買歷史。我們想要將這兩個文件合并,基于客戶ID。以下是如何配置Join處理器的步驟:設(shè)置主鍵:在Join處理器中,設(shè)置主鍵為customerId。配置輸入隊列:將兩個CSV文件的輸出隊列配置為Join處理器的輸入隊列。選擇合并策略:可以選擇all、any或first策略來確定如何處理具有相同鍵的多個記錄。<!--NiFiXML配置示例-->

<processorclass="cessors.standard.Join">

<propertyname="JoinKey"value="customerId"/>

<!--其他配置-->

</processor>5.2.3使用PutKafkaRecord和GetKafkaRecord處理器通過使用PutKafkaRecord和GetKafkaRecord處理器,NiFi可以從Kafka主題中讀取數(shù)據(jù),然后將這些數(shù)據(jù)添加到正在處理的流文件中。這對于實時數(shù)據(jù)富集特別有用,例如,從實時日志中獲取數(shù)據(jù)以增強分析。示例假設(shè)我們有一個Kafka主題,其中包含實時的客戶活動數(shù)據(jù)。我們想要將這些數(shù)據(jù)添加到我們的客戶信息流文件中。以下是如何配置GetKafkaRecord處理器的步驟:設(shè)置Kafka連接:提供Kafka集群的連接信息,包括Broker列表、主題名稱等。配置消費者組:設(shè)置一個消費者組ID,以確保數(shù)據(jù)的正確處理和消費。解析Kafka記錄:使用ConvertRecord處理器將Kafka記錄轉(zhuǎn)換為NiFi可以理解的格式。<!--NiFiXML配置示例-->

<processorclass="cessors.kafka.KafkaConsumer">

<propertyname="KafkaBroker"value="localhost:9092"/>

<propertyname="ConsumerGroup"value="myConsumerGroup"/>

<!--其他配置-->

</processor>通過上述方法,ApacheNiFi提供了一個靈活且強大的框架,用于實現(xiàn)數(shù)據(jù)富集,從而幫助組織從其數(shù)據(jù)中獲得更多的價值。無論是從外部API獲取數(shù)據(jù),還是整合多個數(shù)據(jù)源,NiFi都能提供必要的工具和處理器來完成任務(wù)。6實戰(zhàn)案例分析6.1數(shù)據(jù)轉(zhuǎn)換實戰(zhàn)案例在ApacheNiFi中,數(shù)據(jù)轉(zhuǎn)換是一個核心功能,允許用戶在數(shù)據(jù)流中對數(shù)據(jù)進(jìn)行各種操作,如解析、格式化、過濾、重寫等。下面,我們將通過一個具體的實戰(zhàn)案例來展示如何使用NiFi進(jìn)行數(shù)據(jù)轉(zhuǎn)換。6.1.1案例背景假設(shè)我們有一個日志文件流,其中包含JSON格式的日志數(shù)據(jù)。這些日志數(shù)據(jù)需要被轉(zhuǎn)換成CSV格式,以便于進(jìn)一步的分析和處理。我們將使用ApacheNiFi的ExecuteStreamCommand和ConvertRecord處理器來完成這一任務(wù)。6.1.2數(shù)據(jù)樣例原始JSON數(shù)據(jù)樣例如下:{

"timestamp":"2023-01-01T12:00:00Z",

"user":"alice",

"action":"login",

"details":{

"ip":"",

"location":"NewYork"

}

}6.1.3NiFi配置步驟創(chuàng)建NiFi流程:在NiFi的畫布上,首先添加一個GetFile處理器來讀取JSON日志文件。解析JSON數(shù)據(jù):使用ExecuteStreamCommand處理器,執(zhí)行json命令來解析JSON數(shù)據(jù)。在CommandArguments中輸入json,并在CommandProperties中配置json命令的參數(shù),以確保正確解析JSON結(jié)構(gòu)。轉(zhuǎn)換數(shù)據(jù)格式:接下來,添加一個ConvertRecord處理器。在RecordReader中選擇JSON,在RecordWriter中選擇CSV。這將把JSON數(shù)據(jù)轉(zhuǎn)換成CSV格式。輸出CSV數(shù)據(jù):最后,使用PutFile處理器將轉(zhuǎn)換后的CSV數(shù)據(jù)寫入到指定的目錄中。6.1.4NiFi配置示例在ConvertRecord處理器中,配置如下:RecordReader:選擇JSON,并確保SchemaAccessStrategy設(shè)置為SchemaText,在SchemaText字段中輸入或粘貼JSON數(shù)據(jù)的模式。RecordWriter:選擇CSV,并配置CSV的列名和數(shù)據(jù)類型,以匹配JSON數(shù)據(jù)的結(jié)構(gòu)。6.1.5代碼示例雖然NiFi主要通過圖形界面進(jìn)行配置,但我們可以使用NiFi的API來創(chuàng)建和配置處理器,以下是一個使用Python調(diào)用NiFiRESTAPI創(chuàng)建ConvertRecord處理器的示例代碼:importrequests

importjson

#NiFiRESTAPIURL

nifi_url="http://localhost:8080/nifi-api"

#創(chuàng)建ConvertRecord處理器

processor_data={

"component":{

"name":"ConvertRecordExample",

"type":"ConvertRecord",

"bundle":{

"groupId":"org.apache.nifi",

"artifactId":"nifi-standard-nar",

"version":"1.13.0"

},

"properties":{

"RecordReader":"JSON",

"RecordWriter":"CSV",

"SchemaAccessStrategy":"SchemaText",

"SchemaText":"{\"type\":\"record\",\"name\":\"Log\",\"fields\":[{\"name\":\"timestamp\",\"type\":\"string\"},{\"name\":\"user\",\"type\":\"string\"},{\"name\":\"action\",\"type\":\"string\"},{\"name\":\"details\",\"type\":{\"type\":\"record\",\"name\":\"Details\",\"fields\":[{\"name\":\"ip\",\"type\":\"string\"},{\"name\":\"location\",\"type\":\"string\"}]}},]}"

},

"schedulingPeriod":"0sec",

"executionNode":"ALL"

}

}

headers={'Content-Type':'application/json'}

response=requests.post(f"{nifi_url}/process-groups/root/processors",headers=headers,data=json.dumps(processor_data))

ifresponse.status_code==201:

print("ConvertRecordprocessorcreatedsuccessfully.")

else:

print(f"Failedtocreateprocessor:{response.text}")6.1.6解釋上述代碼示例展示了如何使用Python和NiFi的RESTAPI來創(chuàng)建一個ConvertRecord處理器。處理器被配置為讀取JSON數(shù)據(jù),并將其轉(zhuǎn)換為CSV格式。SchemaText字段中包含了JSON數(shù)據(jù)的模式,這確保了數(shù)據(jù)轉(zhuǎn)換的準(zhǔn)確性。6.2數(shù)據(jù)富集實戰(zhàn)案例數(shù)據(jù)富集是指在數(shù)據(jù)流中添加額外的信息或數(shù)據(jù),以增強原始數(shù)據(jù)的價值。在ApacheNiFi中,我們可以使用EnrichRecord處理器來實現(xiàn)這一功能。6.2.1案例背景假設(shè)我們有一個用戶行為日志流,其中包含用戶ID和行為類型。為了更好地理解用戶行為,我們需要從外部數(shù)據(jù)庫中獲取用戶的詳細(xì)信息(如姓名、年齡等),并將其添加到日志數(shù)據(jù)中。6.2.2數(shù)據(jù)樣例原始日志數(shù)據(jù)樣例如下:{

"userId":"123",

"action":"purchase"

}6.2.3NiFi配置步驟讀取日志數(shù)據(jù):使用GetFile處理器讀取日志文件。數(shù)據(jù)富集:添加EnrichRecord處理器,配置RecordReader為JSON,并使用LookupTableRecordEnricher來從外部數(shù)據(jù)庫中查找用戶信息。輸出富集后的數(shù)據(jù):使用PutFile處理器將富集后的數(shù)據(jù)寫入到新的文件中。6.2.4NiFi配置示例在EnrichRecord處理器中,配置如下:RecordReader:選擇JSON。RecordEnrichers:添加LookupTableRecordEnricher,并配置LookupTable為之前創(chuàng)建的用戶信息表。6.2.5代碼示例雖然NiFi的配置主要通過圖形界面完成,但我們可以使用NiFi的API來創(chuàng)建和配置EnrichRecord處理器。以下是一個使用Python調(diào)用NiFiRESTAPI創(chuàng)建EnrichRecord處理器的示例代碼:processor_data={

"component":{

"name":"EnrichRecordExample",

"type":"EnrichRecord",

"bundle":{

"groupId":"org.apache.nifi",

"artifactId":"nifi-standard-nar",

"version":"1.13.0"

},

"properties":{

"RecordReader":"JSON",

"RecordEnrichers":"LookupTableRecordEnricher",

"LookupTable":"UserInformationTable",

"LookupTableKey":"userId",

"LookupTableValue":"userDetails"

},

"schedulingPeriod":"0sec",

"executionNode":"ALL"

}

}

response=requests.post(f"{nifi_url}/process-groups/root/processors",headers=headers,data=json.dumps(processor_data))

ifresponse.status_code==201:

print("EnrichRecordprocessorcreatedsuccessfully.")

else:

print(f"Failedtocreateprocessor:{response.text}")6.2.6解釋上述代碼示例展示了如何使用Python和NiFi的RESTAPI來創(chuàng)建一個EnrichRecord處理器。處理器被配置為讀取JSON日志數(shù)據(jù),并使用LookupTableRecordEnricher從外部數(shù)據(jù)源(如數(shù)據(jù)庫)中查找與userId相關(guān)的用戶詳細(xì)信息,然后將這些信息添加到日志數(shù)據(jù)中,實現(xiàn)數(shù)據(jù)的富集。通過這兩個實戰(zhàn)案例,我們可以看到ApacheNiFi在數(shù)據(jù)轉(zhuǎn)換和富集方面的強大功能,以及如何通過NiFi的RESTAPI進(jìn)行自動化配置,以適應(yīng)不同的數(shù)據(jù)處理需求。7高級功能與優(yōu)化7.1Nifi的高級控制器服務(wù)在ApacheNiFi中,控制器服務(wù)提供了一種管理NiFi配置參數(shù)的方式,這些參數(shù)可以被多個處理器共享和引用。高級控制器服務(wù)通常涉及到更復(fù)雜的功能,如數(shù)據(jù)庫連接、加密服務(wù)、身份驗證和授權(quán)服務(wù)等。這些服務(wù)的使用可以極大地提高NiFi處理數(shù)據(jù)的效率和安全性。7.1.1數(shù)據(jù)庫連接控制器服務(wù)例如,使用JDBCConnectionPoolControllerService可以創(chuàng)建一個數(shù)據(jù)庫連接池,供多個需要訪問數(shù)據(jù)庫的處理器使用。這樣可以避免每次訪問數(shù)據(jù)庫時都創(chuàng)建新的連接,從而提高性能。#配置示例

JDBCConnectionPool:

Name:MyDatabaseConnection

DriverClass:org.postgresql.Driver

URL:jdbc:postgresql://localhost:5432/mydatabase

UserName:myuser

Password:mypassword

MaximumConnections:107.1.2加密服務(wù)StandardEncryptionService是一個加密服務(wù),可以用來加密和解密NiFi中的敏感數(shù)據(jù)。例如,如果在NiFi中存儲了數(shù)據(jù)庫密碼,可以使用加密服務(wù)來保護(hù)這些信息。//加密示例

StandardEncryptionServiceencryptionService=newStandardEncryptionService();

encryptionService.initialize();

StringencryptedPassword=encryptionService.encrypt("mypassword");7.1.3身份驗證和授權(quán)服務(wù)KerberosAuthenticationService和LdapAuthorizationService是用于身份驗證和授權(quán)的高級控制器服務(wù)。它們可以確保只有經(jīng)過認(rèn)證的用戶才能訪問NiFi,并且根據(jù)用戶的角色來限制他們可以執(zhí)行的操作。#KerberosAuthenticationService配置示例

KerberosAuthenticationService:

Name:MyKerberosService

Principal:niuser@NIFI.DOMAIN

KeytabFile:/path/to/niuser.keytab7.2性能調(diào)優(yōu)與監(jiān)控技術(shù)ApacheNiFi的性能調(diào)優(yōu)和監(jiān)控是確保數(shù)據(jù)流處理高效、穩(wěn)定的關(guān)鍵。這包括對NiFi的配置進(jìn)行優(yōu)化,以及使用監(jiān)控工具來實時查看NiFi的運行狀態(tài)。7.2.1NiFi配置優(yōu)化NiFi的配置文件perties中包含了大量可以調(diào)整的參數(shù),如線程池大小、內(nèi)存分配、數(shù)據(jù)緩存策略等。例如,調(diào)整nifi.flowfile.repository.max.cache.size參數(shù)可以控制NiFi緩存的大小,從而影響數(shù)據(jù)處理的性能。#perties配置示例

nifi.flowfile.repository.max.cache.size=1000007.2.2監(jiān)控工具NiFi提供了內(nèi)置的監(jiān)控工具,如NiFiStatus和NiFiMetrics,可以用來查看NiFi的運行狀態(tài)和性能指標(biāo)。此外,還可以使用外部監(jiān)控工具,如Prometheus和Grafana,來收集和可視化NiFi的性能數(shù)據(jù)。#使用Prometheus監(jiān)控NiFi

#首先,配置NiFi以啟用Prometheus監(jiān)控

metheus.enabled=true

metheus.port=9400

#然后,使用Prometheus抓取NiFi的性能數(shù)據(jù)

prometheus--web.listen-address=:9090--storage.tsdb.path=/prometheus--config.file=prometheus.yml

#最后,使用Grafana來可視化這些數(shù)據(jù)通過上述高級控制器服務(wù)和性能調(diào)優(yōu)與監(jiān)控技術(shù)的使用,可以確保ApacheNiFi在處理大量數(shù)據(jù)時的高效性和安全性。8常見問題與解決方案8.1數(shù)據(jù)轉(zhuǎn)換常見問題8.1.1問題1:如何在ApacheNiFi中使用ExecuteScript處理器進(jìn)行數(shù)據(jù)格式轉(zhuǎn)換?在ApacheNiFi中,ExecuteScript處理器是一個強大的工具,可以使用腳本語言(如Groovy、Python或JavaScript)來執(zhí)行復(fù)雜的轉(zhuǎn)換任務(wù)。例如,將JSON格式的數(shù)據(jù)轉(zhuǎn)換為CSV格式。示例代碼//Groovy腳本示例:將JSON轉(zhuǎn)換為CSV

importgroovy.json.JsonSlurper

importcessor.io.StreamCallback

importmons.io.output.ByteArrayOutputStream

importmons.io.input.ByteArrayInputStream

publicclassJsonToCsvCallbackimplementsStreamCallback{

@Override

publicvoidprocess(finalInputStreamin,finalOutputStreamout)throwsIOException{

ByteArrayOutputStreambaos=newByteArrayOutputStream()

ByteArrayInputStreambais=newByteArrayInputStream(in.readAllBytes())

JsonSlurperslurper=newJsonSlurper()

defjson=slurper.parse(bais)

//假設(shè)JSON數(shù)據(jù)結(jié)構(gòu)為:{"name":"John","age":30,"city":"NewYork"}

out.write(("$,$json.age,$json.city\n").getBytes())

}

}解釋此Groovy腳本示例中,我們使用JsonSlurper類從輸入流中解析JSON數(shù)據(jù)。然后,將解析后的JSON對象的屬性轉(zhuǎn)換為CSV格式,并寫入輸出流。在NiFi中配置ExecuteScript處理器時,選擇Groovy作為腳本語言,并將上述腳本代碼粘貼到處理器的腳本引擎中。8.1.2問題2:如何處理數(shù)據(jù)轉(zhuǎn)換中的時間戳格式不一致問題?在數(shù)據(jù)集成過程中,時間戳格式的不一致可能導(dǎo)致數(shù)據(jù)解析錯誤。ApacheNiFi提供了ConvertRecord處理器,可以使用Avro或JSON格式來標(biāo)準(zhǔn)化時間戳。示例配置添加ConvertRecord處理器。選擇Avro或JSON作為轉(zhuǎn)換類型。在Schema配置中,確保時間戳字段的類型為long,并使用UNIX_MILLISECONDS或UNIX_SECONDS作為時間單位。使用UpdateRecord處理器來更新時間戳字段的格式。8.1.3問題3:如何在數(shù)據(jù)轉(zhuǎn)換中使用正則表達(dá)式?在數(shù)據(jù)轉(zhuǎn)換過程中,正則表達(dá)式可以用于數(shù)據(jù)清洗和格式化。ApacheNiFi的ReplaceText處理器支持使用正則表達(dá)式來匹配和替換文本。示例配置添加ReplaceText處理器。在SearchValue中輸入正則表達(dá)式,例如[[:space:]]+用于匹配一個或多個空格。在ReplacementValue中輸入替換的文本,例如-用于將匹配到的空格替換為破折號。8.2數(shù)據(jù)富集常見問題8.2.1問題1:如何在ApacheNiFi中使用LookupTable處理器進(jìn)行數(shù)據(jù)富集?LookupTable處理器可以用于從外部數(shù)據(jù)源(如數(shù)據(jù)庫或文件)中查找和添加額外的信息到流文件中,實現(xiàn)數(shù)據(jù)富集。示例配置添加LookupTable處理器。配置數(shù)據(jù)源,例如設(shè)置JDBC連接以從數(shù)據(jù)庫中讀取數(shù)據(jù)。定義查詢語句,例如SELECT*FROMusersWHEREid=${flowFile:id}。使用PutAttribute處理器將查詢結(jié)果添加到流文件的屬性中。8.2.2問題2:如何處理數(shù)據(jù)富集中的數(shù)據(jù)類型不匹配問題?在數(shù)據(jù)富集過程中,從不同數(shù)據(jù)源獲取的數(shù)據(jù)可能具有不同的數(shù)據(jù)類型。使用ConvertRecord處理器可以解決數(shù)據(jù)類型不匹配的問題。示例配置添加ConvertRecord處理器。選擇Avro或JSON作為轉(zhuǎn)換類型。在Schema配置中,確保所有字段的數(shù)據(jù)類型一致。使用UpdateRecord處理器來更新字段的類型。8.2.3問題3:如何在數(shù)據(jù)富集中處理數(shù)據(jù)延遲問題?數(shù)據(jù)延遲可能影響數(shù)據(jù)富集的實時性。ApacheNiFi的ScheduleTrigger和QueueSizeTrigger可以用于優(yōu)化數(shù)據(jù)處理流程,減少延遲。示例配置調(diào)整ScheduleTrigger的調(diào)度策略,例如設(shè)置為0sec以立即執(zhí)行。使用QueueSizeTrigger來監(jiān)控隊列大小,當(dāng)隊列達(dá)到一定大小時觸發(fā)處理器執(zhí)行,以避免數(shù)據(jù)積壓。通過上述示例和解決方案,可以有效地在ApacheNiFi中進(jìn)行數(shù)據(jù)轉(zhuǎn)換和富集,解決常見的技術(shù)問題。9數(shù)據(jù)集成工具:ApacheNifi:數(shù)據(jù)轉(zhuǎn)換與富集技術(shù)9.1Nifi社區(qū)與資源9.1.1參與Nifi社區(qū)ApacheNifi是一個強大的數(shù)據(jù)集成工具,旨在處理和路由數(shù)據(jù)流。參與Nifi社區(qū)不僅可以幫助你解決在使用過程中遇到的問題,還能讓你了解最新的開發(fā)動態(tài)和最佳實踐。社區(qū)成員包括開發(fā)者、用戶和貢獻(xiàn)者,他們通過郵件列表、論壇和GitHub等平臺進(jìn)行交流。郵件列表:加入Nifi的郵件列表,如nifi-users@,可以讓你訂閱社區(qū)的討論,提出問題并獲取幫助。論壇:Nifi的官方論壇是獲取和分享知識的好地方。你可以在這里找到關(guān)于配置、使用和開發(fā)Nifi的詳細(xì)討論。GitHub:Nifi的GitHub倉庫不僅提供了源代碼,還有許多示例和插件。貢獻(xiàn)代碼或報告問題都是參與社區(qū)的方式之一。9.1.2獲取Nifi資源與文檔ApacheNifi提供了豐富的資源和文檔,幫助用戶快速上手并深入理解其功能。官方文檔:Nifi的官方文檔是學(xué)習(xí)Nifi的起點。它包括了安裝指南、用戶手冊和開發(fā)者指南,覆蓋了

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論