在MapReduce的計(jì)數(shù)器是用于收集關(guān)于 MapReduce 工作的統(tǒng)計(jì)信息的機(jī)制。這個(gè)信息在MapReduce的作業(yè)處理的問(wèn)題的診斷是很有用的。 計(jì)數(shù)器類似于將在 map 或 reduce 在代碼日志信息中。
通常情況下,這些計(jì)數(shù)器在一個(gè)程序(map 或 reduce)中定義,當(dāng)一個(gè)特定事件或條件(特定于該計(jì)數(shù)器)發(fā)生執(zhí)行期間遞增。計(jì)數(shù)器是一個(gè)很好的應(yīng)用來(lái)從輸入數(shù)據(jù)集跟蹤有效和無(wú)效的記錄。
有兩種類型的計(jì)數(shù)器:
1. Hadoop 內(nèi)置計(jì)數(shù)器: 有一些內(nèi)置計(jì)數(shù)器存在每個(gè)作業(yè)中。下面是內(nèi)置計(jì)數(shù)器組:
2. 用戶定義的計(jì)數(shù)器
除了內(nèi)置的計(jì)數(shù)器,用戶可以定義自己的計(jì)數(shù)器,通過(guò)使用編程語(yǔ)言提供了類似的功能。 例如,在 Java 的枚舉用于定義用戶定義的計(jì)數(shù)器。
一個(gè)MapClass例子使用計(jì)數(shù)器計(jì)算缺失和無(wú)效值的數(shù)量:
|
|
publicstaticclassMapClass extendsMapReduceBase implementsMapper<LongWritable, Text, Text, Text> { staticenumSalesCounters { MISSING, INVALID }; publicvoidmap ( LongWritable key, Text value, OutputCollector<Text, Text> output, Reporter reporter) throwsIOException { //Input string is split using ',' and stored in 'fields' array String fields[] = value.toString().split(",", -20); //Value at 4th index is country. It is stored in 'country' variable String country = fields[4]; //Value at 8th index is sales data. It is stored in 'sales' variable String sales = fields[8]; if(country.length() == 0) { reporter.incrCounter(SalesCounters.MISSING, 1); } elseif(sales.startsWith("\"")) { reporter.incrCounter(SalesCounters.INVALID, 1); } else{ output.collect(newText(country), newText(sales + ",1")); } } }
|
上面的代碼片段顯示在 Map Reduce 實(shí)現(xiàn)計(jì)數(shù)器的示例。
在這里,SalesCounters是用“枚舉”定義的計(jì)數(shù)器。它被用來(lái)計(jì)算 MISSING 和 INVALID 的輸入記錄。
在代碼段中,如果 “country” 字段的長(zhǎng)度為零那么它的值丟失,因此相應(yīng)的計(jì)數(shù)器 SalesCounters.MISSING 遞增。
接下來(lái),如果 “sales” 字段開頭是符號(hào) '' ,則記錄被視為無(wú)效。這通過(guò)遞增計(jì)數(shù)器 SalesCounters.INVALID 來(lái)表示。
連接兩個(gè)大的數(shù)據(jù)集可以使用 MapReduce Join 來(lái)實(shí)現(xiàn)。然而,這個(gè)過(guò)程需要編寫大量的代碼來(lái)執(zhí)行實(shí)際的連接操作。
連接兩個(gè)數(shù)據(jù)集開始是通過(guò)比較每個(gè)數(shù)據(jù)集的大小。如果因?yàn)橄啾绕渌麛?shù)據(jù)集一個(gè)數(shù)據(jù)集小,那么小數(shù)據(jù)集被分布到集群中的每個(gè)數(shù)據(jù)節(jié)點(diǎn)。一旦分散,無(wú)論是 Mapper 或 Reducer 使用更小的數(shù)據(jù)集進(jìn)行查找匹配的大型數(shù)據(jù)集的記錄,然后結(jié)合這些記錄,形成輸出記錄。
這取決于在實(shí)際連接進(jìn)行的地方,這個(gè)連接分為:
1. 映射端連接 - 當(dāng)該聯(lián)接是由映射器執(zhí)行的,它稱為映射端鏈接。在這種類型中,聯(lián)結(jié)前的數(shù)據(jù)由映射函數(shù)實(shí)際來(lái)消耗的處理。它是強(qiáng)制性的,輸入到每個(gè)映射是在分區(qū)中的形式,并且是按排序順序。另外,必須有一個(gè)相等數(shù)目的分區(qū),它必須由連接鍵進(jìn)行排序。
2. Reduce端連接- 當(dāng)連接是通過(guò)減速器進(jìn)行的,稱為reduce端連接。沒(méi)有必要在此連接有數(shù)據(jù)集中在以結(jié)構(gòu)化形式(或分區(qū))。
在這里,映射端的處理發(fā)出連接這兩個(gè)表的關(guān)鍵字和對(duì)應(yīng)的元組。作為該處理的效果,所有的元組相同連接鍵都落在相同的 reducer,然后使用相同的連接鍵連接記錄。
整體處理流程示于下圖。
