在MapReduce的計數器是用於收集關於 MapReduce 工作的統計資訊的機制。這個資訊在MapReduce的作業處理的問題的診斷是很有用的。 計數器類似於將在 map 或 reduce 在程式碼紀錄檔資訊中。
通常情況下,這些計數器在一個程式(map 或 reduce)中定義,當一個特定事件或條件(特定於該計數器)發生執行期間遞增。計數器是一個很好的應用來從輸入資料集跟蹤有效和無效的記錄。
有兩種型別的計數器:
1. Hadoop 內建計數器: 有一些內建計數器存在每個作業中。下面是內建計數器組:
2. 使用者定義的計數器
除了內建的計數器,使用者可以定義自己的計數器,通過使用程式設計語言提供了類似的功能。 例如,在 Java 的列舉用於定義使用者定義的計數器。
一個MapClass例子使用計數器計算缺失和無效值的數量:
|
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 實現計數器的範例。
在這裡,SalesCounters是用“列舉”定義的計數器。它被用來計算 MISSING 和 INVALID 的輸入記錄。
在程式碼段中,如果 “country” 欄位的長度為零那麼它的值丟失,因此相應的計數器 SalesCounters.MISSING 遞增。
接下來,如果 “sales” 欄位開頭是符號 '' ,則記錄被視為無效。這通過遞增計數器 SalesCounters.INVALID 來表示。
連線兩個大的資料集可以使用 MapReduce Join 來實現。然而,這個過程需要編寫大量的程式碼來執行實際的連線操作。
連線兩個資料集開始是通過比較每個資料集的大小。如果因為相比其他資料集一個資料集小,那麼小資料集被分布到叢集中的每個資料節點。一旦分散,無論是 Mapper 或 Reducer 使用更小的資料集進行查詢匹配的大型資料集的記錄,然後結合這些記錄,形成輸出記錄。
這取決於在實際連線進行的地方,這個連線分為:
1. 對映端連線 - 當該聯接是由對映器執行的,它稱為對映端連結。在這種型別中,聯結前的資料由對映函式實際來消耗的處理。它是強制性的,輸入到每個對映是在分割區中的形式,並且是按排序順序。另外,必須有一個相等數目的分割區,它必須由連線鍵進行排序。
2. Reduce端連線- 當連線是通過減速器進行的,稱為reduce端連線。沒有必要在此連線有資料集中在以結構化形式(或分割區)。
在這裡,對映端的處理發出連線這兩個表的關鍵字和對應的元組。作為該處理的效果,所有的元組相同連線鍵都落在相同的 reducer,然後使用相同的連線鍵連線記錄。
整體處理流程示於下圖。