복붙노트

[HADOOP] 분산 캐시를 사용하여 하둡에 Maxmind 지오 API에 액세스

HADOOP

분산 캐시를 사용하여 하둡에 Maxmind 지오 API에 액세스

나는 웹 로그를 분석하기 위해 맵리 듀스 작업을 쓰고 있어요. 내 코드는 위치를 지리적하기 위해 IP 주소를지도하기위한 것입니다 그리고 난 그 목적을 위해 Maxmind 지오 API (https://github.com/maxmind/geoip-api-java)를 사용하고 있습니다. 내 코드 위치 matchings에 IP와 데이터베이스 파일을 필요로하는 LookupService 방법이있다. 내가 분산 캐시를 사용하여이 데이터베이스 파일을 전달하려합니다. 나는 두 가지 방법으로이 일을 시도

사례 1 :

HDFS에서 파일을 통과하는 작업을 실행하지만 항상 "파일을 찾을 수 없습니다"라는 오류가 발생합니다

sudo -u hdfs hadoop jar \
 WebLogProcessing-0.0.1-SNAPSHOT-jar-with-dependencies.jar \
GeoLocationDatasetDriver /user/hdfs/input /user/hdfs/out_put \
/user/hdfs/GeoLiteCity.dat 

또는

sudo -u hdfs hadoop jar \
WebLogProcessing-0.0.1-SNAPSHOT-jar-with-dependencies.jar \
GeoLocationDatasetDriver /user/hdfs/input /user/hdfs/out_put \
hdfs://sandbox.hortonworks.com:8020/user/hdfs/GeoLiteCity.dat

드라이버 클래스 코드 :

Configuration conf = getConf();
Job job = Job.getInstance(conf);
job.addCacheFile(new Path(args[2]).toUri()); 

매퍼 클래스 코드 :

public void setup(Context context) throws IOException
{
URI[] uriList = context.getCacheFiles();
Path database_path = new Path(uriList[0].toString());
LookupService cl = new LookupService(database_path.toString(),
            LookupService.GEOIP_MEMORY_CACHE | LookupService.GEOIP_CHECK_CACHE);
}

CASE 2 : 이 -files 옵션을 통해 로컬 파일 시스템에서 파일을 전달하여 코드를 실행합니다. 오류 : 라인 LookupService의 CL = 새로운 LookupService에서 널 포인터 예외 (database_path)

sudo -u hdfs hadoop jar  \
WebLogProcessing-0.0.1-SNAPSHOT-jar-with-dependencies.jar \
com.prithvi.mapreduce.logprocessing.ipgeo.GeoLocationDatasetDriver \
-files /tmp/jobs/GeoLiteCity.dat /user/hdfs/input /user/hdfs/out_put \
GeoLiteCity.dat

드라이버 코드 :

Configuration conf = getConf();
Job job = Job.getInstance(conf);
String dbfile = args[2];
conf.set("maxmind.geo.database.file", dbfile);

매퍼 코드 :

public void setup(Context context) throws IOException
{
  Configuration conf = context.getConfiguration();
  String database_path = conf.get("maxmind.geo.database.file");
  LookupService cl = new LookupService(database_path,
            LookupService.GEOIP_MEMORY_CACHE | LookupService.GEOIP_CHECK_CACHE);
}

나는 작업을 수행하기 위해 내 모든 작업 추적기에서이 데이터베이스 파일이 필요합니다. 어떤 사람은 나에게 그렇게 할 수있는 올바른 방법을 제안시겠습니까?

해결법

  1. ==============================

    1.이 일을보십시오 :

    이 일을보십시오 :

    HDFS의 파일이 너무 작업 개체를 사용하여 같은 곳 드라이버에서 지정

    job.addCacheFile(new URI("hdfs://localhot:8020/GeoLite2-City.mmdb#GeoLite2-City.mmdb"));
    

    # 별칭 이름 (심볼릭 링크)를 나타냅니다 하둡에 의해 생성 될

    그 후 당신은) (설정에 매퍼에서 방법을 파일에 액세스 할 수 있습니다 :

    @Override
    protected void setup(Context context) {
      File file = new File("GeoLite2-City.mmdb");
    }
    

    다음은 그 예이다 :

  2. from https://stackoverflow.com/questions/25193145/accessing-maxmind-geo-api-in-hadoop-using-distributed-cache by cc-by-sa and MIT license