1. 程式人生 > >MapReduce Shuffle過程深入理解

MapReduce Shuffle過程深入理解

MapReduce執行過程

1、設定input,告訴程式輸入的資料在那兒。

通過InputFormat介面子類(FileInputFormat, TextInputFormat),
(1)讀取資料
(2)將資料轉換成key-value形式交給Mapper的map()方法進行處理
預設key=行偏移量(LongWritable),value=行資料(Text)

//設定input
Path inpath = new Path(arg0[0]);
FileInputFormat.addInputPath(job, inpath);

2、執行Mapper的map()方法

多個Mapper並行執行Mapper的map(KEYIN,VALUEIN,KEYOUT,VALUEOUT)方法。

3、shuffle

1、資料溢寫,分割槽,排序
多個map並行工作相互不影響,每個map工作結束後會將輸出的key-value對先儲存在記憶體(memory)快取區中,當記憶體緩衝區中資料的數量達到一定量後會將記憶體緩衝區中的資料溢寫(spill)到本地磁碟中,此時可能會將記憶體緩衝中的資料寫到多個磁碟檔案中,再將資料寫到磁碟檔案的過程中,會對資料進行以下操作:
(1)分割槽:因為shuffle過程結束後,在reduce過程中,多個reduce會拉取map輸出的資料並執行reduce操作,此時一個reduce會對應一個分割槽,即,不同的reduce處理不同分割槽的資料。所以此處的分割槽可以理解為:通過分割槽後,輸出有多個檔案,但是不同檔案中儲存的資料都是夠被同一個reduce處理的資料,或者同一檔案中的資料按照不同分割槽進行分開存放。
(2)將各個分割槽(檔案)中的資料按照key進行排序。

2、檔案合併
當map輸出的資料全部寫到磁碟後,會合並小檔案(merge),將上一過程中輸出的多個小檔案進行合併,在合併的過程中也會進行分割槽和排序,同之前一樣,分割槽即是把能被同一個reduce操作的資料放在一起,排序即是在各個分割槽中將資料按照key進行排序。此時通過合併,分割槽,排序後生成的大檔案存放在map程式本機的本地磁碟,並等待reduce來拷貝資料。

3、Combiner和壓縮
當執行到此處,可以進行以下兩個可設定的操作:
(1)Combiner(map端的reduce),檔案合併的時候,可以執行reduce端操作(將相同key的value合併在一起),這種操作不是每個reduce程式都可以進行,只有不影響最終結果的情況下,才能夠進行Combiner操作。
(2)壓縮:在此處可以將合併後的大檔案進行壓縮,壓縮後可以減少磁碟的佔用量,當reduce copy時也可以減少網路IO。

4、reduce資料copy
接下來reduce task會到map task執行的主機上拷貝自己要處理的資料。具體的過程如下
(1)先將資料放記憶體緩衝區,緩衝區寫滿後溢寫到磁碟。
(2)溢寫磁碟的過程中,會將拷貝的資料進行合併,排序處理。
(3)group:在資料copy結束併合並結束後,將拷貝的資料進行按照key進行分組,即,將相同key的value放在一起,這裡通過比較器進行比較key是否相同。
(4)將分組後的資料傳遞給reduce()方法進行處理
這裡寫圖片描述

4、執行Reducer的reduce()方法

執行reduce(KEYIN, VALUEIN, KEYOUT,VALUEOUT)方法

5、設定output,執行後的結果存放在那兒

通過介面OutputFormat的子類(FileOutputFormat,TextOutputFormat等)
預設每個key-value輸出一行,key和value中間的分隔符為製表符,key,value輸出是呼叫key和value的toString()方法。
//設定output
Path outpath = new Path(arg0[1]);
FileOutputFormat.setOutputPath(job, outpath);

