溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何進行MapReduce數(shù)據(jù)序列化讀寫概念的淺析

發(fā)布時間:2021-12-20 15:27:29 來源:億速云 閱讀:121 作者:柒染 欄目:互聯(lián)網(wǎng)科技

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)如何進行MapReduce數(shù)據(jù)序列化讀寫概念的淺析,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

MapReduce為處理簡單數(shù)據(jù)格式(如日志文件)提供了簡明的文檔支持,但MapReduce已經(jīng)從日志文件發(fā)展到更復(fù)雜的數(shù)據(jù)序列化格式(如文本,XML和JSON)處理,本章的目標(biāo)是記錄如何使用常見的數(shù)據(jù)序列化格式,以及檢查更結(jié)構(gòu)化的序列化格式,并比較它們與MapReduce的適用性。下面主要介紹了MapReduce處理以不同格式(如XML和JSON)存儲數(shù)據(jù)的方法,為更深入了解Avro和Parquet等這類適合大數(shù)據(jù)和Hadoop的數(shù)據(jù)格式鋪平了道路。

數(shù)據(jù)序列化 - 使用文本及其他方法

如果希望使用無處不在的XML和JSON數(shù)據(jù)序列化格式,這些格式在大多數(shù)編程語言中都可直接工作,有多種工具可用于編組、解組和驗證。但是,在MapReduce中使用XML和JSON面臨兩大挑戰(zhàn)。首先,MapReduce需要能夠支持讀寫特定數(shù)據(jù)序列化格式的類,如果想使用自定義文件格式,那么很可能沒有相應(yīng)的類支持正在使用的序列化格式;其次,MapReduce的強大之處在于能夠并行讀取輸入數(shù)據(jù),如果輸入文件很大(數(shù)百兆字節(jié)甚至更多),讀取序列化格式的類能夠?qū)⑤^大文件拆分以便多個任務(wù)可以并行讀取,這一點至關(guān)重要。

XML和JSON格式

MapReduce中的數(shù)據(jù)序列化支持是讀取和寫入MapReduce數(shù)據(jù)輸入和輸出類屬性,讓我們首先概述MapReduce如何支持?jǐn)?shù)據(jù)輸入和輸出。

3.1 了解MapReduce中的輸入和輸出

你的數(shù)據(jù)可能位于許多FTP服務(wù)器后面的XML文件、中央Web服務(wù)器上的文本日志文件或HDFS中的Lucene索引。MapReduce如何跨多種存儲機制讀取和寫入這些不同的序列化結(jié)構(gòu)?

如何進行MapReduce數(shù)據(jù)序列化讀寫概念的淺析

圖3.1 MapReduce中的輸入和輸出actor

圖3.1顯示了通過MapReduce的數(shù)據(jù)流,并確定了負(fù)責(zé)流的各部分參與者。在輸入端,我們可以看到某些工作(創(chuàng)建拆分)在map階段以外執(zhí)行,而其他工作則作為map階段的一部分執(zhí)行(讀取拆分),所有輸出工作都在reduce階段(寫輸出)執(zhí)行。

圖3.2 顯示了僅使用map作業(yè)的相同流程,在僅map作業(yè)中,MapReduce框架仍使用OutputFormat和RecordWriter類將輸出直接寫入數(shù)據(jù)接收器。讓我們來看看數(shù)據(jù)流并討論各角色的責(zé)任,我們還將查看內(nèi)置TextInputFormat和TextOutputFormat類中的相關(guān)代碼,以更好地理解這些概念,TextInputFormat和TextOutputFormat類讀取和寫入面向行的文本文件。

3.1.1數(shù)據(jù)輸入支持

MapReduce中數(shù)據(jù)輸入的兩個類是InputFormat和RecordReader,查詢InputFormat類以確定應(yīng)如何為map任務(wù)分區(qū)輸入數(shù)據(jù),并且RecordReader執(zhí)行從輸入讀取數(shù)據(jù)。

INPUTFORMAT

MapReduce中的每個作業(yè)都必須根據(jù)InputFormat抽象類中指定的規(guī)則定義其輸入。InputFormat實現(xiàn)者必須完成三步:描述map輸入鍵和值類型信息;指定輸入數(shù)據(jù)應(yīng)該如何分區(qū);指示應(yīng)該從源讀取數(shù)據(jù)的RecordReader實例。

如何進行MapReduce數(shù)據(jù)序列化讀寫概念的淺析

圖3.2沒有Reducer的MapReduce輸入和輸出actor

如何進行MapReduce數(shù)據(jù)序列化讀寫概念的淺析

