Hadoop實戰讀書筆記(8)

什麼是開發數據集?node

一個流行的開發策略是爲生產環境中的大數據集創建一個較小的、抽樣的數據子集,稱爲開發數據集。這個開發數據集可能只有幾百兆字節。當你以單機或者僞分佈式模式編寫程序來處理它們時,你會發現開發週期很短,在本身的機器上運行程序也很方便,並且還能夠在獨立的環境中進行調試。數據庫

 

爲何選擇專利引用數據作測試?網絡

1、由於它們與你未來會遇到的大多數數據類型類似app

2、專利引用數據所構成的關係圖與網頁連接以及社會網絡圖可謂大同小異框架

3、專利發佈以時間爲序,有些特性相似於時間序列分佈式

4、每一個專利關聯到一我的 (發明人) 和一個位置 (發明人的國家),你能夠將之視爲我的信息或地理數據oop

5、你能夠將這些數據視爲具備明確模式的普通數據庫關係,而格式上簡單地以逗號分開測試

 

數據集採用標準大數據

數據集採用標準的逗號分隔取值 (comma-separated values, CSV) 格式。spa

 

構建MapReduce程序的基礎模板

大多數MapReduce程序的編寫均可以簡單地依賴於一個模板及其變種,當撰寫一個新得MapReduce程序時,咱們一般會採用一個現有的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、咱們習慣用單個類來完整地定義每一個MapReduce做業,這裏成爲MyJob

2Hadoop要求MapperReducer必須是它們自身的靜態類,這些類很是小,模板將它們包含在MyJob類中做爲內部類,這樣作的好處是能夠把全部的東西放在一個文件內,簡化代碼管理

3、可是須要記住這些內部類是獨立的,一般不與MyJob類進行交互

4、在做業執行期間,採用不一樣JVM的各種節點複製並運行MapperReducer,而其餘的做業類僅在客戶機上執行

 

解釋下run()方法

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

2、它實例化、配置並傳遞一個JobConf對象命名的做業給JobClient.runJob()以啓動MapReduce做業(反過來,JobClient類與JobTracker通訊讓該做業在集羣上啓動)

3JobConf對象將保持做業運行所需的所有配置參數

4Driver須要在做業中爲每一個做業定製基本參數,包括輸入路徑、輸出路徑、Mapper類和Reducer

5、每一個做業能夠重置默認的做業屬性,例如,InputFormatOutputFormat等,也能夠調用JobConf對象中的set()方法填充任意的配置參數

6、一旦傳遞JobConf對象到JobClient.runJob(),他就被視爲決定這個做業如何運行的藍本

 

關於driver的配置的一些說明

1JobConf對象有許多參數,但咱們並不但願所有的參數都經過編寫driver來設置,能夠把Hadoop安裝時的配置文件做爲一個很好的起點

2、用戶可能但願在命令行啓動一個做業時傳遞額外的參數來改變做業配置

3Driver能夠經過自定義一組命令並自行處理用戶參數,來支持用戶修改其中的一些配置

4、由於常常須要作這樣的任務,Hadoop框架便提供了ToolRunnerToolConfigured來簡化其實現。

5、當它們在上面的MyJob框架中被同時使用時,這些類使得做業能夠理解用戶提供的被GenericOptionParser支持的選項

 

好比下面的命令:

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

若是咱們運行做業僅僅是想看到mapper的輸出 (處於調試的目的), 能夠用選項 -D mapred.reduce.tasks=0reducer的數目設置爲0

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

 

經過使用ToolRunnerMyJob能夠自動支持一下選項
GenericOptionsParser
支持的選項

選項

描述

-conf <configuration file>

指定一個配置文件

-D <property=value>

JobConf屬性賦值

-fs <local | namenode:port>

指定一個NameNode,能夠是 "local"

-jt <local | jobtracker:port>

指定一個JobTracker

-files <list of files>

指定一個以逗號分隔的文件列表,用於MapReduce做業。這些文件自動地分佈到全部節點,使之可從本地獲取

-libjars <list of jars>

指定一個以逗號分隔的jar文件,使之包含在全部任務JVMclasspath

-archives <list of archives>

指定一個以逗號分隔的存檔文件列表,使之能夠在全部任務節點上打開

 

模板代碼MappperReducer

模板中習慣將Mapper類稱爲MapClass,而將Reducer類稱爲Reduce

MapperReducer都是MapReduceBase的擴展

MapReduceBase是個小類,包含configure()close(),咱們使用上兩個方法來創建和清除map(reduce)任務,除非是更高級的做業,一般咱們並不須要覆蓋它們

 

Mapper類和Reducer類模板說明

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()方法。每個map()方法的調用分別被賦予一個類型爲K1V1的鍵/值對。這個鍵/值對由mapper生成,並經過OutputCollector對象的collect()方法來輸出。你須要在map()方法中的合適位置調用:

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

 

Reducerreduce()方法的每次調用均被賦予K2類型的鍵,以及V2類型的一組值。注意它必須與Mapper中使用的K2V2類型相同。Reduce()方法可能會循環遍歷V2類型的全部值。

while (values.hasNext()) {

       V2 v = values.next();

}

Reduce()方法還使用OutputCollector來蒐集其鍵/值的輸出,它們的類型爲K3/V3。在reudce()方法中能夠調用

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

除了在MapperReducer之間保持K2V3的類型一致,還須要確保在MapperReducer中使用的鍵值類型與在driver中設置的輸入格式、輸出鍵的類,以及輸出值的類保持一致

使用KeyValueTextInputFormat意味着K1V1必須均爲Text類型

Driver則必須調用setOutputKeyClass()setOutputValueClass()分別指定K2V2的類

最終:

1、全部的鍵與值的類型必須是Writable的子類型,來確保Hadoop的序列化接口能夠把數據在分佈式集羣上發送

2、鍵的類型實現了WritableComparable,它是Writable的子接口,鍵的類型還需額外支持compareTo()方法,由於在MapReduce框架中鍵會被用來進行排序

相關文章
相關標籤/搜索