您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么將日志文件和二進制文件快速導入HDFS”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么將日志文件和二進制文件快速導入HDFS”吧!
首選數據移動方法
如果在舊版Hadoop環境中運行,我們可能需要一些工具來移動數據,這些工具都會在本章介紹。如果使用Kafka作為數據傳輸機制,則允許將生產者與消費者分離,同時使多個消費者能夠以不同的方式對數據進行操作。在這種情況下,我們可以使用Kafka在Hadoop上存儲數據,并為實時數據流系統(如Storm或Spark Streaming)提供數據,然后使用它執行近實時計算。比如,Lambda架構允許以小增量實時計算聚合數據,并使用批處理層執行糾錯和添加新數據點等,從而發揮實時和批處理系統的優勢 。
實踐:使用Flume將系統日志消息推送到HDFS
面對跨多個服務器的多個應用程序和系統生成的一堆日志文件,我們可能手忙腳亂。毫無疑問,從這些日志中可以挖掘出有價值的信息,但第一大挑戰是將這些日志移動到Hadoop集群以便可以執行某些分析。
版本注意事項
此處的Flume使用版本1.4。與所有軟件一樣,不保證此處介紹的技術,代碼和配置可以使用不同版本的Flume開箱即用。此外,Flume 1.4需要一些更新才能使其與Hadoop 2一起使用。
問題
希望將所有生產服務器的系統日志文件推送到HDFS。
解決方案
使用Flume(一種數據收集系統)將Linux日志文件推送到HDFS。
討論
Flume的核心是日志文件收集和分發,收集系統日志并傳輸到HDFS。此技術的第一步涉及捕獲附加到/var/log/messages的所有數據并將其傳輸到HDFS。我們將運行一個Flume agent(稍后詳細介紹),這將完成所有工作。
Flume agent需要配置文件指明該做什么,以下代碼為用例定義了一個:
要讓示例起作用,需要確保正在使用可以訪問Hadoop集群的主機,以及 HADOOP_HOME配置正確,還需要下載并安裝Flume并將FLUME_HOME設置為指向安裝目錄。
使用文件名tail-hdfspart1.conf將前面的文件復制到Flume conf目錄中。完成后,就可以啟動Flume agent實例了:
這應該會產生很多輸出,但最終應該看到類似于以下的輸出,表明一切都好了:
此時,應該看到HDFS中出現的一些數據:
.tmp后綴表示Flume打開文件并繼續寫入。一旦完成,這將重命名文件并刪除后綴:
可以捕獲此文件以檢查其內容,內容應與tail/var/log/messages對齊。
到目前為止,我們已經用Flume完成了第一次數據移動!
解析Flume agent
讓我們回過頭來檢查一下做了什么。主要有兩個部分:定義Flume配置文件,以及運行Flume agent。Flume配置文件包含有關源,通道和接收器的詳細信息,這些都是影響Flume數據流不同部分的概念。圖5.4顯示了Flume agent中的這些概念。
讓我們逐步介紹這些概念,包括用途以及工作原理。
Sources
Flume sources負責從外部客戶端或其他Flume接收器讀取數據。Flume中的數據單元被定義為一個事件,本質上是一個有效載荷和可選元數據集。Flume源將這些事件發送到一個或多個Flume通道,這些通道處理存儲和緩沖。
圖5.4 agent上下文中的Flume組件說明
Flume有一組廣泛的內置源,包括HTTP,JMS和RPC。讓我們來看看你設置的特定于源的配置屬性:
exec source允許執行Unix命令,標準輸出中發出的每一行都被捕獲為事件(默認情況下會忽略常見錯誤)。在前面的示例中,tail -F命令用于在生成系統消息時捕獲它們。如果可以更好地控制文件(例如,如果可以在完成所有寫入后將它們移動到目錄中),考慮使用Flume的假脫機目錄源(稱為spooldir),因為它提供了exec source無法獲得的可靠性語義。
僅使用tail進行測試
不鼓勵使用tail進行測試以外的任何操作。
此配置中突出顯示的另一個功能是攔截器,它允許向事件添加元數據。回想一下,HDFS中的數據是根據時間戳組織的:第一部分是日期,第二部分是時間:
之所以能這樣做,是因為使用時間戳攔截器修改了每個事件,時間戳攔截器將源處理事件的時間(以毫秒為單位)插入到事件頭。然后,Flume HDFS接收器使用此時間戳來確定事件寫入位置。
為了總結Flume sources,讓我們介紹一下其提供的功能:
事務語義,允許以至少一次語義可靠地移動數據,并非所有數據源都支持此功能。
攔截器,提供修改或刪除事件的功能。對于使用主機,時間和唯一標識符來注釋事件非常有用,這對于重復數據刪除非常有用。
選擇器,允許以各種方式扇出或多路復用事件,可以通過將事件復制到多個通道來扇出事件,也可以根據事件頭將事件路由到不同通道。
通道
Flume通道在agent內部提供數據存儲設施。源將事件添加到通道,并從通道中刪除事件。Flume內部的通道提供高可用性,可以根據應用所需的容量和吞吐量選擇。
Flume捆綁了三個通道:
內存通道將事件存儲在內存隊列中。這對于高吞吐數據流非常有用,但其沒有持久性保證,這意味著如果agent發生故障,用戶將丟失數據。
文件通道將事件持久保存到磁盤。該實現使用高效的日志并具有強大的持久性。
JDBC通道將事件存儲在數據庫中。這提供了最強的可用性和可恢復性,但是以性能為代價。
在前面的示例中,我們使用了內存通道,并將其存儲事件數限制為100,000。一旦內存通道達到最大事件數,將開始拒絕來自源的其他請求以添加更多事件。根據源的類型,這意味著源將重試或刪除事件(exec源將丟棄事件):
Sinks
Flume接收器從一個或多個Flume通道中接收事件,并將這些事件轉發到另一個Flume源(在多hop流程中),或以特定于接收器的方式處理事件。Flume內置了許多接收器,包括HDFS,HBase,Solr和Elasticsearch。
在前面的示例中,我們將流配置為使用HDFS接收器:
我們將接收器配置為根據時間戳寫入文件(請注意%y和其他時間戳別名)。我們可以這樣做,因為使用exec源中的時間戳攔截器標記事件。實際上,可以使用任何header值來確定事件輸出位置(例如,可以添加主機攔截器,然后根據生成事件的主機來寫入文件)。
可以通過各種方式配置HDFS接收器,以確定文件的滾動方式。當接收器讀取第一個事件時,它將打開一個新文件(如果尚未打開)并寫入該文件。默認情況下,接收器將繼續保持文件打開并將事件寫入其中,大約需要30秒,之后文件將被關閉,可以使用表5.5中的屬性更改滾動行為。
表5.5 Flume HDFS接收器的rollover屬性
默認HDFS接收器設置不應在生產中使用,因為它們會導致大量可能很小的文件。建議升級value或使用下游壓縮作業來合并這些小文件。
HDFS接收器允許指定在寫入文件時如何序列化事件。默認情況下,它們以文本格式序列化,沒有攔截器添加任何header。 例如,如果要在Avro中寫入數據(也包括事件頭),則可以使用序列化程序配置來執行此操作。這樣做時,還可以指定Avro內部用于壓縮數據的Hadoop壓縮編解碼器:
總結
Flume中的可靠性取決于使用的通道類型,數據源是否具有重新傳輸事件的能力,以及是否將事件多路復用到多個源以減輕不可恢復的節點故障。在該技術中,使用了存儲器通道和執行器源,但是在面對故障時都不提供可靠性。添加可靠性的一種方法是用假脫機目錄源替換exec源,并用磁盤通道替換內存通道。
我們可以使用單個源,通道和接收器運行單個agent的單臺計算機上使用Flume,但Flume可以支持完全分布式設置,可以在多個主機上運行agent,在源和最終目標之間有多個agent hop。圖5.5顯示了Flume如何在分布式環境中運行。
此技術的目標是將數據移動到HDFS中。但是,Flume可以支持各種數據接收器,包括HBase,文件roll,Elasticsearch和Solr。使用Flume寫入Elasticsearch或Solr可實現強大的近實時索引。
因此,Flume是一個非常強大的數據移動工具,可以輕松支持將數據移動到HDFS以及許多其他位置。它可以持續移動數據并支持各種級別的彈性,以解決系統故障,這是一個只需簡單配置就可運行的系統。
圖5.5 使用負載平衡和 fan-in將log4j日志移動到HDFS的Flume設置
Flume沒有真正優化的是使用二進制數據。它可以支持移動二進制數據,但會將整個二進制事件加載到內存中,因此移動大小為GB或更大的文件將無法正常工作。
實踐:一種將文件復制到HDFS的自動機制
你可能已經學會了如何使用像Flume這樣的日志收集工具自動將數據移動到HDFS中。但是,這些工具不支持使用半結構化或二進制數據輸出。在該實踐中,我們將了解如何自動將這些文件移動到HDFS中。
企業實際生產環境通常具有網絡孤島,Hadoop集群可以遠離其他生產應用程序進行細分。在這種情況下,Hadoop集群可能無法從其他數據源提取數據,因此無需將數據推送到Hadoop。
需要一種機制來自動化將任何格式的文件復制到HDFS的過程,類似于Linux工具rsync。該機制應該能夠壓縮用HDFS編寫的文件,并提供一種動態確定HDFS目的地的方法以進行數據分區。
現有的文件傳輸機制,如Flume,Scribe和Chukwa,都是為了支持日志文件。如果文件格式不同,例如semistructured或binary,該怎么辦?如果文件以Hadoop從屬節點無法直接訪問的方式被孤立,那么也無法使用Oozie來幫助進行文件輸入。
問題
需要自動執行將遠程服務器上的文件復制到HDFS的過程。
解決方案
開源HDFS File Slurper項目可以將任何格式的文件復制到HDFS或從中復制出來。該技術涵蓋了如何配置和使用它來將數據復制到HDFS中。
討論
可以使用HDFS File Slurper來幫助實現自動化(https://github.com/alexholmes/hdfs-file-slurper)。HDFS File Slurper是一個簡單的實用程序,支持將文件從本地目錄復制到HDFS,反之亦然。
圖5.6提供了Slurper的高級概述,以及如何使用它來復制文件的示例。Slurper讀取源目錄中存在的所有文件,并可選擇查詢腳本以確定目標目錄中的文件位置。然后,它將文件寫入目標,之后有一個可選的驗證步驟。在成功完成所有步驟后,Slurper將源文件移動到對應文件夾。
圖5.6 用于復制文件的HDFS File Slurper數據流
使用這種技術,需要確保解決以下幾個挑戰:
如何有效地將寫入分區到HDFS,以便不將所有內容整合到一個目錄?
如何確定HDFS中的數據是否已準備好進行處理(以避免讀取中間復制的文件)?
如何自動定期執行實用程序?
第一步是從https://github.com/alexholmes/hdfs-file-slurper/releases下載最新的HDFS File Slurper tarball,并將其安裝在可以訪問Hadoop集群和本地Hadoop安裝的主機上:
組件
在運行代碼之前,需要編輯/usr/local/hdfs-slurper/conf/slurper-env.sh并設置hadoop腳本的位置。以下代碼是slurper-eng.sh文件的示例,如果遵循Hadoop安裝說明:
Slurper捆綁了/usr/local/hdfs-slurper/conf/slurper.conf文件,其中包含源和目標目錄的詳細信息以及其他選項。該文件包含以下默認設置,你可以更改:
讓我們仔細看看這些設置:
DATASOURCE_NAME—指定要傳輸的數據名稱。當通過Linux init守護程序管理系統啟動時,該名稱用于日志文件名。
SRC_DIR—指定源目錄。移動到此處的任何文件都會自動復制到目標目錄(使用中間hop到目標目錄)。
WORK_DIR—這是工作目錄。在復制到目標之前,源目錄中的文件將移動到此處。
COMPLETE_DIR—指定完整目錄。復制完成后,文件將從工作目錄移動到此目錄中。或者,可以使用--remove-after-copy選項刪除源文件,在這種情況下,不應提供--complete-dir選項。
ERROR_DIR—這是錯誤目錄。復制期間遇到的任何錯誤都會導致源文件移動到此目錄中。
DEST_DIR—設置源文件的最終目標目錄。
DEST_STAGING_DIR—指定目標目錄。首先將文件復制到此目錄中,一旦復制成功,Slurper就會將副本移動到目標位置,以避免目標目錄包含部分寫入文件(如果發生故障)。
你會注意到所有目錄名稱都是HDFS URI。HDFS以這種方式區分不同的文件系統。file:/URI本地文件系統上的路徑,hdfs:/URI表示HDFS中的路徑。事實上,只要正確配置Hadoop,Slurper就支持任何Hadoop文件系統。
運行
創建一個名為/tmp/slurper/in的本地目錄,在其中寫入一個空文件,然后運行Slurper:
Slurper設計的一個關鍵特性是不能與部分寫入文件一起使用。文件必須以原子方式移動到源目錄中(Linux和HDFS文件系統中的文件移動都是原子的)。或者,可以寫入以句點(.)開頭的文件名,Slurper會忽略該文件名,文件寫入完成后,可以將文件重命名為不帶句點前綴的名稱。
請注意,復制具有相同文件名的多個文件將導致目標被覆蓋,用戶有責任確保文件是唯一的,以防止這種情況發生。
動態目標路由
如果每天將少量文件移動到HDFS中,則上一種方法很有效。但是,如果正在處理大量文件,你會想到將它們分成不同的目錄。這樣做的好處是可以對MapReduce作業的輸入數據進行更細粒度的控制,并有助于在文件系統中整體組織數據(如果不希望計算機上的所有文件都在單個目錄)。
如何對目標目錄和Slurper使用的文件名進行更多動態控制?Slurper配置文件具有SCRIPT選項(與DEST_DIR選項互斥),可以在其中指定一個腳本,該腳本提供源文件到目標文件的動態映射。
假設正在使用的文件包含文件名中的日期,并且已決定要按日期在HDFS中組織數據。那么,可以編寫腳本來執行此映射活動。以下示例是執行此操作的Python腳本:
現在可以更新/usr/local/hdfs-slurper/conf/slurper.conf,設置SCRIPT,并注釋掉DEST_DIR,這會在文件中生成以下條目:
如果再次運行Slurper,會注意到目標路徑現在由Python腳本按日期分區:
數據壓縮和驗證
如果要在HDFS中壓縮輸出文件并驗證副本是否正確,該怎么辦?需要使用COMPRESSION_CODEC選項,其值是實現CompressionCodec接口的類。如果壓縮編解碼器是LZO或LZOP,還可以添加CREATE_LZO_INDEX選項,以便創建LZOP索引。 (具體內容請閱讀第四章,鏈接見文末)
驗證功能會在復制完成后重新讀取目標文件,并確保目標文件的校驗和與源文件匹配。這導致處理時間更長,但增加了復制成功的額外保證。
以下配置片段顯示了LZOP編解碼器,LZO索引和啟用的文件驗證:
讓我們再次運行Slurper:
連續運轉
現在,你已經掌握了基本機制,最后一步是將該工具作為守護程序運行,以便不斷查找要傳輸的文件。為此,可以使用名為bin/slurper-inittab.sh的腳本,該腳本旨在與inittab respawn一起使用。
此腳本不會創建PID文件或執行nohup-在respawn的上下文中都沒有意義,因為inittab正在管理進程。使用DATASOURCE_NAME配置值來創建日志文件名,這意味著可以使用記錄到不同日志文件的不同配置文件來啟動多個Slurper實例。
總結
Slurper是一個很方便的工具,用于從本地文件系統到HDFS的數據輸入,還通過從HDFS復制到本地文件系統來支持數據輸出。在MapReduce無法訪問文件系統并且正在傳輸的文件形式不適用于Flume等工具的情況下,它非常有用。
實踐:使用Oozie安排定期數據提取
如果數據位于文件系統、Web服務器或可從Hadoop集群訪問的任何其他系統上,我們將需要一種定期將該數據提取到Hadoop的方法。目前,有一些推送日志文件和從數據庫中提取的工具可供選擇,但如果需要與其他系統進行交互,則可能需要自己處理數據輸入過程。
此技術使用Oozie 4.0.0版。
此數據入口分為兩部分:將數據從另一系統導入Hadoop以及定期進行數據傳輸。
問題
自動執行每日任務,以將內容從HTTP服務器下載到HDFS。
解決方案
Oozie可用于將數據移動到HDFS,還可用于執行發布,例如啟動MapReduce作業以處理獲取的數據。Oozie現在是Apache項目,管理數據處理活動的Hadoop工作流引擎。Oozie還有一個協調器引擎,可以根據數據和時間觸發器啟動工作流程。
討論
在此實踐中,我們將每24小時從多個URL執行下載,使用Oozie管理工作流程和日程安排。該技術的流程如圖5.7所示,我們將使用Oozie觸發功能每24小時啟動一次MapReduce作業。
圖5.7 Oozie技術的數據流
第一步是查看協調器XML配置文件。Oozie的協調引擎使用此文件來確定何時應啟動工作流程。Oozie使用模板引擎和表達式語言來執行參數化,如下代碼所示。使用以下內容創建名為coordinator.xml的文件:
代碼5.1 使用模板引擎通過Oozie執行參數化
Oozie調度可能會讓人困惑的是,開始和結束時間與作業執行的實際時間無關。相反,它們指的是每個工作流程執行創建的日期,這在定期生成數據并且希望能夠及時返回某個點并對該數據執行某些操作的情況下非常有用。在這個例子中,你希望每24小時執行一份工作。所以,你可以將開始日期設置為昨天,將結束日期設置為將來的某個日期。
接下來,我們需要定義實際工作流程,該工作流程將在每個固定時間間隔執行,并且在到達間隔時繼續執行。為此,創建一個名為workflow.xml的文件,其中包含下一個代碼中顯示的內容。
代碼5.2 使用Oozie協調器定義工作流程
Oozie希望map和reduce類使用“舊的”MapReduce API。如果要使用“新”API,則需要指定其他屬性:
最后一步是定義屬性文件,該文件指定如何獲取HDFS,MapReduce以及之前在HDFS中標識的兩個XML文件的位置。創建一個名為job.properties的文件,如以下代碼所示:
不同Hadoop版本的JobTracker屬性
如果使用Hadoop 1.X版本,則應使用jobTracker屬性中的JobTracker RPC端口(默認值為8021)。否則使用YARN ResourceManager RPC端口(默認為8032)。
在上一個代碼段中,HDFS中的位置指示本章前面編寫的coordinator.xml和workflow.xml文件的位置。現在,需要將XML文件,輸入文件和包含MapReduce代碼的JAR文件復制到HDFS中:
最后,在Oozie中運行作業:
可以使用作業ID獲取有關作業的一些信息:
此輸出導致作業的一次運行,可以看到運行時間。整體狀態為RUNNING,這意味著作業正在等待下一個間隔發生。當整個作業完成時(到結束日期之后),狀態將轉換為SUCCEEDED。
可以確認HDFS中的輸出目錄對應于具體日期:
只要作業正在運行,它將繼續執行直到日期結束,在此示例中已將其設置為2026年。如果要停止作業,請使用-suspend選項:
Oozie還可以分別使用-resume和-kill選項恢復暫停的作業以及殺死工作流程。
感謝各位的閱讀,以上就是“怎么將日志文件和二進制文件快速導入HDFS”的內容了,經過本文的學習后,相信大家對怎么將日志文件和二進制文件快速導入HDFS這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。