猪 UDF 麦克斯迈德地理 IP 数据库数据文件加载问题



当我在本地执行 Pig 脚本同时指定本地 GeoIPASNum.dat 文件时,以下代码有效。但是,当在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();

解析器.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;
    }
    ...
}

问题是你正在使用对 HDFS 路径的字符串引用,而 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);

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

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

最新更新