溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何構(gòu)建MapReduce程序的基礎(chǔ)模板

發(fā)布時(shí)間:2021-12-10 09:19:45 來(lái)源:億速云 閱讀:173 作者:iii 欄目:云計(jì)算

本篇內(nèi)容主要講解“如何構(gòu)建MapReduce程序的基礎(chǔ)模板”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“如何構(gòu)建MapReduce程序的基礎(chǔ)模板”吧!

什么是開發(fā)數(shù)據(jù)集?

一個(gè)流行的開發(fā)策略是為生產(chǎn)環(huán)境中的大數(shù)據(jù)集建立一個(gè)較小的、抽樣的數(shù)據(jù)子集,稱為開發(fā)數(shù)據(jù)集。這個(gè)開發(fā)數(shù)據(jù)集可能只有幾百兆字節(jié)。當(dāng)你以單機(jī)或者偽分布式模式編寫程序來(lái)處理它們時(shí),你會(huì)發(fā)現(xiàn)開發(fā)周期很短,在自己的機(jī)器上運(yùn)行程序也很方便,而且還可以在獨(dú)立的環(huán)境中進(jìn)行調(diào)試。

為什么選擇專利引用數(shù)據(jù)做測(cè)試?

1、因?yàn)樗鼈兣c你將來(lái)會(huì)遇到的大多數(shù)數(shù)據(jù)類型相似

2、專利引用數(shù)據(jù)所構(gòu)成的關(guān)系圖與網(wǎng)頁(yè)鏈接以及社會(huì)網(wǎng)絡(luò)圖可謂大同小異

3、專利發(fā)布以時(shí)間為序,有些特性類似于時(shí)間序列

4、每個(gè)專利關(guān)聯(lián)到一個(gè)人 (發(fā)明人) 和一個(gè)位置 (發(fā)明人的國(guó)家),你可以將之視為個(gè)人信息或地理數(shù)據(jù)

5、你可以將這些數(shù)據(jù)視為具有明確模式的普通數(shù)據(jù)庫(kù)關(guān)系,而格式上簡(jiǎn)單地以逗號(hào)分開

數(shù)據(jù)集采用標(biāo)準(zhǔn)

數(shù)據(jù)集采用標(biāo)準(zhǔn)的逗號(hào)分隔取值 (comma-separated values, CSV) 格式。

構(gòu)建MapReduce程序的基礎(chǔ)模板

大多數(shù)MapReduce程序的編寫都可以簡(jiǎn)單地依賴于一個(gè)模板及其變種,當(dāng)撰寫一個(gè)新得MapReduce程序時(shí),我們通常會(huì)采用一個(gè)現(xiàn)有的MapReduce程序,并將其修改成我們所希望的樣子。

典型的Hadoop程序的模板

public class MyJob extends Configured implements Tool {

       public static class MapClass extends MapReduceBase

              implements Mapper<Text, Text, Text, Text> {

              public void map (Text key, Text value,

                                   OutputCollector<Text, Text> output,

                                   Reporter reporter) throws IOException {

                     output.collect(value, key);

              }

       }

       public static class Reduce extends MapReduceBase

              implements Reducer<Text, Text, Text, Text> {

              public void reduce(Text key, Iterator<Text> values,

                                   OutputCollector<Text, Text> output,

                                   Reporter reporter) throws IOException {

                     String csv = "";

                     while (values.hasNext()) {

                            if (csv.length() > 0) csv += ",";

                            csv += values.next().toString();

                     }

                     output.collect(key, new Text(csv));

              }

       }

