如何在MapReduce hadoop中使用GeoLite数据库?

时间:2015-08-01 10:35:37

标签: java hadoop

我正在尝试编写Map Reduce程序,我正在尝试使用GeoLite数据库来解析IP地址的位置。我不确定如何将数据库文件传递给映射器以及要使用哪些依赖项?

1 个答案:

答案 0 :(得分:1)

在Map Reduce hadoop中使用GeoLite数据库的一种方法是将数据库作为缓存文件传递,方法是:

  

DistributedCache.addCacheFile(inputPath.toUri(),   job.getConfiguration());

您可以使用缓存文件将.mmdb文件传递给每个映射器。

我用于使用GeoLite数据库的依赖项是:

    </dependency>
        <dependency>
            <groupId>com.maxmind.geoip2</groupId>
            <artifactId>geoip2</artifactId>
            <version>2.3.0</version>
        </dependency>

        <dependency>
            <groupId>com.maxmind.db</groupId>
            <artifactId>maxmind-db</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>

然后,您可以覆盖设置并将缓存文件传递给映射器,如下所示:

@Override
public void setup(Context context)

{
  Configuration conf = context.getConfiguration();

try {

  cachefiles = DistributedCache.getLocalCacheFiles(conf);

  File database = new File(cachefiles[0].toString()); 

  reader = new DatabaseReader.Builder(database).build();

} catch (IOException e) {
  e.printStackTrace();
}

} 

然后我在地图中使用了这样的函数:

public void map(Object key, Text line, Context context) throws IOException,
      InterruptedException {

    InetAddress ipAddress = InetAddress.getByName(address.getHostAddress());
    CityResponse response = null;
    try {
      response = reader.city(ipAddress);
    } catch (GeoIp2Exception ex) {
      ex.printStackTrace();
      return;
    }

    Country country = response.getCountry();
    String count = country.getName(); // 'US'

    if (country.getName() == null) {
      return;
    }

您可以查看工作示例here