2015-10-26 2 views
2

Кто-нибудь знает, существует ли предел для значения sqoop.export.records.per.statement для задания экспорта партии Sqoop?Есть ли предел sqoop.export.records.per.statement для задания экспорта Sqoop?

У меня очень большой размер данных, например 200 000 000 строк данных для экспорта, от Impala до Vertica. Я получу [Vertica][VJDBC](5065) ERROR: Too many ROS containers exist for the following projections, если записи для одного оператора установлены слишком низко или java.lang.OutOfMemoryError: GC overhead limit exceeded, если записи для одного оператора установлены слишком высокими.

Кто-нибудь знает, как исправить эту проблему? Благодаря!

ответ

3

Я думаю, что предел - это память. Если вы увеличите кучу, это позволит вам установить число выше. Попробуйте добавить -D mapred.child.java.opts=-Xmx1024M или какое-то большее количество, чем ваши текущие настройки?

Вы могли бы попытаться увеличить export.statements.per.transaction и сократить количество записей на каждое утверждение. Я думаю, что это не поможет на стороне контейнера ROS, потому что я думаю, что каждая партия SQL = 1 COPY statement = 1 ROS-контейнер. Я не думаю, что он преобразует несколько партий INSERT в единую копию, но у меня нет возможности проверить ее прямо сейчас.

Вы можете обойти sqoop и поток данных (Вы, возможно, потребуется построить COPY), что-то вроде:

impala-shell -k -i server:port -B -q 'select * from mytable' --output_delimiter="|" | vsql -h database_host -U user -w password -c 'copy mytable from stdin direct' 
+1

Спасибо за ваш ответ! Теперь я пытаюсь использовать параметр per.transaction, давайте посмотрим, как это работает. И, кстати, наше текущее решение - прямая копия vsql, но сначала экспортируем в локальный файл, а затем копию vsql из локального файла. Из вашего сценария это означает, что сначала не нужно экспортировать в файл, верно? Благодаря! – yuan0122

+1

Вы также можете использовать 'mkfifo' и записывать его в один процесс и загружать из него в другой. В приведенном выше примере потоки передают данные. Это может быть не 100%, но если вы запустите первую команду, вы увидите точные данные, которые должны быть загружены без верхних или нижних колонтитулов. Если это так, это может быть передано прямо во вторую команду, как я показал выше. Вам, возможно, придется настраивать на основе разделителей и т. Д. – woot

+0

Как вы сказали, per.transaction не работает хорошо для ошибки «слишком много ros-файлов». Тогда я попробую решение COPY. Поскольку он не требует экспорта в файл, это может привести к улучшению времени обработки. Большое спасибо! – yuan0122