我有一個小的sqlite數據庫(郵政編碼 - >美國城市名稱),我有一個大的用戶S3文件。我想將每個用戶映射到與其郵遞區號關聯的城市名稱。什麼時候可以爲hadoop Mapper啓動資源?
我跟隨著名WordCount.java例子,但林不知道MapReduce的內部工作原理:
- 是我的映射每S3輸入文件中創建一次?
- 我應該在映射器創建時連接到sqlite數據庫嗎?我應該在映射器的構造函數中這樣做嗎?
我有一個小的sqlite數據庫(郵政編碼 - >美國城市名稱),我有一個大的用戶S3文件。我想將每個用戶映射到與其郵遞區號關聯的城市名稱。什麼時候可以爲hadoop Mapper啓動資源?
我跟隨著名WordCount.java例子,但林不知道MapReduce的內部工作原理:
的MapReduce是一個用於編寫應用程序的框架,以可靠和容錯的方式在大型商品硬件集羣上並行處理大數據。 MapReduce在HDFS(Hadoop分佈式文件系統)之上以兩個不同的階段執行,分別稱爲映射階段和縮小階段。
對您的問題的回答我的映射器是根據s3輸入文件創建的嗎?
映射器創建等於拆分數量 默認情況下創建拆分等於塊的數量。
高級概述是一樣的東西
輸入 文件 - > InputFormat-> Splits-> RecordReader-> Mapper-> Partitioner->隨機&排序 - > Reducer->最終 輸出
實施例,
回答你的第二個問題: 以下是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");
}
1)mapper被創建一次每1分裂,通常是128或256mb。 您可以使用此參數配置拆分大小:mapreduce.input.fileinputformat.split.minsize
和mapreduce.input.fileinputformat.split.maxsize
。如果輸入文件小於分割大小,則全部進入一個地圖任務。
2)您可以使用方法setup
和cleanup
來配置任務的資源。 setup
在任務開始時調用一次,cleanup
在最後調用一次。所以,你可以對數據庫的連接在setup
方法(可能不只是連接,但加載在內存性能所有城市)和緊密連接(如果你決定不來加載數據,但只要連接)在cleanup
更多關於輸入分流您可以按照下列因此[http://stackoverflow.com/questions/14291170/how-does-hadoop-process-records-split-across-block-boundaries] – subodh