注:本文涉及書(shū)中5.1~5.7小結(jié)
MapReduce編程流程
step1. 首先寫(xiě)map函數(shù)和reduce函數(shù),并使用單元測(cè)試來(lái)確保函數(shù)的運(yùn)行符合預(yù)期兼丰。
step2. 寫(xiě)一個(gè)驅(qū)動(dòng)程序來(lái)運(yùn)行作業(yè)肘交。先從本地IDE中用一個(gè)小的數(shù)據(jù)集來(lái)運(yùn)行它笆载,從而改進(jìn)mapper和reducer,使其能夠正確處理類似輸入涯呻。
step3. 當(dāng)程序能夠預(yù)期通過(guò)小型數(shù)據(jù)集凉驻,將其部署到集群中運(yùn)行,不斷通過(guò)擴(kuò)展測(cè)試用例來(lái)改進(jìn)mapper和reducer复罐。
step4. 當(dāng)程序正確執(zhí)行后涝登,可以進(jìn)行優(yōu)化調(diào)整。如做標(biāo)準(zhǔn)檢查效诅、任務(wù)剖析(task profiling)胀滚、借助鉤子(hook)。
用于配置的API
Hadoop中的組件是通過(guò)Hadoop自己的配置API來(lái)配置的乱投。一個(gè)Configuration類的實(shí)例代表配置屬性及其取值的一個(gè)集合咽笼。Configuration從資源(.xml文件)中讀取其屬性值。
使 用 Configuration 類 的 一 般 過(guò) 程 是 : 構(gòu) 造 Configuration 對(duì) 象篡腌, 并 通 過(guò) 類 的addResource() 方法添加需要加載的資源 褐荷;然后就可以使用 get?方法和 set?方法訪問(wèn) / 設(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代表無(wú)法變更米死。final 一般不出現(xiàn)锌历,但在合并資源的時(shí)候,可以防止配置項(xiàng)的值被覆蓋峦筒。
合并資源指將多個(gè)配置文件合并究西,產(chǎn)生一個(gè)配置。
如果有兩個(gè)配置文件物喷,也就是兩個(gè)資源卤材,如 本書(shū)5.1.1小節(jié)中core-default.xml 和 core-site.xml,通過(guò) Configuration 類的 loadResources() 方法峦失,把它們合并成一個(gè)配置扇丛。代碼如下:
Configurationconf = new Configuration();
conf.addResource(“core-default.xml”);
conf.addResource(“core-site.xml”);
如果這兩個(gè)配置資源都包含了相同的配置項(xiàng),而且前一個(gè)資源的配置項(xiàng)沒(méi)有標(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接口府蛇,通過(guò)ToolRunner來(lái)運(yùn)行應(yīng)用程序。
補(bǔ)充
參考http://www.reibang.com/p/59d191b4af31
· ToolRunner的主要功能:
1. 創(chuàng)建(如果傳入的是null)屿愚,設(shè)置當(dāng)前tool的Configuration
2. 處理命令行參數(shù)汇跨。
· 命令行參數(shù)
在tool的執(zhí)行過(guò)程中务荆,有兩個(gè)地方可以讀入命令行參數(shù)
1. main中的args:main函數(shù)中的args得到的是原始的明亮行參數(shù),通常我們會(huì)傳入一些跟hadoop運(yùn)行時(shí)有關(guān)的參數(shù)穷遂,這中參數(shù)和某個(gè)tool的業(yè)務(wù)邏輯沒(méi)啥關(guān)系函匕,這是一般會(huì)通過(guò)-D key=val的方式傳入。
2. run中的args:ToolRunner解析參數(shù)的作用是將這些參數(shù)提取并存入Configuration中蚪黑,便于job提取盅惜,同時(shí)將剩余的toolargs傳入run方法中。所以run方法得到的就是tool相關(guān)的args忌穿。
用MRUnit來(lái)寫(xiě)單元測(cè)試
MRUnit是一個(gè)測(cè)試庫(kù)抒寂,用于將已知的輸入傳遞給mapper或者檢查reducer的輸出是否符合預(yù)期。
書(shū)中給出了很多范例掠剑。
補(bǔ)充
參考https://blog.csdn.net/xiaocaidexuexibiji/article/details/12053643
根據(jù)不同的測(cè)試對(duì)象要采用不同的測(cè)試模塊來(lái)進(jìn)行蓬推,MRUnit針對(duì)不同測(cè)試對(duì)象分別使用一下幾種Driver:
1. MapDriver ,針對(duì)單獨(dú)的Map測(cè)試
2. ReduceDriver澡腾,針對(duì)單獨(dú)的Reduce測(cè)試沸伏。
3. MapReduceDriver ,將Map和Reduce連貫起來(lái)測(cè)試动分。
4. PipelineMapReduceDriver毅糟,將多個(gè)Map-Reduce pair貫穿測(cè)試。
· 在本地作業(yè)運(yùn)行器上運(yùn)行作業(yè)
1. 通過(guò)Tool接口就可以寫(xiě)MapReduce作業(yè)的驅(qū)動(dòng)程序澜公。
2. Hadoop有本地作業(yè)運(yùn)行器(job runner)姆另,它是在MapReduce執(zhí)行引擎運(yùn)行單個(gè)JVM上的MapReduce作業(yè)的簡(jiǎn)化版本。
在本地測(cè)試驅(qū)動(dòng)程度的方法
法1. 使用本地作業(yè)運(yùn)行器坟乾,在本地文件系統(tǒng)的測(cè)試文件上運(yùn)行作業(yè)迹辐。
法2. 使用一個(gè)mini集群來(lái)運(yùn)行。
· 在集群上運(yùn)行作業(yè)
· MapReduce的web界面
Hadoop的web界面用來(lái)瀏覽作業(yè)信息甚侣,對(duì)于跟蹤作業(yè)運(yùn)行進(jìn)度明吩、查找作業(yè)完成后的統(tǒng)計(jì)信息和日志非常有用。
·MapReduce工作流
復(fù)雜處理過(guò)程的解決方法:增加更多的作業(yè)殷费,而非增加作業(yè)的復(fù)雜度印荔。
個(gè)人理解:就是利用多個(gè)mapper和reduer將任務(wù)拆分,后一個(gè)mapper的輸入為前一個(gè)mapper的輸出详羡。
1.?MapReduce的工作流(JobControl)有兩種方式:
1. 線性鏈
2. 有向無(wú)環(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è)就是通過(guò)時(shí)間(頻率)和有效數(shù)據(jù)觸發(fā)當(dāng)前的Oozie工作流程
Oozie是Yahoo針對(duì)Apache Hadoop開(kāi)發(fā)的一個(gè)開(kāi)源工作流引擎水泉。
用于管理和協(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ā)畔师。