我有一个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;
然而,当在超过1000万行的更大数据集上测试时,我会在每次尝试时得到此LeaseExpiredException: http://pastebin.com/yK6Qmx6r
我的地图和缩小过程在数小时内仍然停留在0%。请注意,如果我取出此udf并仅使用一些内部Hive UDF进行测试,则不会发生此行为。
我在具有AMI版本2.4.5(Hive 0.11.0.2和Hadoop 1.0.3)的Amazon EMR集群上运行此功能。
我尝试通过部署更好的硬件来提高群集的性能,但是我遇到了与任何硬件方案相同的问题。
有什么想法吗?
答案 0 :(得分:1)
好的,划伤那个。似乎在升级我的实例后,事情开始转移,但我只是没有等待足够的时间来进行映射。并且LeaseExpiredError实际上是因为少量的ol'当我杀死进程时我
尽管如此,解析需要花费大量时间,我希望有一些建议可以进一步优化这个UDF。