3 MapReduce計算模型

MapReduce被廣泛應用于日志分析、海量數據排序、在海量數據中查找特定模式等場景中。


MapReduceJob

在Hadoop中,每個MapReduce任務都被初始化為一個Job。

每個Job又可以分為兩個階段:Map階段和Reduce階段。這兩個階段分別用Map函數和Reduce函數來表示。

Map函數接收一個<key,value>形式的輸入,然后產生另一種<key,value>的中間輸出,Hadoop負責將所有具有相同中間key值的value集合到一起傳遞給Reduce函數;Reduce函數接收一個如<key,(list of values)>形式的輸入,然后對這個value集合進行處理并輸出結果,Reduce的輸出也是<key,value>形式的。


InputFormat()和InputSplit

InputSplit是Hadoop中用來把輸入數據傳送給每個單獨的Map,InputSplit存儲的并非數據本身,而是起始位置、分片長度和一個記錄數據所在主機的數組。生成InputSplit的方法可以通過InputFormat()來設置。當數據傳送給Map時,Map會將輸入分片傳送到InputFormat()上,InputFormat調用getRecordReader()方法生成RecordReader,RecordReader在通過creatKey()、createValue()方法將InputSplit創建成可供Map處理的<key,value>對。即,InputFormat()方法是用來生成可供Map處理的<key,value>對的。

InputFormat

? ? BaileyBorweinPlouffe.BbpInputFormat

? ? ComposableInputFormat

? ? CompositeInputFormat

? ? DBInputFormat

? ? DistSum.Machine.AbstractInputFormat

? ? FileInputFormat

? ? ? ? CombineFileInputFormat

? ? ? ? KeyValueTextInputFormat

? ? ? ? NLineInputFormat

? ? ? ? SequenceFileInputFormat

? ? ? ? TeraInputFormat

? ? ? ? TextInputFormat


TextInputFormat是Hadoop默認的輸入方式。在TextInputFormat中,每個文件(或其一部分)都會單獨作為Map的輸入,而這是繼承自FileInputFormat的。之后,每行數據都會生成一條記錄,每條記錄則表示成<key,value>形式。

key值是每個數據記錄在數據分片中的字節偏移量,數據類型是LongWritable;

value值是每行的內容,數據類型是Text。

如:

file1:

0 hello world bye world

file2:

0 hello hadoop bye hadoop

兩個文件都會被單獨輸入到一個Map中,因此它們的值都是0。


OutputFormat()

默認的輸出格式是TextOutputFormat,每條記錄以一行的形式存入文本文件,鍵和值是任意形式的,程序內部調用toString()方法將鍵和值轉換為String類型再輸出。


Map函數和Reduce函數:

public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable>{protected void map(LongWritable key, Text value,Context context)throws IOException, InterruptedException {String[] words = StringUtils.split(value.toString(), ' ');for(String w :words){context.write(new Text(w), new IntWritable(1));}}
}

