国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Hadoop學(xué)習(xí):深入解析MapReduce的大數(shù)據(jù)魔力(三)

這篇具有很好參考價(jià)值的文章主要介紹了Hadoop學(xué)習(xí):深入解析MapReduce的大數(shù)據(jù)魔力(三)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

3.5 MapReduce 內(nèi)核源碼解析

3.5.1 MapTask 工作機(jī)制

Hadoop學(xué)習(xí):深入解析MapReduce的大數(shù)據(jù)魔力(三),Hadoop學(xué)習(xí)指南,大數(shù)據(jù),hadoop,學(xué)習(xí)
(1)Read階段:MapTask通過(guò)InputFormat獲得的RecordReader,從輸入InputSplit中解析出一個(gè)個(gè)key/value。

(2)Map階段:該節(jié)點(diǎn)主要是將解析出的key/value交給用戶編寫map()函數(shù)處理,并產(chǎn)生一系列新的key/value。

(3)Collect 收集階段:在用戶編寫 map()函數(shù)中,當(dāng)數(shù)據(jù)處理完成后,一般會(huì)調(diào)用OutputCollector.collect()輸出結(jié)果。在該函數(shù)內(nèi)部,它會(huì)將生成的 key/value 分區(qū)(調(diào)用Partitioner),并寫入一個(gè)環(huán)形內(nèi)存緩沖區(qū)中。

(4)Spill 階段:即“溢寫”,當(dāng)環(huán)形緩沖區(qū)滿后,MapReduce會(huì)將數(shù)據(jù)寫到本地磁盤上,生成一個(gè)臨時(shí)文件。需要注意的是,將數(shù)據(jù)寫入本地磁盤之前,先要對(duì)數(shù)據(jù)進(jìn)行一次本地排序,并在必要時(shí)對(duì)數(shù)據(jù)進(jìn)行合并、壓縮等操作。

溢寫階段詳情:
步驟1:利用快速排序算法對(duì)緩存區(qū)內(nèi)的數(shù)據(jù)進(jìn)行排序,排序方式是,先按照分區(qū)編號(hào)Partition 進(jìn)行排序,然后按照key進(jìn)行排序。這樣,經(jīng)過(guò)排序后,數(shù)據(jù)以分區(qū)為單位聚集在一起,且同一分區(qū)內(nèi)所有數(shù)據(jù)按照key有序。

步驟2:按照分區(qū)編號(hào)由小到大依次將每個(gè)分區(qū)中的數(shù)據(jù)寫入任務(wù)工作目錄下的臨時(shí)文件output/spillN.out(N 表示當(dāng)前溢寫次數(shù))中。如果用戶設(shè)置了 Combiner,則寫入文件之前,對(duì)每個(gè)分區(qū)中的數(shù)據(jù)進(jìn)行一次聚集操作。

步驟3:將分區(qū)數(shù)據(jù)的元信息寫到內(nèi)存索引數(shù)據(jù)結(jié)構(gòu)SpillRecord中,其中每個(gè)分區(qū)的元信息包括在臨時(shí)文件中的偏移量、壓縮前數(shù)據(jù)大小和壓縮后數(shù)據(jù)大小。如果當(dāng)前內(nèi)存索引大小超過(guò)1MB,則將內(nèi)存索引寫到文件output/spillN.out.index中。

(5)Merge 階段:當(dāng)所有數(shù)據(jù)處理完成后,MapTask 對(duì)所有臨時(shí)文件進(jìn)行一次合并,以確保最終只會(huì)生成一個(gè)數(shù)據(jù)文件。 當(dāng)所有數(shù)據(jù)處理完后,MapTask 會(huì)將所有臨時(shí)文件合并成一個(gè)大文件,并保存到文件output/file.out 中,同時(shí)生成相應(yīng)的索引文件output/file.out.index。 在進(jìn)行文件合并過(guò)程中,MapTask以分區(qū)為單位進(jìn)行合并。對(duì)于某個(gè)分區(qū),它將采用多輪遞歸合并的方式。每輪合并mapreduce.task.io.sort.factor(默認(rèn) 10)個(gè)文件,并將產(chǎn)生的文件重新加入待合并列表中,對(duì)文件排序后,重復(fù)以上過(guò)程,直到最終得到一個(gè)大文件。
讓每個(gè) MapTask 最終只生成一個(gè)數(shù)據(jù)文件,可避免同時(shí)打開大量文件和同時(shí)讀取大量小文件產(chǎn)生的隨機(jī)讀取帶來(lái)的開銷。

3.5.2 ReduceTask 工作機(jī)制

Hadoop學(xué)習(xí):深入解析MapReduce的大數(shù)據(jù)魔力(三),Hadoop學(xué)習(xí)指南,大數(shù)據(jù),hadoop,學(xué)習(xí)
(1)Copy 階段:ReduceTask 從各個(gè) MapTask 上遠(yuǎn)程拷貝一片數(shù)據(jù),并針對(duì)某一片數(shù)據(jù),如果其大小超過(guò)一定閾值,則寫到磁盤上,否則直接放到內(nèi)存中。

(2)Sort 階段:在遠(yuǎn)程拷貝數(shù)據(jù)的同時(shí),ReduceTask啟動(dòng)了兩個(gè)后臺(tái)線程對(duì)內(nèi)存和磁盤上的文件進(jìn)行合并,以防止內(nèi)存使用過(guò)多或磁盤上文件過(guò)多。按照MapReduce語(yǔ)義,用戶編寫reduce()函數(shù)輸入數(shù)據(jù)是按key進(jìn)行聚集的一組數(shù)據(jù)。為了將key相同的數(shù)據(jù)聚在一
起,Hadoop采用了基于排序的策略。由于各個(gè)MapTask已經(jīng)實(shí)現(xiàn)對(duì)自己的處理結(jié)果進(jìn)行了局部排序,因此,ReduceTask只需對(duì)所有數(shù)據(jù)進(jìn)行一次歸并排序即可。

(3)Reduce 階段:reduce()函數(shù)將計(jì)算結(jié)果寫到HDFS上。

3.5.3 ReduceTask 并行度決定機(jī)制

回顧:MapTask并行度由切片個(gè)數(shù)決定,切片個(gè)數(shù)由輸入文件和切片規(guī)則決定。

思考:ReduceTask并行度由誰(shuí)決定?

1)設(shè)置ReduceTask并行度(個(gè)數(shù))
ReduceTask 的并行度同樣影響整個(gè) Job 的執(zhí)行并發(fā)度和執(zhí)行效率,但與MapTask的并發(fā)數(shù)由切片數(shù)決定不同,ReduceTask數(shù)量的決定是可以直接手動(dòng)設(shè)置:

// 默認(rèn)值是1,手動(dòng)設(shè)置為4
job.setNumReduceTasks(4);

2)實(shí)驗(yàn):測(cè)試ReduceTask多少合適
(1)實(shí)驗(yàn)環(huán)境:1個(gè)Master節(jié)點(diǎn),16個(gè)Slave節(jié)點(diǎn):CPU:8GHZ,內(nèi)存: 2G
(2)實(shí)驗(yàn)結(jié)論:
Hadoop學(xué)習(xí):深入解析MapReduce的大數(shù)據(jù)魔力(三),Hadoop學(xué)習(xí)指南,大數(shù)據(jù),hadoop,學(xué)習(xí)
3)注意事項(xiàng)
(1)ReduceTask=0,表示沒有Reduce階段,輸出文件個(gè)數(shù)和Map個(gè)數(shù)一致。
(2)ReduceTask默認(rèn)值就是1,所以輸出文件個(gè)數(shù)為一個(gè)。
(3)如果數(shù)據(jù)分布不均勻,就有可能在Reduce階段產(chǎn)生數(shù)據(jù)傾斜
(4)ReduceTask數(shù)量并不是任意設(shè)置,還要考慮業(yè)務(wù)邏輯需求,有些情況下,需要計(jì)算全局匯總結(jié)果,就只能有1個(gè)ReduceTask。
(5)具體多少個(gè)ReduceTask,需要根據(jù)集群性能而定。
(6)如果分區(qū)數(shù)不是1,但是ReduceTask為1,是否執(zhí)行分區(qū)過(guò)程。答案是:不執(zhí)行分區(qū)過(guò)程。因?yàn)樵贛apTask的源碼中,執(zhí)行分區(qū)的前提是先判斷ReduceNum個(gè)數(shù)是否大于1。不大于1肯定不執(zhí)行。

