Использование Hive для распространения по редукторам?

Самая расстраивающая часть этой проблемы заключается в том, что очевидным ответом является "исправить исходную таблицу!" - что, к сожалению, я не могу сделать (это управляется и поддерживается другой командой на работе, которая отказывается помочь).

Поэтому я ищу техническое решение для этого без изменения исходной таблицы.

Ситуация такова: у меня есть исходная таблица, и я пытаюсь написать запрос куста для создания новой таблицы. Выполнение запроса занимает много часов, и причина в том, что работа сводится к нулю в одном редукторе.

Когда я прослеживаю исходную таблицу до ее местоположения в hdfs, я замечаю, что есть 1009 файлов деталей. 1008 из них - 0 байтов, а 1 из них - 400 ГБ.

Это объясняет, почему 1 редуктор занимает так много времени, потому что все данные содержатся в одном файле.

Я попытался добавить следующие параметры в попытке разделить работу на несколько редукторов.

set hive.merge.mapfiles=true; 
set hive.merge.mapredfiles=true;
set hive.merge.smallfiles.avgsize=134217728;
set hive.merge.size.per.task=134217728;
set mapred.max.split.size=134217728;
set mapred.min.split.size=134217728;
set hive.exec.reducers.bytes.per.reducer=134217728;

Все попытки заканчиваются тем, что моя новая таблица выглядит точно так же, как исходная таблица, с тоннами 0-байтовых файлов и одним файлом со всеми данными. Я могу контролировать редукторы, которые контролируют общее количество файлов... но я не могу контролировать данные, чтобы результат был равномерно распределен.

Любые идеи о том, как я могу "исправить" мою результирующую таблицу, чтобы равномерно распределенные файлы? Бонус, если я могу исправить это во время процесса запроса, который увеличит нагрузку на мои редукторы и сделает запрос быстрее.

Исходная таблица выглядит так:

CREATE TABLE `source_tbl`(
 `col1` varchar(16)
, `col2` smallint
, `col3` varchar(5),
... many more cols ...
`col20000` int) 
ROW FORMAT SERDE 
'org.apache.hadoop.hive.ql.io.orc.OrcSerde' 
STORED AS INPUTFORMAT 
'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat' 
OUTPUTFORMAT 
'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat' 
LOCATION 
'hdfs://cluster/user/hive/warehouse/schema.db/source_tbl' 
TBLPROPERTIES ( 
'COLUMN_STATS_ACCURATE'='true', 
'numFiles'='1009', 
'numRows'='19187489', 
'rawDataSize'='2972053294998', 
'totalSize'='50796390931', 
'transient_lastDdlTime'='1501859524') 

Мой запрос такой:

create table schema.dest_tbl as select * from schema.source_tbl;

0 ответов

Другие вопросы по тегам