圖3.3帶注釋的InputFormat類及其三個規(guī)則

可以說,最重要的規(guī)則是確定如何劃分輸入數(shù)據(jù)。在MapReduce命名法中,這些劃分稱為輸入拆分。輸入拆分直接影響map并行效率,因為每個拆分由單個map任務(wù)處理。 使用無法在單個數(shù)據(jù)源(例如文件)上創(chuàng)建多個輸入拆分的InputFormat將導(dǎo)致map階段進行緩慢,因為將會按順序處理該文件。

TextInputFormat類提供了InputFormat類的createRecordReader方法實現(xiàn),但它將輸入拆分的計算委托給其父類FileInputFormat。以下代碼顯示了TextInputFormat類的相關(guān)部分:

如何進行MapReduce數(shù)據(jù)序列化讀寫概念的淺析 

確定輸入拆分的FileInputFormat代碼稍微復(fù)雜,以下示例顯示了代碼的簡化形式,以描述getSplits方法的主要元素:

如何進行MapReduce數(shù)據(jù)序列化讀寫概念的淺析

以下代碼顯示了如何指定用于MapReduce作業(yè)的InputFormat:

job.setInputFormatClass(TextInputFormat.class);

RECORDREADER

我們將在map任務(wù)中創(chuàng)建和使用RecordReader類,以從輸入拆分中讀取數(shù)據(jù),并以 key/value形式提供每個記錄供mapper使用。通常為每個輸入拆分創(chuàng)建一個任務(wù),每個任務(wù)都有一個RecordReader,負(fù)責(zé)讀取該輸入拆分的數(shù)據(jù)。

如何進行MapReduce數(shù)據(jù)序列化讀寫概念的淺析

圖3.4 帶注釋的RecordReader類及其抽象方法

如前所示,TextInputFormat類創(chuàng)建一個LineRecordReader以從輸入拆分中讀取記錄。LineRecordReader直接擴展RecordReader類,并使用LineReader類從輸入拆分中讀取行。LineRecordReader使用文件中的字節(jié)偏移量作為map key,并使用行的內(nèi)容作為map value。 以下示例顯示了LineRecordReader的簡化版本:

如何進行MapReduce數(shù)據(jù)序列化讀寫概念的淺析

因為LineReader類很簡單,所以我們將跳過該代碼。下一步是查看MapReduce如何支持?jǐn)?shù)據(jù)輸出。

3.1.2 數(shù)據(jù)輸出

MapReduce使用與輸入類似的過程來支持輸出數(shù)據(jù)。必須存在兩個類:OutputFormat和RecordWriter。OutputFormat執(zhí)行數(shù)據(jù)接收器屬性的一些基本驗證,RecordWriter將每個reducer輸出寫入數(shù)據(jù)接收器。

OUTPUTFORMAT

與InputFormat類非常相似,OutputFormat類(如圖3.5所示)定義了實現(xiàn)必須滿足的條件:檢查與作業(yè)輸出相關(guān)的信息;提供RecordWriter并指定輸出提交者;允許寫入并在任務(wù)完成時保持“permanent”。

如何進行MapReduce數(shù)據(jù)序列化讀寫概念的淺析

圖3.5 帶注釋的OutputFormat類

就像TextInputFormat一樣,TextOutputFormat還擴展了一個基類FileOutputFormat,負(fù)責(zé)復(fù)雜的數(shù)據(jù)流操作,例如輸出提交。接下來,我們來看看TextOutputFormat執(zhí)行工作流程,以下代碼顯示了如何指定用于MapReduce作業(yè)的OutputFormat:

job.setOutputFormatClass(TextOutputFormat.class);

RECORDWRITER

我們將使用RecordWriter將reducer輸出寫入目標(biāo)數(shù)據(jù)接收器。這是一個簡單的類,如圖3.6所示。

如何進行MapReduce數(shù)據(jù)序列化讀寫概念的淺析

TextOutputFormat返回一個LineRecordWriter對象,它是TextOutputFormat的內(nèi)部類,用于執(zhí)行對文件寫入,以下示例顯示了該類的簡化版本:

如何進行MapReduce數(shù)據(jù)序列化讀寫概念的淺析

在map端,InputFormat可確定執(zhí)行了多少個map任務(wù);在reducer端,任務(wù)的數(shù)量完全基于客戶端設(shè)置的mapred.reduce.tasks值(如果沒有設(shè)置, 該值會從mapred-site.xml中獲取,如果站點文件中不存在,則從mapred-default.xml獲?。?。

上述就是小編為大家分享的如何進行MapReduce數(shù)據(jù)序列化讀寫概念的淺析了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI