MapReduce核心思想及其步驟原理

1.1MapReduce核心思想

分而治之,先分後和:將一個大的、複雜的工作或任務,拆分成多個小任務,最終合併。

MapReduce是由MapRedecu組成

Map:將數據進行拆分
Reduce:對數據進行彙總
在這裏插入圖片描述

1.2偏移量

行首字母或字符移動到當前文件的最前面需要移動的字符個數

在這裏插入圖片描述

1.3Hadoop與Java數據類型對比

Java類型:int、long、double, float、 boolean、 string
Hadoop類型:IntWritable、LongWritable、DoubleWritable、FloatWritable、BooleanWritable、[Text]、NullWritable

1.4MapReduce輸出理解

Map的輸出是key value 的list
Reduce的輸出是key value的list

1.5MapReduce計算任務的步驟(要深刻理解)

1InputFormat
InputFormat 到hdfs上讀取數據
將數據傳給Split
2Split
//設置讀取數據的路徑 TextInputFormat.addInputPath(job,new Path(“C:\bbb.txt”)); //3、設置Map job.setMapperClass(WordCountMap.class); //設置map輸出的類型 job.setMapOutputKeyClass(Text.class); job.setMapOutputValueClass(LongWritable.class); //4、設置reduce代碼 job.setReducerClass(WordCountReduce.class); //設置reduce輸出的類型 job.setOutputKeyClass(Text.class); job.setOutputValueClass(LongWritable.class); //5、設置讀輸出數據的class job.setOutputFormatClass(TextOutputFormat.class); //設置輸出數據的路徑 TextOutputFormat.setOutputPath(job,new Path(“C:\ccc.txt”)); //6、等待代碼執行(返回狀態碼) return job.waitForCompletion(true)?0:1;
Split將數據進行邏輯切分
將數據傳給RR
3RR
RR:將傳入的數據轉換成一行一行的數據,輸出行首字母偏移量和偏移量對應的數據
將數據傳給MAP
4MAP
MAP:根據業務需求實現自定義代碼
將數據傳給Shuffle的partition
5partition
partition:按照一定的分區規則,將key value的list進行分區。
將數據傳給Shuffle的Sort
6Sort
Sort:對分區內的數據進行排序
將數據傳給Shuffle的combiner
7combiner
combiner:對數據進行局部聚合。
將數據傳給Shuffle的Group
8Group
Group:將相同key的key提取出來作爲唯一的key,
將相同key對應的value獲取出來作爲value的list
將數據傳給Reduce
9Reduce
Reduce:根據業務需求進行最終的合併彙總。
將數據傳給outputFormat
10outputFormat
outputFormat:將數據寫入HDFS

步驟總體流程圖
在這裏插入圖片描述
Map將拆分的數據傳給Shuffle(混洗),而Shuffle的底層原理又分爲四步,分組完成後的數據在傳入到Reduce

在這裏插入圖片描述

Shuffle階段的Partition分區算法原理(很重要)

算法:對key進行哈希,獲取到一個哈希值,用哈希值與reducetask的數量取餘。餘幾,這個數據就放在餘數編號的partition中。
Map的數量不能人爲設置,reduce的數量可以人爲設置。reduce數量越多,計算速度越快。

job.setNumReduceTasks(3);

打包代碼到集羣運行需添加驅動的類

job.setJarByClass(WordCountDriver.class);

combinner的添加 對數據進行局部聚合。

job.setCombinerClass(WordCountReduce.class);

combiner 的意義就是對每一個 maptask 的輸出進行局部彙總,以減小網絡傳輸量
未使用combiner的網絡開銷

1.6 Split的邏輯切分(重點)

獲取到讀取到的數據,對數據進行邏輯切分,切分的大小是128M.
這裏的128 與HDFS數據塊的128沒有任何關係
HDFS 128 是存儲層面的數據切分
split128 是計算層面的128,只不過數據恰好相等
兩個128相同的原因是,一個集成程序能夠正好計算一個數據塊。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章