       public int run(String[] args) throws Exception {

              Configuration conf = getConf();

              JobConf job = new JobConf(conf, MyJob.class);

              Path in = new Path(args[0]);

              Path out = new Path(args[1]);

              FileInputFormat.setInputPaths(job, in);

              FileOutputFormat.setOutputPath(job, out);

              job.setJobName("MyJob");

              job.setMapperClass(MapClass.class);

              job.setReducerClass(Reduce.class);

              job.setInputFormat(KeyValueTextInputFormat.class);

              job.setOutputFormat(TextOutputFormat.class);

              job.setOutputKeyClass(Text.class);

              job.setOutputValueClass(Text.class);

              job.set("key.value.separator.in.input.line", ",");

              JobClient.runJob(job);

              return 0;

       }

       public static void main(String[] args) throws Exception {

              int res = ToolRunner.run(new Configuration(), new MyJob(), args);

              System.exit(res);

       }

}

1、我們習(xí)慣用單個(gè)類來(lái)完整地定義每個(gè)MapReduce作業(yè),這里成為MyJob類

2、Hadoop要求Mapper和Reducer必須是它們自身的靜態(tài)類,這些類非常小,模板將它們包含在MyJob類中作為內(nèi)部類,這樣做的好處是可以把所有的東西放在一個(gè)文件內(nèi),簡(jiǎn)化代碼管理

3、但是需要記住這些內(nèi)部類是獨(dú)立的,通常不與MyJob類進(jìn)行交互

4、在作業(yè)執(zhí)行期間,采用不同JVM的各類節(jié)點(diǎn)復(fù)制并運(yùn)行Mapper和Reducer,而其他的作業(yè)類僅在客戶機(jī)上執(zhí)行

解釋下run()方法

1、框架的核心在run()方法中,也稱為driver

2、它實(shí)例化、配置并傳遞一個(gè)JobConf對(duì)象命名的作業(yè)給JobClient.runJob()以啟動(dòng)MapReduce作業(yè)(反過(guò)來(lái),JobClient類與JobTracker通信讓該作業(yè)在集群上啟動(dòng))

3、JobConf對(duì)象將保持作業(yè)運(yùn)行所需的全部配置參數(shù)

4、Driver需要在作業(yè)中為每個(gè)作業(yè)定制基本參數(shù),包括輸入路徑、輸出路徑、Mapper類和Reducer類

5、每個(gè)作業(yè)可以重置默認(rèn)的作業(yè)屬性,例如,InputFormat、OutputFormat等,也可以調(diào)用JobConf對(duì)象中的set()方法填充任意的配置參數(shù)

6、一旦傳遞JobConf對(duì)象到JobClient.runJob(),他就被視為決定這個(gè)作業(yè)如何運(yùn)行的藍(lán)本

關(guān)于driver的配置的一些說(shuō)明

1、JobConf對(duì)象有許多參數(shù),但我們并不希望全部的參數(shù)都通過(guò)編寫driver來(lái)設(shè)置,可以把Hadoop安裝時(shí)的配置文件作為一個(gè)很好的起點(diǎn)

2、用戶可能希望在命令行啟動(dòng)一個(gè)作業(yè)時(shí)傳遞額外的參數(shù)來(lái)改變作業(yè)配置

3、Driver可以通過(guò)自定義一組命令并自行處理用戶參數(shù),來(lái)支持用戶修改其中的一些配置

4、因?yàn)榻?jīng)常需要做這樣的任務(wù),Hadoop框架便提供了ToolRunner、Tool和Configured來(lái)簡(jiǎn)化其實(shí)現(xiàn)。

5、當(dāng)它們?cè)谏厦娴腗yJob框架中被同時(shí)使用時(shí),這些類使得作業(yè)可以理解用戶提供的被GenericOptionParser支持的選項(xiàng)

比如下面的命令:

bin/hadoop jar playgroup/MyJob.jar MyJob input/cite75-99.txt output

如果我們運(yùn)行作業(yè)僅僅是想看到mapper的輸出 (處于調(diào)試的目的), 可以用選項(xiàng) -D mapred.reduce.tasks=0將reducer的數(shù)目設(shè)置為0

bin/hadoop jar playgroup/MyJob.jar MyJob -D mapred.reduce.tasks=0 input/cite75-99.txt output

