下面是我们如何使用 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
放在 can 上并使用参数指定它-files
,它将被放入本地缓存中,然后映射器可以在setup
函数中获取。它不必进入,setup
但每个映射器只需要完成一次,因此是放置它的好地方。然后使用-libjars
参数指定geoiplookup.jar(或任何你称之为你的),它将能够使用它。我们不会将 geoiplookup.jar 放在云端。我假设hadoop会根据需要分发jar。
我希望一切都说得通。我对 hadoop/mapreduce 已经相当熟悉了,但是我没有写出在项目中使用 maxmind geoip 组件的部分,所以我不得不做一些挖掘来充分理解它来做我在这里的解释。
编辑:-files
和的附加描述-libjars
-files files 参数用于通过 Hadoop 分布式缓存分发文件。在上面的示例中,我们通过 Hadoop 分布式缓存分发 Max Mind geo-ip 数据文件。我们需要访问 Max Mind 地理 IP 数据文件,以将用户的 IP 地址映射到相应的国家、地区、城市、时区。API 要求数据文件存在于本地,这在分布式处理环境中是不可行的(我们无法保证集群中的哪些节点将处理数据)。为了将适当的数据分发到处理节点,我们使用 Hadoop 分布式缓存基础架构。GenericOptionsParser 和 ToolRunner 使用 –file 参数自动促进这一点。请注意,我们分发的文件应该在云 (HDFS) 中可用。-libjars –libjars 用于分发 map-reduce 作业所需的任何附加依赖项。与数据文件一样,我们还需要将依赖库复制到集群中将运行作业的节点。GenericOptionsParser 和 ToolRunner 使用 –libjars 参数自动促进这一点。