public class WordCountReducer extends Reducer<Text, IntWritable, Text, IntWritable>{protected void reduce(Text key, Iterable<IntWritable> values,Context context)throws IOException, InterruptedException {int sum =0;for(IntWritable i: values){sum=sum+i.get();}arg2.write(key, new IntWritable(sum));}
}
public class RunJob {public static void main(String[] args) {Configuration config =new Configuration();
//      config.set("fs.defaultFS", "hdfs://node1:8020");
//      config.set("yarn.resourcemanager.hostname", "node1");config.set("mapred.jar", "C:\\Users\\Administrator\\Desktop\\wc.jar");try {FileSystem fs =FileSystem.get(config);Job job =Job.getInstance(config);job.setJarByClass(RunJob.class);job.setJobName("wc");job.setMapperClass(WordCountMapper.class);job.setReducerClass(WordCountReducer.class);job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);FileInputFormat.addInputPath(job, new Path("/usr/input/"));Path outpath =new Path("/usr/output/wc");if(fs.exists(outpath)){fs.delete(outpath, true);}FileOutputFormat.setOutputPath(job, outpath);boolean f= job.waitForCompletion(true);if(f){System.out.println("job completion");}} catch (Exception e) {e.printStackTrace();}}
}


注意兩種情況:

1、Reduce Task的數量可以由程序指定,當存在多個Reduce Task時,每個Reduce會搜集一個或多個key值。當存在多個Reduce Task時,每個Reduce Task都會生成一個輸出文件;

2、沒有Reduce任務的時候,系統會直接將Map的輸出結果作為最終結果,有多少個Map就有多少個輸出。


MapReduce任務的優化

如何完成這個任務,怎么能讓程序運行的更快。

MapReduce計算模型的優化主要集中在兩個方面:計算性能方面;IO操作方面。


1、任務調度;

計算方面:優先將任務分配給空閑機器;

IO方面:盡量將Map任務分配給InputSplit所在的機器。


2、數據預處理與InputSplit的大小

MapReduce擅長處理少量的大數據,在處理大量的小數據時性能會很遜色。

因此在提交MapReduce任務前可以先對數據進行一次預處理,將數據合并以提高MapReduce任務的執行效率。

另一方面是參考Map任務的運行時間,當一個Map任務只需要運行幾秒就可以結束時,就需要考慮是否應該給它分配更多的數據。通常而言,一個Map任務的運行時間在一分鐘左右比較合適。

在FileInputFormat中(除了CombineFileInputFormat),Hadoop會在處理每個Block后將其作為一個InputSplit,因此合理地設置block塊大小是很重要的調節方式。


3、Map和Reduce任務的數量

Map/Reduce任務槽:集群能夠同時運行的Map/Reduce任務的最大數量。

如100臺機器,每臺最多同時運行10個Map和5個Reduce,則Map任務槽為1000,Reduce任務槽為500。

設置Map任務的數量主要參考的是Map的運行時間,設置Reduce任務的數量主要參考的是Reduce槽的數量。

Reduce任務槽的0.95倍,如果一個Reduce任務失敗,可以很快找到一個空閑的機器重新執行;

Reduce任務槽的1.75倍,執行快的機器可以獲得更多的Reduce任務,因此可以使負載更加均衡,以提高任務的處理速度。


4、Combine函數

用于本地合并數據,以減少網絡IO操作的消耗。

合理的設計combine函數會有效減少網絡傳輸的數據量,提高MapReduce的效率。

job.setCombinerClass(combine.class);

在WordCount中,可以指定Reduce類為combine函數:

job.setCombinerClass(Reduce.class);


5、壓縮

可以選擇對Map的輸出和最終的輸出結果進行不同壓縮方式的壓縮。

在一些情況下,Map的中間輸出可能會很大,對其進行壓縮可以有效地減少網絡上的數據傳輸量。


6、自定義comparator

自定義Hadoop數據類型時,推薦自定義comparator來實現數據的比較,這樣可以省去數據序列化和反序列化的時間,提高程序的運行效率。






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

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

相關文章

ionic3 調用本地相冊并上傳圖片

前言在APP中啟動相冊選擇器或者拍照上傳圖片這些功能是非常常見的。對于Ionic2&#xff0c;我們只能通過cordova插件實現調用原生的功能。下面將簡單的封裝一個選擇相冊或拍照上傳圖片的ImgService服務。具體如下。 Cordova準備下載安裝所需的Cordovar插件&#xff1a; Image P…

Mapreduce中maptask過程詳解

一、Maptask并行度與決定機制 1.一個job任務的map階段的并行度默認是由該任務的大小決定的&#xff1b; 2.一個split切分分配一個maprask來并行處理&#xff1b; 3.默認情況下&#xff0c;split切分的大小等于blocksize大小&#xff1b; 4.切片不是mapper類中對單詞的切片&…

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…