5

Есть ли способ проинструктировать Hive для разделения данных на несколько выходных файлов? Или, возможно, ограничить размер выходных файлов.Улей - разделенные данные по файлам

Я планирую использовать RedShift, который рекомендует разделить данные на несколько файлов, чтобы параллельные загрузки http://docs.aws.amazon.com/redshift/latest/dg/t_splitting-data-files.html

Мы Preprocess все из данных в улье, и мне интересно, если есть способ создать, скажем, 10 1 ГБ, которые могут сделать копирование более красным.

Я смотрел на https://cwiki.apache.org/Hive/adminmanual-configuration.html и https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties, но я не могу найти что-нибудь

ответ

10

Есть несколько способов, вы можете идти о расщеплении выхода улей. Первый и самый простой способ - установить количество редукторов. Поскольку каждый сокращает запись в собственный выходной файл, количество указанных вами редукторов будет соответствовать количеству записанных файлов вывода. Обратите внимание, что некоторые запросы на кусты не приведут к количеству указанных вами редукторов (например, SELECT COUNT(*) FROM some_table всегда приводит к одному редуктору). Чтобы указать количество переходников запустить это до вашего запроса:

set mapred.reduce.tasks=10 

Другой способ можно разделить на несколько выходных файлов будет иметь улей вставить результаты запроса в секционированной таблице. Это приведет к по меньшей мере одному файлу на раздел. Для этого нужно иметь разумный столбец для разделения. Например, вы не захотите разбивать на столбец уникального идентификатора или иметь один файл для каждой записи. Этот подход гарантирует как минимум выходной файл для каждого раздела, и самое большее numPartitions * numReducers. Вот пример (не беспокойтесь о hive.exec.dynamic.partition.mode, его нужно настроить для работы этого запроса).

hive.exec.dynamic.partition.mode=nonstrict 

CREATE TABLE table_to_export_to_redshift (
    id INT, 
    value INT 
) 
PARTITIONED BY (country STRING) 

INSERT OVERWRITE TABLE table_to_export_to_redshift 
PARTITION (country) 
SELECT id, value, country 
FROM some_table 

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

И, наконец, вы можете отказаться от маневра Улей в выводе желаемого количества файлов и просто разбить их отдельно, как только улей будет завершен. По умолчанию Hive сохраняет свои таблицы несжатыми и в текстовом виде в каталоге своего хранилища (например, /apps/hive/warehouse/table_to_export_to_redshift). Вы можете использовать команды оболочки Hadoop, задание MapReduce, Pig или вытаскивать их в Linux и разбить их, как вам нравится.

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

Несколько примечаний: разделение файлов на более мелкие файлы, как правило, плохо для Hadoop. Вы можете получить увеличение скорости для Redshift, но если файлы будут потребляться другими частями экосистемы Hadoop (MapReduce, Hive, Pig и т. Д.), Вы можете увидеть потерю производительности, если файлы слишком малы (хотя 1GB будет в порядке) , Также убедитесь, что дополнительное время обработки/разработчика стоит того времени, которое вы получаете за параллелизацию загрузки данных Redshift.

+0

Awesome, thanks –

+1

В вашем примере нет разбиения на разделы. Команды 'CREATE TABLE' и' INSERT OVERWRITE' должны указывать используемые разделы. – libjack

+0

@libjack Спасибо, что поймали это. Исправлено выше. –

 Смежные вопросы

  • Нет связанных вопросов^_^