3.6 數(shù)據(jù)清洗(ETL)

“ETL,是英文 Extract-Transform-Load 的縮寫,用來(lái)描述將數(shù)據(jù)從來(lái)源端經(jīng)過(guò)抽取
(Extract)、轉(zhuǎn)換(Transform)、加載(Load)至目的端的過(guò)程。ETL一詞較常用在數(shù)據(jù)倉(cāng)庫(kù),但其對(duì)象并不限于數(shù)據(jù)倉(cāng)庫(kù)

在運(yùn)行核心業(yè)務(wù)MapReduce 程序之前,往往要先對(duì)數(shù)據(jù)進(jìn)行清洗,清理掉不符合用戶要求的數(shù)據(jù)。==清理的過(guò)程往往只需要運(yùn)行Mapper程序,不需要運(yùn)行Reduce程序。 ==

1)需求

去除日志中字段個(gè)數(shù)小于等于11的日志。
(1)輸入數(shù)據(jù)
Hadoop學(xué)習(xí):深入解析MapReduce的大數(shù)據(jù)魔力(三),Hadoop學(xué)習(xí)指南,大數(shù)據(jù),hadoop,學(xué)習(xí)
(2)期望輸出數(shù)據(jù)
每行字段長(zhǎng)度都大于11。

2)需求分析

需要在Map階段對(duì)輸入的數(shù)據(jù)根據(jù)規(guī)則進(jìn)行過(guò)濾清洗。

3)實(shí)現(xiàn)代碼

(1)編寫WebLogMapper類

package com.atguigu.mapreduce.weblog; 
import java.io.IOException; 
import org.apache.hadoop.io.LongWritable; 
import org.apache.hadoop.io.NullWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Mapper; 
 
public class WebLogMapper extends Mapper<LongWritable, Text, Text, 
NullWritable>{ 
  
 @Override 
 protected void map(LongWritable key, Text value, Context context) 
throws IOException, InterruptedException { 
   
  // 1 獲取1行數(shù)據(jù) 
  String line = value.toString(); 
   
  // 2 解析日志 
  boolean result = parseLog(line,context); 
   
  // 3 日志不合法退出 
  if (!result) { 
   return; 
  } 
   
  // 4 日志合法就直接寫出 
  context.write(value, NullWritable.get()); 
 } 
 
 // 2 封裝解析日志的方法 
 private boolean parseLog(String line, Context context) { 
 
  // 1 截取 
  String[] fields = line.split(" "); 
   
  // 2 日志長(zhǎng)度大于11的為合法 
  if (fields.length > 11) { 
   return true; 
  }else { 
   return false; 
  } 
 } 
} 

(2)編寫WebLogDriver類

