У меня есть 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;
Однако при тестировании этого на большом наборе данных, содержащем более 10 миллионов строк, я получаю это исключение LeaseExpiredException при каждой попытке: http://pastebin.com/yK6Qmx6r
И моя карта и процессы сокращения остаются на 0% в течение нескольких часов. Обратите внимание, что если я уберу этот udf и использую некоторые внутренние UDF Hive только для тестирования, такого поведения не будет.
Я запускаю это в кластере Amazon EMR с AMI версии 2.4.5 (Hive 0.11.0.2 и Hadoop 1.0.3).
Я попытался повысить производительность кластера, развернув лучшее оборудование, но у меня возникает та же проблема с любым аппаратным сценарием.
Есть идеи?