Shuffle過程中的設定

    public  int run(String[] arg0) throws Exception{
//        Configuration configuration = new Configuration();
        //讀取配置檔案資訊
        Configuration conf = getConf();
//        conf.set("mapreduce.map.output.compress", "true");//設定開啟壓縮,預設為false
//        conf.set("mapreduce.map.output.compress.codec", "org.apache.hadoop.io.compress.Lz4Codec");//設定壓縮演算法,CompressionCodec為壓縮演算法的父類
//        CompressionCodec

        //建立Job
        Job job = Job.getInstance(conf, this.getClass().getSimpleName());
        //設定執行的jar
        job.setJarByClass(this.getClass());

        //設定input
        Path inpath = new Path(arg0[0]);
        FileInputFormat.addInputPath(job, inpath);

        //設定map
        //TODO    需要修改ModelMapper
        job.setMapperClass(ModelMapper.class);
        //TODO    需要修改map的輸出型別
        job.setMapOutputKeyClass(Text.class);
        job.setMapOutputValueClass(IntWritable.class);
//*******************shuffle************************

//        job.setPartitionerClass(cls);     //設定分割槽
//        job.setSortComparatorClass(cls);    //設定排序
//        job.setCombinerClass(cls);          //設定combiner
//        job.setGroupingComparatorClass(cls);    //設定group

//*******************shuffle************************
        //設定reduce
        //TODO    需要修改ModelReduce
        job.setReducerClass(ModelReduce.class);
        //TODO    需要修改reduce的輸出型別
        job.setOutputKeyClass(Text.class);
        job.setOutputValueClass(IntWritable.class);

        //設定output
        Path outpath = new Path(arg0[1]);
        FileOutputFormat.setOutputPath(job, outpath);

        //提交job,設定為true會在執行的時候列印日誌資訊
        boolean isSuccess = job.waitForCompletion(true);
        return isSuccess ? 0 : 1;
    }

相關推薦

MapReduce Shuffle過程深入理解

MapReduce執行過程 1、設定input,告訴程式輸入的資料在那兒。 通過InputFormat介面子類(FileInputFormat, TextInputFormat), (1)讀取資料 (2)將資料轉換成key-value形式交給Mapp

MapReduce-shuffle過程詳解

等待 通知 10個 線程數 硬盤 res .sh 現在 溢出 Shuffle map端 map函數開始產生輸出時,並不是簡單地將它寫到磁盤。這個過程很復雜,它利用緩沖的方式寫到內存並出於效率的考慮進行預排序。每個map任務都有一個環形內存緩沖區用於存儲任務輸出。在默認

(無)webservice執行過程深入理解

前面我們搞了1,2個DEMO,基本對webservice服務釋出,呼叫 ,執行 有一定的瞭解。 今天的話,我們再系統的梳理下webservice執行過程。   首先我們在webservice伺服器端開發webservice介面,然後釋出webservice;   然後我們通過一個

Hadoop 學習研究(四):MapReduce shuffle過程剖詳解及引數配置調優

MapReduce簡介    在Hadoop  MapReduce中,框架會確保reduce收到的輸入資料是根據key排序過的。資料從Mapper輸出到Reducer接收,是一個很複雜的過程,框架

MapReduce shuffle過程詳解

一、MapReduce計算模型 我們知道MapReduce計算模型主要由三個階段構成:Map、shuffle、Reduce。 Map是對映,負責資料的過濾分法,將原始資料轉化為鍵值對;Reduce是合併,將具有相同key值的value進行處理後再輸出新的鍵值

九、用圖講解MapReduce Shuffle 過程

  Map Shuffle 主要做了哪些事?哪些可以設定及如何設定? 環形記憶體緩衝區預設為100MB,當超過80%,則進行spill到磁碟。記憶體中會進行分割槽、排序、combine(可選)。磁碟中將多個溢寫的檔案進行合併,壓縮(可選)。 設定: 1) partitio

MapReduce shuffle過程及壓縮機制

shuffle過程 map階段處理的資料如何傳遞給reduce階段,是MapReduce框架中最關鍵的一個流程,這個流程就叫shuffle。 shuffle: ——核心機制:資料分割槽,排序,規約,分組,合併等過程。 shuffle是Mapreduce的核心,

深入理解 JBoss 7/WildFly Domain 模式啟動過程

