2015-12-15 4 views
1

Я создал внешнюю таблицу улья, которая читает пользовательский формат ввода файла. Это прекрасно работает, когда файл небольшой. Но когда файлы большие, работа разбивает файлы, и моя работа завершается с ошибкой.Hive MapReduce job splitting up files

Я возвращаю false в свой собственный класс входного формата для метода IsSplittable. Я также попытался установить mapreduce.input.fileinputformat.split.minsize и mapred.min.split.size для больших значений. Я создал пользовательский InputFormat, OutputFormat и класс SerDe и использовал их при создании этой таблицы.

В моих журналах работы я все еще вижу разрывы.

Processing split: Paths:/user/test/testfile1:0+134217728,/user/test/testfile1:134217728+95198924,/user/test/testfile2:0+134217728,/user/test/testfile2:134217728+96092244... 

134217728 - 128 МБ, который должен быть моим размером блока HDFS. Есть ли способ предотвратить этот раскол? Связано ли это с этим вопросом https://issues.apache.org/jira/browse/HIVE-8630?

Моя Создать таблицу заявление является:

CREATE EXTERNAL TABLE test_data(
    key STRING, 
    body map<string, string> 
) 
PARTITIONED BY (year int, month int, day int) 
ROW FORMAT SERDE 'com.hiveio.io.CustomHiveSerde' 
STORED AS INPUTFORMAT 'com.hiveio.io.CustomHiveInputFormat' 
OUTPUTFORMAT 'com.hiveio.io.CustomHiveOutputFormat' 
LOCATION '/user/test/'; 
+0

Не могли бы вы уточнить, что «моя работа не сработала» - это потому, что ваш разделитель записей не является обычным LF? И, кстати, вы пытались GZip файлы, чтобы сделать их неразделимыми? –

+0

Работа завершается с ошибкой, так как мой входной файл не является разделяемым, а работа по сокращению карты заканчивается неудачей, так как мой входной формат начинает неправильно читать файлы и получает недопустимые данные для значений таблицы hive. Gzipping файлы работают, потому что файлы сжимаются до ~ 20 МБ. Меньшие файлы также распаковываются. Его когда размер файла большой, что работа терпит неудачу. Я не пробовал с файлом gzip> 128 мб. –

+0

- это работа с картой/сокращением заданий на улей? Если это так, таблица также должна иметь объявленный формат ввода, или улей будет использоваться по умолчанию. Нам нужно больше деталей, чтобы ответить на ваш вопрос, в частности, какую работу вы выполняете и как. –

ответ

0

Ok..actually, вы упоминая https://issues.apache.org/jira/browse/HIVE-8630 позвонил. Некоторое время назад мы столкнулись с очень похожей проблемой. Ошибка указывает на то, что CombineHiveInputFormat по-прежнему будет разделять нераспределяемые форматы. CombineHiveInputFormat является по умолчанию HiveInputFormat, и его целью является объединение нескольких небольших файлов для уменьшения накладных расходов. его можно отключить, установив

set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat 

перед запросом, или установить его в качестве XML в улье site.xml, если вы хотите по умолчанию:

<property> 
    <name>hive.input.format</name> 
    <value>org.apache.hadoop.hive.ql.io.HiveInputFormat</value> 
</property> 

Обратите внимание, что вы будете жертвовать особенность Комбинированной части, поэтому, если у вас много маленьких файлов, каждый из них возьмет картограф при обработке ... но это должно сработать, это сработало для нас.

+0

Спасибо @Roberto. Это сработало! Я пытался создать собственный комбинированный формат улья и использовать его. Что-то вроде set hive.input.format = 'com.hiveio.io.CustomCoustomHiveInputFormat' –