2017-02-01 6 views
0

Я использую драйвер Impala JDBC для пакетной вставки данных в Impala. У меня в настоящее время размер пакета 1000 и с помощью предложения INSERT INTO VALUES от PreparedStatement для выполнения пакетных запросов. Impala Daemon работает на 3 машинах и сервере каталога Impala, государственный магазин работает на 4-й машине.Пакетная вставка в Impala занимает слишком много времени

Пакетный вставка план запроса на Impala выглядит следующим образом:

Query Timeline: 35s398ms 
    - Query submitted: 0.000ns (0.000ns) 
    - Planning finished: 34s822ms (34s822ms) 
    - Submit for admission: 34s886ms (63.997ms) 
    - Completed admission: 34s886ms (0.000ns) 
    - Ready to start 1 fragment instances: 34s886ms (0.000ns) 
    - All 1 fragment instances started: 34s958ms (71.997ms) 
    - DML data written: 35s082ms (123.996ms) 
    - DML Metastore update finished: 35s286ms (203.993ms) 
    - Request finished: 35s298ms (11.999ms) 
    - Unregister query: 35s374ms (75.997ms) 
- ComputeScanRangeAssignmentTimer: 0.000ns 

Как мы можем видеть, планирования закончил принимает все время. Мы попытались создать в обоих форматах PARQUET, а также нормально. Но каждый раз, когда готовая часть Планирования слишком высока.

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

ответ

1

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

INSERT INTO t VALUES (?, ?); 

вставит два ряда, как

INSERT INTO t VALUES ('a', 1); 
INSERT INTO t VALUES ('b', 2); 

, а не как

INSERT INTO t VALUES ('a', 1), ('b', 2); 

Следующая вещь, чтобы рассмотреть, что вставка одной строки в Hadoop очень неэффективен, поскольку новый файл HDFS должен быть создан для каждой строки.

Выписка из the Impala documentation:

INSERT ... VALUES метод не подходит для загрузки больших объемов данных в таблицы HDFS основе, так как операции вставки не может быть распараллелены, и каждый из них производит отдельный файл данных. Используйте его для настройки таблиц небольших размеров или небольших объемов данных для экспериментов с синтаксисом SQL или с таблицами HBase. Не используйте его для больших заданий ETL или контрольных тестов для операций загрузки. Не запускайте скрипты с тысячами операторов INSERT ... VALUES, которые вставляют одну строку каждый раз. Если вы выполняете операции INSERT ... VALUES для загрузки данных в промежуточную таблицу как один этап в конвейере ETL, добавьте несколько значений строк, если это возможно, в каждом предложении VALUES и используйте отдельную базу данных, чтобы упростить очистку, если операция действительно создает много крошечных файлов.