在Hive中使用自定义UDF的LeaseExpiredException

时间:2014-09-11 11:26:44

标签: hadoop hive elastic-map-reduce emr

我有一个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集群上运行此功能。

我尝试通过部署更好的硬件来提高群集的性能,但是我遇到了与任何硬件方案相同的问题。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

好的,划伤那个。似乎在升级我的实例后,事情开始转移,但我只是没有等待足够的时间来进行映射。并且LeaseExpiredError实际上是因为少量的ol'当我杀死进程时我

尽管如此,解析需要花费大量时间,我希望有一些建议可以进一步优化这个UDF。