我有一个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/

10-16 03:20