MapReduce計數器和連線



在MapReduce的計數器是用於收集關於 MapReduce 工作的統計資訊的機制。這個資訊在MapReduce的作業處理的問題的診斷是很有用的。 計數器類似於將在 map 或 reduce 在程式碼紀錄檔資訊中。

通常情況下,這些計數器在一個程式(map 或 reduce)中定義,當一個特定事件或條件(特定於該計數器)發生執行期間遞增。計數器是一個很好的應用來從輸入資料集跟蹤有效和無效的記錄。

有兩種型別的計數器:

1. Hadoop 內建計數器: 有一些內建計數器存在每個作業中。下面是內建計數器組:

  • MapReduce任務計數器 - 收集任務的具體資訊(例如,輸入記錄的數量)在它的執行期間。
  • 檔案系統計數器 - 收集資訊像由一個任務讀取或寫入的位元組數
  • FileInputFormat計數器 - 收集通過FileInputFormat讀取的位元組數的資訊
  • FileOutputFormat計數器 - 收集的位元組數量的資訊通過 FileOutputFormat 寫入
  • Job 計數器- 這些計數器使用 JobTracker。它們收集統計資料包括如,任務發起了作業的數量。

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 連線

連線兩個大的資料集可以使用 MapReduce Join 來實現。然而,這個過程需要編寫大量的程式碼來執行實際的連線操作。

連線兩個資料集開始是通過比較每個資料集的大小。如果因為相比其他資料集一個資料集小,那麼小資料集被分布到叢集中的每個資料節點。一旦分散,無論是 Mapper 或 Reducer 使用更小的資料集進行查詢匹配的大型資料集的記錄,然後結合這些記錄,形成輸出記錄。

這取決於在實際連線進行的地方,這個連線分為:

1. 對映端連線 - 當該聯接是由對映器執行的,它稱為對映端連結。在這種型別中,聯結前的資料由對映函式實際來消耗的處理。它是強制性的,輸入到每個對映是在分割區中的形式,並且是按排序順序。另外,必須有一個相等數目的分割區,它必須由連線鍵進行排序。

2. Reduce端連線- 當連線是通過減速器進行的,稱為reduce端連線。沒有必要在此連線有資料集中在以結構化形式(或分割區)。

在這裡,對映端的處理發出連線這兩個表的關鍵字和對應的元組。作為該處理的效果,所有的元組相同連線鍵都落在相同的 reducer,然後使用相同的連線鍵連線記錄。

整體處理流程示於下圖。