以下代码在我指定本地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();
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;
}
...
}
答案 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()方法显示的示例应确保群集中的所有节点都可以访问该文件。