ket builder 代碼調試 ref finished rop mas stopped rgs 概述JBoss 7/WildFly 以 domain 模式啟動時會啟動多個 JVM。比如例如以下通過啟動腳本啟動 domain 模式:./domain.sh啟動後我們查看進

你能200秒看完項目管理網絡圖47個過程,並深入理解嗎?

ccf ping for 網絡圖 spa sun center one 包含 PM原則上來說,做的不過是硬、軟兩點 硬: 項目完成的原則框架時刻把握 軟: 協調參與各方面的利益(臺面上的、臺下的) 硬原則無重大變化情況下,讓參與者都滿意 僅這2點,就包含了47個過程 項目管

MapReduceshuffle過程

mapr 提前 bin run prope 內存 pat appdata 設置 shuffle是MapReduce的核心,map和reduce的中間過程。 Map負責過濾分發,reduce歸並整理,從map輸出到reduce輸入就是shuffle過程。 實現的功能 分區 決

深入理解SpringCloud之Eureka註冊過程分析

.net then media inject seq tar view inf cas   eureka是一種去中心化的服務治理應用,其顯著特點是既可以作為服務端又可以作為服務向自己配置的地址進行註冊。那麽這篇文章就來探討一下eureka的註冊流程。 一、Eureka的服

深入理解Java對象的創建過程:類的初始化與實例化

fcm 創建過程 this 創作 alt sso sdn 限定 知識 轉載自:https://blog.csdn.net/justloveyou_/article/details/72466416 摘要:   在Java中,一個對象在可以被使用之前必須要被正確地初始化,這一

MapReduce和spark的shuffle過程詳解

存在 位置 方式 傳遞 第一個 2個 過濾 之前 第三方 面試常見問題,必備答案。 參考:https://blog.csdn.net/u010697988/article/details/70173104 mapReducehe和Spark之間的最大區別是前者較偏向於離

Hadoop Mapreduceshuffle過程詳解

1、map task讀取資料時預設呼叫TextInputFormat的成員RecoreReader,RecoreReader呼叫自己的read()方法,進行逐行讀取,返回一個key、value; 2、返回的key、value交給自定義的map方法,輸出的context.write(key,value),再交

MapReduce內部shuffle過程詳解(Combiner的使用)

Maptask呼叫一個元件FileInputFormat FileInputFormat有一個最高層的介面 --> InputFormat 我們不需要去寫自己的實現類,使用的就是內部預設的元件:TextInputFormat maptask先呼叫TextInputFormat,

深入理解C語言的函式呼叫過程

    本文主要從程序棧空間的層面複習一下C語言中函式呼叫的具體過程,以加深對一些基礎知識的理解。     先看一個最簡單的程式:   點選(此處)摺疊或開啟  /*test.c*/ #include <stdio.h> int foo1(

深入理解hadoop值MapReduce

一、與HDFS一樣,Hadoop MapReduce也是採用了Master/Slave(M/S)架構。主要元件有Client、JobTracker、TaskTracker和Task。鞋面分別對幾個元件介紹    (1).Client:使用者編寫的MapReduce程式通過Client提交到JobTracker

MapReduce詳解及原始碼解析(一)】——分片輸入、Mapper及Map端Shuffle過程

title: 【MapReduce詳解及原始碼解析(一)】——分片輸入、Mapper及Map端Shuffle過程 date: 2018-12-03 21:12:42 tags: Hadoop categories: 大資料 toc: true 點選檢視我的部落格:Josonlee’

深入理解Java物件的建立過程:類的初始化與例項化

摘要:   在Java中,一個物件在可以被使用之前必須要被正確地初始化,這一點是Java規範規定的。在例項化一個物件時,JVM首先會檢查相關型別是否已經載入並初始化,如果沒有,則JVM立即進行載入並呼叫類構造器完成類的初始化。在類初始化過程中或初始化完畢後,根據具體情況才會

Mapreduce過程理解

本文章僅僅圍繞上面的圖解進行講解,本文對網上的一些講解進行一次彙總。希望可以幫到剛學習Hadoop的mapreduce的人。 對於一個mapreduce任務,可以有多個map和reduce。對於每個mapper,都會有對應的輸入,如圖中所示的input split(切片