package com.atguigu.mapreduce.weblog; 
import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.fs.Path; 
import org.apache.hadoop.io.NullWritable; 
import org.apache.hadoop.io.Text; 
import org.apache.hadoop.mapreduce.Job; 
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; 
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; 
public class WebLogDriver { 
public static void main(String[] args) throws Exception { 
// 輸入輸出路徑需要根據(jù)自己電腦上實(shí)際的輸入輸出路徑設(shè)置 
args = new String[] { "D:/input/inputlog", "D:/output1" }; 
// 1 獲取job信息 
Configuration conf = new Configuration(); 
Job job = Job.getInstance(conf); 
// 2 加載jar包 
job.setJarByClass(LogDriver.class); 
// 3 關(guān)聯(lián)map 
job.setMapperClass(WebLogMapper.class); 
// 4 設(shè)置最終輸出類型 
job.setOutputKeyClass(Text.class); 
job.setOutputValueClass(NullWritable.class); 
// 設(shè)置reducetask個(gè)數(shù)為0 
job.setNumReduceTasks(0); 
// 5 設(shè)置輸入和輸出路徑 
FileInputFormat.setInputPaths(job, new Path(args[0])); 
FileOutputFormat.setOutputPath(job, new Path(args[1])); 
// 6 提交 
boolean b = job.waitForCompletion(true); 
System.exit(b ? 0 : 1); 
} 
} 

3.7 MapReduce 開發(fā)總結(jié)

1)輸入數(shù)據(jù)接口:InputFormat

(1)默認(rèn)使用的實(shí)現(xiàn)類是:TextInputFormat
(2)TextInputFormat 的功能邏輯是:一次讀一行文本,然后將該行的起始偏移量作為key,行內(nèi)容作為value返回。
(3)CombineTextInputFormat 可以把多個(gè)小文件合并成一個(gè)切片處理,提高處理效率。

2)邏輯處理接口:Mapper

用戶根據(jù)業(yè)務(wù)需求實(shí)現(xiàn)其中三個(gè)方法:map() setup() cleanup ()

3)Partitioner 分區(qū)

(1)有默認(rèn)實(shí)現(xiàn) HashPartitioner,邏輯是根據(jù)key的哈希值和numReduces來(lái)返回一個(gè)分區(qū)號(hào);key.hashCode()&Integer.MAXVALUE % numReduces
(2)如果業(yè)務(wù)上有特別的需求,可以自定義分區(qū)。

4)Comparable 排序

(1)當(dāng)我們用自定義的對(duì)象作為key來(lái)輸出時(shí),就必須要實(shí)現(xiàn)WritableComparable 接口,重寫其中的compareTo()方法。

(2)部分排序:對(duì)最終輸出的每一個(gè)文件進(jìn)行內(nèi)部排序。

(3)全排序:對(duì)所有數(shù)據(jù)進(jìn)行排序,通常只有一個(gè)Reduce。

(4)二次排序:排序的條件有兩個(gè)。

5)Combiner 合并

Combiner 合并可以提高程序執(zhí)行效率,減少IO傳輸。但是使用時(shí)必須不能影響原有的
業(yè)務(wù)處理結(jié)果。

6)邏輯處理接口:Reducer

用戶根據(jù)業(yè)務(wù)需求實(shí)現(xiàn)其中三個(gè)方法:reduce() setup() cleanup ()

7)輸出數(shù)據(jù)接口:OutputFormat

(1)默認(rèn)實(shí)現(xiàn)類是TextOutputFormat,功能邏輯是:將每一個(gè)KV對(duì),向目標(biāo)文本文件
輸出一行。
(2)用戶還可以自定義OutputFormat。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-656739.html

