以下是我們如何使用maxmind geoIP;
我們將GeoIPCity.dat
文件放入雲中,並在啓動過程時使用雲位置作爲參數。 我們得到了GeoIPCity.data
文件並創建一個新的LookupService
的代碼是:
if (DistributedCache.getLocalCacheFiles(context.getConfiguration()) != null) {
List<Path> localFiles = Utility.arrayToList(DistributedCache.getLocalCacheFiles(context.getConfiguration()));
for (Path localFile : localFiles) {
if ((localFile.getName() != null) && (localFile.getName().equalsIgnoreCase("GeoIPCity.dat"))) {
m_geoipLookupService = new LookupService(new File(localFile.toUri().getPath()));
}
}
}
下面是命令的縮寫版本中,我們用它來運行我們的程序
$HADOOP_HOME/bin/hadoop jar /usr/lib/COMPANY/analytics/libjars/MyJar.jar -files hdfs://PDHadoop1.corp.COMPANY.com:54310/data/geoip/GeoIPCity.dat -libjars /usr/lib/COMPANY/analytics/libjars/geoiplookup.jar
這樣做的關鍵部件運行MindMax組件是-files
和-libjars
。這些是GenericOptionsParser中的通用選項。
-files <comma separated list of files> specify comma separated files to be copied to the map reduce cluster
-libjars <comma separated list of jars> specify comma separated jar files to include in the classpath.
我假設Hadoop的使用GenericOptionsParser
因爲我能找到我的項目中沒有任何地方提到它。:)
如果你把GeoIPCity.dat
上能和它的使用-files
參數指定,它會被放入本地緩存該映射器然後可以在setup
功能得到。它不必在setup
中,但每個映射器只需要執行一次,因此是一個很好的放置位置。 然後使用-libjars
參數來指定geoiplookup.jar(或稱爲你的任何東西),它將能夠使用它。我們不把geoiplookup.jar放在雲上。我假設hadoop會根據需要分發jar。
我希望一切都有道理。我對hadoop/mapreduce非常熟悉,但是我沒有在項目中編寫使用maxmind geoip組件的部分,所以我必須做一點深入的瞭解,才能做出我在這裏所做的解釋。
編輯:-files
和-libjars
的附加說明 -files files參數用於通過Hadoop分佈式緩存分發文件。在上面的示例中,我們通過Hadoop分佈式緩存分發Max Mind地理-ip數據文件。我們需要訪問Max Mind geo-ip數據文件,將用戶的IP地址映射到適當的國家,地區,城市,時區。 API要求數據文件在本地存在,這在分佈式處理環境中是不可行的(我們無法保證羣集中哪些節點將處理數據)。爲了將適當的數據分發到處理節點,我們使用Hadoop分佈式緩存基礎結構。 GenericOptionsParser和ToolRunner使用-file參數自動實現這一點。請注意,我們分發的文件應該在雲中可用(HDFS)。 -libjars -libjars用於分發map-reduce作業所需的任何附加依賴項。與數據文件一樣,我們還需要將相關庫複製到要運行作業的羣集中的節點。 GenericOptionsParser和ToolRunner使用-libjars參數自動實現這一點。
有在該文件實際上是讀取源密切關注。你可以重寫該方法嗎? – 2011-02-10 16:26:54
我的目標是能夠從類路徑中的某個文件中獲取文件f。如果我可以做到這一點,那麼我可以改變一些事情,讓其餘的工作。 – 2011-02-10 16:54:07