Pig UDF Maxmind GeoIP数据库数据文件加载问题

时间:2013-10-03 02:32:06

标签: java hadoop apache-pig

以下代码在我指定本地GeoIPASNum.dat文件时在本地执行Pig脚本时有效。但是,在MapReduce分布式模式下运行时,它不起作用。我错过了什么?

猪工作

DEFINE AsnResolver AsnResolver('/hdfs/location/of/GeoIPASNum.dat');

loaded = LOAD 'log_file' Using PigStorage() AS (ip:chararray);

columned = FOREACH loaded GENERATE AsnResolver(ip);

STORE columned INTO 'output/' USING PigStorage();

AsnResolver.java

public class AsnResolver extends EvalFunc<String> {

    String ipAsnFile = null;

    @Override
    public String exec(Tuple input) throws IOException {
        try {
            LookupService lus = new LookupService(ipAsnFile,
                    LookupService.GEOIP_MEMORY_CACHE);
            return lus.getOrg((String) input.get(0));
        } catch (IOException e) {
        }

        return null;
    }

    public AsnResolver(String file) {
        ipAsnFile = file;
    }

    ...

}

2 个答案:

答案 0 :(得分:1)

问题是您使用的是HDFS路径的字符串引用,而LookupService构造函数无法解析该文件。它可能在本地运行时有效,因为LookupService对本地FS中的文件没有任何问题。

重写getCacheFiles方法:

@Override
public List<String> getCacheFiles() {
    List<String> list = new ArrayList<String>(1);
    list.add(ipAsnFile + "#GeoIPASNum.dat");
    return list;
}

然后更改LookupService构造函数以使用分布式缓存引用“GeoIPASNum.dat”:

LookupService lus = new LookupService("GeoIPASNum.dat", LookupService.GEOIP_MEMORY_CACHE);

答案 1 :(得分:0)

在Pig文档的此页面中搜索“分布式缓存”:http://pig.apache.org/docs/r0.11.0/udf.html

使用getCacheFiles()方法显示的示例应确保群集中的所有节点都可以访问该文件。