Использование 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;