到了這里,關(guān)于Hadoop學(xué)習(xí):深入解析MapReduce的大數(shù)據(jù)魔力(三)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Hadoop MapReduce解析

    Hadoop MapReduce是一個(gè)用于處理大量數(shù)據(jù)的編程模型和一個(gè)相應(yīng)的實(shí)現(xiàn)框架。MapReduce作業(yè)通常分為兩個(gè)階段:Map階段和Reduce階段。 Map階段 在Map階段,你編寫的Map函數(shù)會(huì)對(duì)輸入數(shù)據(jù)進(jìn)行處理。每個(gè)輸入數(shù)據(jù)片段(例如一行文本)都會(huì)被Map函數(shù)處理,并產(chǎn)生中間鍵值對(duì)。 以單詞計(jì)數(shù)

    2024年04月14日
    瀏覽(16)
  • 云計(jì)算中的大數(shù)據(jù)處理:嘗試HDFS和MapReduce的應(yīng)用

    云計(jì)算中的大數(shù)據(jù)處理:嘗試HDFS和MapReduce的應(yīng)用

    在實(shí)驗(yàn)開始之前我們需要在虛擬機(jī)里面啟動(dòng)HDFS,進(jìn)入到Hadoop安裝目錄里面的sbin目錄里面執(zhí)行 start-all.sh 命令即可啟動(dòng)成功,然后使用 jps 查看全部節(jié)點(diǎn)是否已經(jīng)啟動(dòng)了,在昨天的做題的時(shí)候我在最開始上傳文件到hdfs 的時(shí)候報(bào)錯(cuò): could only be written to 0 of the 1 minReplication nodes,

    2024年02月09日
    瀏覽(96)
  • 大數(shù)據(jù)面試高頻題目 - 深入解析 Hadoop:探索強(qiáng)大的HDFS存儲(chǔ)系統(tǒng)

    在大數(shù)據(jù)面試中,深刻理解 Hadoop 是取得成功的關(guān)鍵之一。以下是一些關(guān)于 Hadoop 的HDFS存儲(chǔ)系統(tǒng)的高頻面試題目以及解答思路和經(jīng)驗(yàn)分享: 發(fā)起下載請(qǐng)求: 客戶端創(chuàng)建分布式文件系統(tǒng),向 NameNode 請(qǐng)求下載? user/warehouse/ss.avi ?文件; 獲取文件元數(shù)據(jù):NameNode 返回目標(biāo)文件的元

    2024年03月18日
    瀏覽(16)
  • Hadoop3.0大數(shù)據(jù)處理學(xué)習(xí)3(MapReduce原理分析、日志歸集、序列化機(jī)制、Yarn資源調(diào)度器)

    Hadoop3.0大數(shù)據(jù)處理學(xué)習(xí)3(MapReduce原理分析、日志歸集、序列化機(jī)制、Yarn資源調(diào)度器)

    前言:如果想知道一堆牌中有多少?gòu)埣t桃,直接的方式是一張張的檢查,并數(shù)出有多少?gòu)埣t桃。 而MapReduce的方法是,給所有的節(jié)點(diǎn)分配這堆牌,讓每個(gè)節(jié)點(diǎn)計(jì)算自己手中有幾張是紅桃,然后將這個(gè)數(shù)匯總,得到結(jié)果。 官方介紹:MapReduce是一種分布式計(jì)算模型,由Google提出,

    2024年02月08日
    瀏覽(45)
  • hadoop學(xué)習(xí):mapreduce的wordcount時(shí)候,繼承mapper沒有對(duì)應(yīng)的mapreduce的包

    hadoop學(xué)習(xí):mapreduce的wordcount時(shí)候,繼承mapper沒有對(duì)應(yīng)的mapreduce的包

    踩坑描述:在學(xué)習(xí) hadoop 的時(shí)候使用hadoop 下的 mapreduce,卻發(fā)現(xiàn)沒有 mapreduce。 第一反應(yīng)就是去看看 maven 的路徑對(duì)不對(duì) settings——》搜索框搜索 maven ?檢查一下 Maven 路徑對(duì)不對(duì) OK 這里是對(duì)的 那么是不是依賴下載失敗導(dǎo)致 mapreduce 沒下下來(lái) 去本地倉(cāng)庫(kù)里去看看(上圖最后一行就

    2024年02月11日
    瀏覽(22)
  • 深入探索Apache ZooKeeper:關(guān)鍵技術(shù)學(xué)習(xí)與實(shí)踐指南

    Apache ZooKeeper,作為一款廣受認(rèn)可的分布式協(xié)調(diào)服務(wù),為大型分布式系統(tǒng)提供了強(qiáng)大的數(shù)據(jù)一致性、服務(wù)注冊(cè)與發(fā)現(xiàn)、分布式鎖、配置管理等基礎(chǔ)服務(wù)。本文將深入剖析ZooKeeper的技術(shù)內(nèi)核,梳理其關(guān)鍵學(xué)習(xí)點(diǎn),并結(jié)合實(shí)踐場(chǎng)景給出學(xué)習(xí)與應(yīng)用建議,幫助讀者全方位掌握這一重要

    2024年04月28日
    瀏覽(23)
  • hadoop學(xué)習(xí):mapreduce入門案例二:統(tǒng)計(jì)學(xué)生成績(jī)

    hadoop學(xué)習(xí):mapreduce入門案例二:統(tǒng)計(jì)學(xué)生成績(jī)

    這里相較于 wordcount,新的知識(shí)點(diǎn)在于學(xué)生實(shí)體類的編寫以及使用 數(shù)據(jù)信息: 1. Student 實(shí)體類 2.? mapper 階段,StudentMapper 類 3. reduce 階段,StudentReduce 類 4. 驅(qū)動(dòng)類,studentDriver 類

    2024年02月11日
    瀏覽(18)
  • 大數(shù)據(jù)開發(fā)之Hadoop(MapReduce)

    大數(shù)據(jù)開發(fā)之Hadoop(MapReduce)

    MapReduce是一個(gè)分布式運(yùn)算程序的編程框架,是用戶開發(fā)“基于Hadoop的數(shù)據(jù)分析應(yīng)用”的核心框架。 MapReduce核心功能是將用戶編寫的業(yè)務(wù)邏輯代碼和自帶默認(rèn)組件整合成一個(gè)完整的分布式運(yùn)算程序,并發(fā)運(yùn)行在一個(gè)Hadoop集群上。 1.2.1 優(yōu)點(diǎn) 1、MapReduce易于編程 它簡(jiǎn)單的實(shí)現(xiàn)一些

    2024年01月22日
    瀏覽(15)
  • 第三節(jié) Hadoop學(xué)習(xí)案例——MapReduce課程設(shè)計(jì) 好友推薦功能

    第三節(jié) Hadoop學(xué)習(xí)案例——MapReduce課程設(shè)計(jì) 好友推薦功能

    提示:文章內(nèi)容主要以案例為主 目錄 前言 項(xiàng)目說(shuō)明 一,程序需求 1.需求 2.數(shù)據(jù) 二,編碼操作 1.項(xiàng)目建包目錄 2.FriendsRecommend.java ?3.FriendsRecommendMapper.java 4.FriendsRecommendReduce.java 三,Xshell運(yùn)行的步驟 1.創(chuàng)建目錄 2.上傳程序 ?3.分布式文件系統(tǒng)上傳測(cè)試數(shù)據(jù) ?4.執(zhí)行程序 5. 查看結(jié)

    2024年02月07日
    瀏覽(28)
  • hadoop學(xué)習(xí):mapreduce入門案例四:partitioner 和 combiner

    hadoop學(xué)習(xí):mapreduce入門案例四:partitioner 和 combiner

    先簡(jiǎn)單介紹一下partitioner 和 combiner? Partitioner類 用于在Map端對(duì)key進(jìn)行分區(qū) 默認(rèn)使用的是HashPartitioner 獲取key的哈希值 使用key的哈希值對(duì)Reduce任務(wù)數(shù)求模 決定每條記錄應(yīng)該送到哪個(gè)Reducer處理 自定義Partitioner 繼承抽象類Partitioner,重寫getPartition方法 job.setPartitionerClass(MyPartitione

    2024年02月10日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包