我有一个Hive UDF,应该从UA字符串中提取设备。它使用ua-parser库:
https://github.com/tobie/ua-parser
UDF非常简单:
public class DeviceTypeExtractTest extends UDF{
private Text result = new Text();
private static final Parser uaParser;
static {
try {
uaParser = new Parser();
}
catch(IOException e) {
throw new RuntimeException("Could not instantiate User-Agent parser.");
}
}
public Text evaluate( Text uaField){
if (uaField == null ) {
return null;
}
try
{
String uaString = uaField.toString();
Client client = uaParser.parse(uaString);
result.set(client.device.family);
return result;
}
catch(Exception e)
{
return null;
}
}
}
当在较小的数据集上运行时,它的效果很好。
create table categories(
cat string);
insert overwrite table categories select DEVICE_TYPE_EXTRACT(user_agent) from raw_logs;
但是,当在超过一千万行的更大数据集上对此进行测试时,每次尝试都会得到这个LeaseExpiredException:
http://pastebin.com/yK6Qmx6r
而且我的 map 和简化流程几个小时都停留在0%的水平。请注意,如果我取出此udf并仅将某些内部Hive UDF用于测试,则不会发生此行为。
我在具有AMI 2.4.5版(Hive 0.11.0.2和Hadoop 1.0.3)的Amazon EMR集群上运行此程序。
我尝试通过部署更好的硬件来提高群集的性能,但是在任何硬件方案中我都遇到相同的问题。
有任何想法吗?
最佳答案
好吧,把它刮开。似乎在升级实例之后,事情开始发生变化,但是我只是没有等待足够长的时间来完成映射。实际上,由于我杀死进程时几乎没有,所以引发了LeaseExpiredError。
尽管如此,解析仍需要花费大量时间,我希望提出一些建议来进一步优化此UDF。
关于hadoop - Hive中带有自定义UDF的LeaseExpiredException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25786231/