2017-04-24 71 views
1

我有一個小的sqlite數據庫(郵政編碼 - >美國城市名稱),我有一個大的用戶S3文件。我想將每個用戶映射到與其郵遞區號關聯的城市名稱。什麼時候可以爲hadoop Mapper啓動資源?

我跟隨著名WordCount.java例子,但林不知道MapReduce的內部工作原理:

  • 是我的映射每S3輸入文件中創建一次?
  • 我應該在映射器創建時連接到sqlite數據庫嗎?我應該在映射器的構造函數中這樣做嗎?

回答

1

的MapReduce是一個用於編寫應用程序的框架,以可靠和容錯的方式在大型商品硬件集羣上並行處理大數據。 MapReduce在HDFS(Hadoop分佈式文件系統)之上以兩個不同的階段執行,分別稱爲映射階段和縮小階段。

對您的問題的回答我的映射器是根據s3輸入文件創建的嗎?

映射器創建等於拆分數量 默認情況下創建拆分等於塊的數量。

高級概述是一樣的東西

輸入 文件 - > InputFormat-> Splits-> RecordReader-> Mapper-> Partitioner->隨機&排序 - > Reducer->最終 輸出

實施例,

  1. 你的輸入文件 - server1.log,server2.log,server3.l OG
  2. InputFormat將基於塊的大小(默認)
  3. 對應的Split將分配到在每個分割工作映射創建拆分的數量。
  4. 爲了從Split中獲得記錄行,RecordReader將在Mapper和Split之間。
  5. 比Partitioner將開始。
  6. 分區器洗牌後&分階段將開始。
  7. 減速機
  8. 最終輸出。

回答你的第二個問題: 以下是Mapper的三個標準的生命週期方法。

@Override 
protected void map(Object key, Text value, Mapper<Object, Text, Text, IntWritable>.Context context) 
    throws IOException, InterruptedException { 

    // Filter your data 
    } 

} 
@Override 
protected void setup(Mapper<Object, Text, Text, IntWritable>.Context context) 
    throws IOException, InterruptedException { 
    System.out.println("calls only once at startup"); 
} 
@Override 
protected void cleanup(Mapper<Object, Text, Text, IntWritable>.Context context) 
    throws IOException, InterruptedException { 
    System.out.println("calls only once at end"); 
} 
+0

更多關於輸入分流您可以按照下列因此[http://stackoverflow.com/questions/14291170/how-does-hadoop-process-records-split-across-block-boundaries] – subodh

1

1)mapper被創建一次每1分裂,通常是128或256mb。 您可以使用此參數配置拆分大小:mapreduce.input.fileinputformat.split.minsizemapreduce.input.fileinputformat.split.maxsize。如果輸入文件小於分割大小,則全部進入一個地圖任務。

2)您可以使用方法setupcleanup來配置任務的資源。 setup在任務開始時調用一次,cleanup在最後調用一次。所以,你可以對數據庫的連接在setup方法(可能不只是連接,但加載在內存性能所有城市)和緊密連接(如果你決定不來加載數據,但只要連接)在cleanup