通過(guò)使用ToolRunner、MyJob可以自動(dòng)支持一下選項(xiàng)
GenericOptionsParser
支持的選項(xiàng)

選項(xiàng)

描述

-conf <configuration file>

指定一個(gè)配置文件

-D <property=value>

給JobConf屬性賦值

-fs <local | namenode:port>

指定一個(gè)NameNode,可以是 "local"

-jt <local | jobtracker:port>

指定一個(gè)JobTracker

-files <list of files>

指定一個(gè)以逗號(hào)分隔的文件列表,用于MapReduce作業(yè)。這些文件自動(dòng)地分布到所有節(jié)點(diǎn),使之可從本地獲取

-libjars <list of jars>

指定一個(gè)以逗號(hào)分隔的jar文件,使之包含在所有任務(wù)JVM的classpath中

-archives <list of archives>

指定一個(gè)以逗號(hào)分隔的存檔文件列表,使之可以在所有任務(wù)節(jié)點(diǎn)上打開

 

模板代碼Mappper與Reducer

模板中習(xí)慣將Mapper類稱為MapClass,而將Reducer類稱為Reduce

Mapper和Reducer都是MapReduceBase的擴(kuò)展

MapReduceBase是個(gè)小類,包含configure()和close(),我們使用上兩個(gè)方法來(lái)建立和清除map(reduce)任務(wù),除非是更高級(jí)的作業(yè),通常我們并不需要覆蓋它們

Mapper類和Reducer類模板說(shuō)明

public static class MapClass extends MapReduceBase

       implements Mapper<K1, V1, K2, V2> {

       public void map (K1 key, V1 value,

                                   OutputCollector<K2, V2> output,

                                   Reporter reporter) throws IOException { }

}

public static class Reduce extends MapReduceBase

       implements Reducer<K1, V2, K3, V3> {

       public void reduce(K2 key, Iterator<V2> values,

                                   OutputCollector<K3, V3> output,

                                   Reporter reporter) throws IOException { }

}

Mapper類的核心操作為map()方法,Reduce類為reduce()方法。每一個(gè)map()方法的調(diào)用分別被賦予一個(gè)類型為K1和V1的鍵/值對(duì)。這個(gè)鍵/值對(duì)由mapper生成,并通過(guò)OutputCollector對(duì)象的collect()方法來(lái)輸出。你需要在map()方法中的合適位置調(diào)用:

output.collect((K2) k, (V2) v);

在Reducer中reduce()方法的每次調(diào)用均被賦予K2類型的鍵,以及V2類型的一組值。注意它必須與Mapper中使用的K2和V2類型相同。Reduce()方法可能會(huì)循環(huán)遍歷V2類型的所有值。

while (values.hasNext()) {

       V2 v = values.next();

}

Reduce()方法還使用OutputCollector來(lái)搜集其鍵/值的輸出,它們的類型為K3/V3。在reudce()方法中可以調(diào)用

output.collect((K3) k, (V3) v);

除了在Mapper和Reducer之間保持K2與V3的類型一致,還需要確保在Mapper和Reducer中使用的鍵值類型與在driver中設(shè)置的輸入格式、輸出鍵的類,以及輸出值的類保持一致

使用KeyValueTextInputFormat意味著K1和V1必須均為Text類型

Driver則必須調(diào)用setOutputKeyClass()和setOutputValueClass()分別指定K2和V2的類

最終:

1、所有的鍵與值的類型必須是Writable的子類型,來(lái)確保Hadoop的序列化接口可以把數(shù)據(jù)在分布式集群上發(fā)送

2、鍵的類型實(shí)現(xiàn)了WritableComparable,它是Writable的子接口,鍵的類型還需額外支持compareTo()方法,因?yàn)樵贛apReduce框架中鍵會(huì)被用來(lái)進(jìn)行排序

到此,相信大家對(duì)“如何構(gòu)建MapReduce程序的基礎(chǔ)模板”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI