Mapreduce中maptask過程詳解

一、Maptask并行度與決定機制

  1.一個job任務的map階段的并行度默認是由該任務的大小決定的;

  2.一個split切分分配一個maprask來并行處理;

  3.默認情況下,split切分的大小等于blocksize大小;

  4.切片不是mapper類中對單詞的切片,而是對每一個處理文件的單獨切片。

  eg.? 默認情況下,一個maptask處理的文件大小為128M,比如一個400M的數據文件,就需要4個maptask并行來處理,而500M的數據文件也是需要4個maptask。

?

二、Maptask運行機制

  1.讀數據文件:執行類Driver通過InputFormat類讀取文件中的數據;

  2.mapper階段:通過文件的大小決定了maptask的數量,然后mapper進行邏輯運行(讀數據、切分、封裝);

  3.OutputCollector階段:mapper方法通過OutputCollector接口將KV對寫入到環形緩沖區中(這個過程不需要我們處理我們);

  4.溢寫階段:環形緩沖區默認的大小為100M,當環形緩沖區中數據量到達閾值的80%的時候發生溢寫,溢寫的過程中會保證數據KV對使用默認的分區和排序(HashPartitioner分區、字典排序,而環形緩沖區大小和閾值的大小都是可以通過配置來修改的);

  5.歸并排序:將溢寫的數據進行合并排序。

?

三、MR的小文件優化案例

  當許多個小文件上傳到HDFS集群上時,每個小文件都將會占用一個blocksize的大小(128M),而且在對它們進行MR計算時,一個文件就會開啟一個maptask,這樣會浪費很多的資源,下面有兩種解決方案:

  1.在文件上傳到HDFS集群前,先將文件進行合并成一個大的文件,再上傳到HDFS集群進行存儲和計算;

  2.若文件已經上傳到HDFS集群,需要直接進行計算時,

  可以再Driver類中設置輸入流之前設置InputFormatClass屬性為CombinerTextInputFormat(它的默認為TextInputFormat),

  原理是:CombineTextInputFormat類可以將多個小文件交給一個split切片,然后交給一個maptask來處理,即再Driver類中設置輸入流FileInputFormat前加入代碼:

job.setInputFormatClass(CombinerTextInputFormat.class);
CombinerTextInputFormat.setMaxInputSplitSize(job,4194304);    //設置切片最大值為4M
CombinerTextInputFormat.setMinInputSplitSize(job,3145725);    //設置切片最大值為3M

  表示大小在3M~4M的文件會被方法一個切片中,那么如果有無數的小文件,一個maptask中大概會有28~42個小文件一起處理。

?

四、自定義分區Partitioner

  在MR程序中,默認分區為HashPartitioner,以下為源碼:

public class HashPartitioner<K, V> extends Partitioner<K, V> {public HashPartitioner() {}public int getPartition(K key, V value, int numReduceTasks) {return (key.hashCode() & 2147483647) % numReduceTasks;}
}

  HashPartitioner繼承了父類Partitioner,其中getPartition方法返回int值0(注釋:分區數量決定了reducetask的數量,不分區reducetask值為1,所以一直返回int值0,也就只會產生一個結果文件!!!)

  而如果我們想要進行自定義分區,就要重新定義一個分區類繼承Partitioner類:

public class FlowPartitioner extends Partitioner<Text,FlowBean> {@Overridepublic int getPartition(Text key, FlowBean value, int i) {//獲取用來分區的電話號碼前三位String phoneNum = key.toString().substring(0, 3);//設置分區邏輯int partitionNum = 4;if ("135".equals(phoneNum)){return 0;}else if ("137".equals(phoneNum)){return 1;}else if ("138".equals(phoneNum)){return 2;}else if ("139".equals(phoneNum)){return 3;}return partitionNum;}
}

  我在流量統計案例中也寫了該分區類,然后再Driver類中的InputFormat類之前加入設置的自定義分區代碼:

?

job.setPartitionClass(PhoneNumPartitioner.class);
job.setNumReduceTasks(5);		(注意:輸出文件數量要大于partitioner分區的數量)

?

  總結:MR程序運算過程中,決定maptask個數的有塊大小(blocksize)、數據文件大小、文件輸入方式(小文件優化);而決定reducetask個數的是分區(無分區時reducetask個數為1,生成一個結果文件)。

  

  

  

?

轉載于:https://www.cnblogs.com/HelloBigTable/p/10591105.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387170.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387170.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387170.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

4 開發MapReduce應用程序

系統參數配置 Configuration類由源來設置&#xff0c;每個源包含以XML形式出現的一系列屬性/值對。如&#xff1a; configuration-default.xml configuration-site.xml Configuration conf new Configuration(); conf.addResource("configuraition-default.xml"…

實用的HTML5的上傳圖片方法

<input type"file" accept"video/*;capturecamcorder"> <input type"file" accept"audio/*;capturemicrophone"><input type"file" accept"image/*;capturecamera">直接調用相機<input type…

3.11 列出完數

完數&#xff1a;一個數恰好等于不包括自身的所有不同因子之和。如6123。 輸入&#xff1a;每一行含有一個整數n。 輸出&#xff1a;對每個整數n&#xff0c;輸出所有不大于n的完數。輸出格式為&#xff1a;整數n&#xff0c;冒號&#xff0c;空格&#xff0c;完數&#xff0…

angularjs 上傳

xxx.module.ts模塊 import { NgModule} from “angular/core”; import { FileUploadModule } from “ng2-file-upload” ; import { XXXComponent } from “./xxx.component”; NgModule({ imports:[ FileUploadModule ], declarations:[ XXXComponent &#xff0c;/component…

PHPCMS的產品篩選功能

如下圖所示功能&#xff1a; 首先&#xff0c;用下面這些代碼替換掉phpcms/libs/functions/extention.func.php的內容 <?php /*** extention.func.php 用戶自定義函數庫** copyright (C) 2005-2010 PHPCMS* license http://www.phpcms.cn/licen…

框架使用SpringBoot + Spring Security Oauth2 +PostMan

框架使用SpringBoot Spring Security Oauth2 主要完成了客戶端授權 可以通過mysql數據庫讀取當前客戶端表信息進行驗證&#xff0c;token存儲在數據庫中 1.引入依賴 oauth2 依賴于spring security&#xff0c;需要引入spring&#xff0c; mysql&#xff0c;redis&#xff0c; …

3.12 12!配對

找出輸入數據中所有兩兩相乘的積為12!的個數。 輸入樣例&#xff1a; 1 10000 159667200 9696 38373635 1000000 479001600 3 1 479001600 輸出樣例&#xff1a; 3 有3對&#xff1a; 1 479001600 1 479001600 3 159667200 #include<iostream> #include<fstre…

程序員自身價值值這么多錢么?

xx 網絡公司人均獎金 28 個月…… xx 科技公司人均獎金 35 個月…… 每到年底&#xff0c;這樣的新聞在互聯網業內簡直是鋪天蓋地。那些獎金不高的程序員們一邊羨慕嫉妒&#xff0c;一邊暗暗比較一下自己的身價&#xff0c;考慮是不是該跳槽了。 不同水平的程序員&#xff0c;薪…

3.13 判讀是否是對稱素數

輸入&#xff1a;11 101 272 輸出&#xff1a; Yes Yes No #include<fstream> #include<iostream> #include<sstream> #include<string> #include<cmath> using namespace std;bool isPrime(int); bool isSymmetry(int);int main(){ifstream…

Spring MVC中使用 Swagger2 構建Restful API

0.Spring MVC配置文件中的配置[java] view plaincopy<!-- 設置使用注解的類所在的jar包&#xff0c;只加載controller類 --> <span style"white-space:pre"> </span><context:component-scan base-package"com.jay.plat.config.contro…

Go語言規范匯總

目錄 統一規范篇合理規劃目錄GOPATH設置import 規范代碼風格大小約定命名篇基本命令規范項目目錄名包名文件名常量變量變量申明變量命名慣例全局變量名局部變量名循環變量結構體(struct)接口名函數和方法名參數名返回值開發篇包魔鬼數字常量 & 枚舉結構體運算符函數參數返回…

3.14 01串排序

將01串首先按照長度排序&#xff0c;其次按1的個數的多少排序&#xff0c;最后按ASCII碼排序。 輸入樣例&#xff1a; 10011111 00001101 10110101 1 0 1100 輸出樣例&#xff1a; 0 1 1100 1010101 00001101 10011111 #include<fstream> #include<iost…

platform(win32) 錯誤

運行cnpm install后&#xff0c;出現雖然提示不適合Windows&#xff0c;但是問題好像是sass loader出問題的。所以只要執行下面命令即可&#xff1b;方案一&#xff1a;cnpm rebuild node-sass #不放心可以重新安裝下 cnpm install方案二&#xff1a;npm update npm install no…

Error: Program type already present: okhttp3.Authenticator$1

在app中的build.gradle中加入如下代碼&#xff0c; configurations {all*.exclude group: com.google.code.gsonall*.exclude group: com.squareup.okhttp3all*.exclude group: com.squareup.okioall*.exclude group: com.android.support,module:support-v13 } 如圖 轉載于:ht…

3.15 排列對稱串

篩選出對稱字符串&#xff0c;然后將其排序。 輸入樣例&#xff1a; 123321 123454321 123 321 sdfsdfd 121212 \\dd\\ 輸出樣例 123321 \\dd\\ 123454321 #include<fstream> #include<iostream> #include<string> #include<set> using …

ES6規范 ESLint

在團隊的項目開發過程中&#xff0c;代碼維護所占的時間比重往往大于新功能的開發。因此編寫符合團隊編碼規范的代碼是至關重要的&#xff0c;這樣做不僅可以很大程度地避免基本語法錯誤&#xff0c;也保證了代碼的可讀性&#xff0c;畢竟&#xff1a;程序是寫給人讀的&#xf…

前端 HTML 常用標簽 head標簽相關內容 script標簽

script標簽 定義JavaScript代碼 <!--定義JavaScript代碼--> <script type"text/javascript"></script> 引入JavaScript文件 src""引入的 js文件路徑 <!-- 引入JavaScript文件 --> <script src"./index.js"></s…

3.16 按績點排名

成績60分及以上的課程才予以計算績點 績點計算公式&#xff1a;[(課程成績-50) / 10 ] * 學分 學生總績點為所有績點之和除以10 輸入格式&#xff1a; 班級數 課程數 各個課程的學分 班級人數 姓名 各科成績 輸出格式&#xff1a; class 班級號: 姓名&#xff08;占1…

iview日期控件,雙向綁定日期格式

日期在雙向綁定之后格式為&#xff1a;2017-07-03T16:00:00.000Z 想要的格式為2017-07-04調了好久&#xff0c;幾乎一天&#xff1a;用一句話搞定了 on-change”addForm.Birthday$event”<Date-picker placeholder"選擇日期" type"datetime" v-model&…

移除html,jsp中的元素

移除html&#xff0c;jsp中的元素 某些時候&#xff0c;需要移除某個元素&#xff0c;比如移除表中的某一行 $("#tbody").children().eq(i).remove();或者 $("#tr").remove();PS&#xff1a;獲取表中的tr的數量&#xff1a; $("#tbody").childre…