注:本文涉及書中5.1~5.7小結(jié)
MapReduce編程流程
step1. 首先寫map函數(shù)和reduce函數(shù),并使用單元測試來確保函數(shù)的運(yùn)行符合預(yù)期。
step2. 寫一個(gè)驅(qū)動(dòng)程序來運(yùn)行作業(yè)。先從本地IDE中用一個(gè)小的數(shù)據(jù)集來運(yùn)行它,從而改進(jìn)mapper和reducer,使其能夠正確處理類似輸入。
step3. 當(dāng)程序能夠預(yù)期通過小型數(shù)據(jù)集,將其部署到集群中運(yùn)行,不斷通過擴(kuò)展測試用例來改進(jìn)mapper和reducer。
step4. 當(dāng)程序正確執(zhí)行后,可以進(jìn)行優(yōu)化調(diào)整。如做標(biāo)準(zhǔn)檢查、任務(wù)剖析(task profiling)、借助鉤子(hook)。
用于配置的API
Hadoop中的組件是通過Hadoop自己的配置API來配置的。一個(gè)Configuration類的實(shí)例代表配置屬性及其取值的一個(gè)集合。Configuration從資源(.xml文件)中讀取其屬性值。
使 用 Configuration 類 的 一 般 過 程 是 : 構(gòu) 造 Configuration 對(duì) 象, 并 通 過 類 的addResource() 方法添加需要加載的資源 ;然后就可以使用 get?方法和 set?方法訪問 / 設(shè)置配置項(xiàng),資源會(huì)在第一次使用的時(shí)候自動(dòng)加載到對(duì)象中。
補(bǔ)充
Hadoop 配置文件的根元素是 configuration,一般只包含子元素 property。每一個(gè)property 元素就是一個(gè)配置項(xiàng),配置文件不支持分層或分級(jí)。每個(gè)配置項(xiàng)一般包括配置屬性的名稱 name、值 value 和一個(gè)關(guān)于配置項(xiàng)的描述 description ;元素 final 和 Java 中的關(guān)鍵字final 類似,意味著這個(gè)配置項(xiàng)是“固定不變的”,為true代表無法變更。final 一般不出現(xiàn),但在合并資源的時(shí)候,可以防止配置項(xiàng)的值被覆蓋。
合并資源指將多個(gè)配置文件合并,產(chǎn)生一個(gè)配置。
如果有兩個(gè)配置文件,也就是兩個(gè)資源,如 本書5.1.1小節(jié)中core-default.xml 和 core-site.xml,通過 Configuration 類的 loadResources() 方法,把它們合并成一個(gè)配置。代碼如下:
Configurationconf = new Configuration();
conf.addResource(“core-default.xml”);
conf.addResource(“core-site.xml”);
如果這兩個(gè)配置資源都包含了相同的配置項(xiàng),而且前一個(gè)資源的配置項(xiàng)沒有標(biāo)記為final,那么,后面的配置將覆蓋前面的配置。上面的例子中,core-site.xml 中的配置將覆蓋core-default.xml 中的同名配置。如果在第一個(gè)資源(core-default.xml)中某配置項(xiàng)被標(biāo)記為final,那么,在加載第二個(gè)資源的時(shí)候,會(huì)有警告提示。
輔助類GenericOptionsParser,Tool和ToolRunner
GenericOptionsParser是hadoop框架中解析命令行參數(shù)的基本類。它能夠辨別一些標(biāo)準(zhǔn)的命令行參數(shù),能夠使應(yīng)用程序輕易地指定namenode,jobtracker,以及其他額外的配置資源。
通常不直接使用GenericOptionsParser,而是實(shí)現(xiàn)Tool接口,通過ToolRunner來運(yùn)行應(yīng)用程序。
補(bǔ)充
參考http://www.itdecent.cn/p/59d191b4af31
· ToolRunner的主要功能:
1. 創(chuàng)建(如果傳入的是null),設(shè)置當(dāng)前tool的Configuration
2. 處理命令行參數(shù)。
· 命令行參數(shù)
在tool的執(zhí)行過程中,有兩個(gè)地方可以讀入命令行參數(shù)
1. main中的args:main函數(shù)中的args得到的是原始的明亮行參數(shù),通常我們會(huì)傳入一些跟hadoop運(yùn)行時(shí)有關(guān)的參數(shù),這中參數(shù)和某個(gè)tool的業(yè)務(wù)邏輯沒啥關(guān)系,這是一般會(huì)通過-D key=val的方式傳入。
2. run中的args:ToolRunner解析參數(shù)的作用是將這些參數(shù)提取并存入Configuration中,便于job提取,同時(shí)將剩余的toolargs傳入run方法中。所以run方法得到的就是tool相關(guān)的args。
用MRUnit來寫單元測試
MRUnit是一個(gè)測試庫,用于將已知的輸入傳遞給mapper或者檢查reducer的輸出是否符合預(yù)期。
書中給出了很多范例。
補(bǔ)充
參考https://blog.csdn.net/xiaocaidexuexibiji/article/details/12053643
根據(jù)不同的測試對(duì)象要采用不同的測試模塊來進(jìn)行,MRUnit針對(duì)不同測試對(duì)象分別使用一下幾種Driver:
1. MapDriver ,針對(duì)單獨(dú)的Map測試
2. ReduceDriver,針對(duì)單獨(dú)的Reduce測試。
3. MapReduceDriver ,將Map和Reduce連貫起來測試。
4. PipelineMapReduceDriver,將多個(gè)Map-Reduce pair貫穿測試。
· 在本地作業(yè)運(yùn)行器上運(yùn)行作業(yè)
1. 通過Tool接口就可以寫MapReduce作業(yè)的驅(qū)動(dòng)程序。
2. Hadoop有本地作業(yè)運(yùn)行器(job runner),它是在MapReduce執(zhí)行引擎運(yùn)行單個(gè)JVM上的MapReduce作業(yè)的簡化版本。
在本地測試驅(qū)動(dòng)程度的方法
法1. 使用本地作業(yè)運(yùn)行器,在本地文件系統(tǒng)的測試文件上運(yùn)行作業(yè)。
法2. 使用一個(gè)mini集群來運(yùn)行。
· 在集群上運(yùn)行作業(yè)
· MapReduce的web界面
Hadoop的web界面用來瀏覽作業(yè)信息,對(duì)于跟蹤作業(yè)運(yùn)行進(jìn)度、查找作業(yè)完成后的統(tǒng)計(jì)信息和日志非常有用。
·MapReduce工作流
復(fù)雜處理過程的解決方法:增加更多的作業(yè),而非增加作業(yè)的復(fù)雜度。
個(gè)人理解:就是利用多個(gè)mapper和reduer將任務(wù)拆分,后一個(gè)mapper的輸入為前一個(gè)mapper的輸出。
1.?MapReduce的工作流(JobControl)有兩種方式:
1. 線性鏈
2. 有向無環(huán)圖(directed acyclic graph, DAG)
2. Apache Oozie
補(bǔ)充
什么是Oozie?
Oozie是一個(gè)管理Hdoop作業(yè)(job)的工作流程調(diào)度管理系統(tǒng)。
Oozie的工作流是一系列動(dòng)作的直接周期圖。
Oozie協(xié)調(diào)作業(yè)就是通過時(shí)間(頻率)和有效數(shù)據(jù)觸發(fā)當(dāng)前的Oozie工作流程
Oozie是Yahoo針對(duì)Apache Hadoop開發(fā)的一個(gè)開源工作流引擎。
用于管理和協(xié)調(diào)運(yùn)行在Hadoop平臺(tái)上(包括:HDFS、Pig和MapReduce)的Jobs。Oozie是專為雅虎的全球大規(guī)模復(fù)雜工作流程和數(shù)據(jù)管道而設(shè)計(jì)。
Oozie圍繞著兩個(gè)核心進(jìn)行:工作流(Workflow)和協(xié)調(diào)器(Coordinator),前者定義任務(wù)拓?fù)浜蛨?zhí)行邏輯,后者負(fù)責(zé)工作流的依賴和觸發(fā)。