1.1MapReduce核心思想
分而治之,先分後和:將一個大的、複雜的工作或任務,拆分成多個小任務,最終合併。
MapReduce是由Map和Redecu組成
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計算任務的步驟(要深刻理解)
第1步:InputFormat
InputFormat 到hdfs上讀取數據
將數據傳給Split
第2步:Split
//設置讀取數據的路徑 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
第3步:RR
RR:將傳入的數據轉換成一行一行的數據,輸出行首字母偏移量和偏移量對應的數據
將數據傳給MAP
第4步:MAP
MAP:根據業務需求實現自定義代碼
將數據傳給Shuffle的partition
第5步:partition
partition:按照一定的分區規則,將key value的list進行分區。
將數據傳給Shuffle的Sort
第6步:Sort
Sort:對分區內的數據進行排序
將數據傳給Shuffle的combiner
第7步:combiner
combiner:對數據進行局部聚合。
將數據傳給Shuffle的Group
第8步:Group
Group:將相同key的key提取出來作爲唯一的key,
將相同key對應的value獲取出來作爲value的list
將數據傳給Reduce
第9步:Reduce
Reduce:根據業務需求進行最終的合併彙總。
將數據傳給outputFormat
第10步:outputFormat
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相同的原因是,一個集成程序能夠正好計算一個數據塊。