Есть ли ограничение sqoop.export.records.per.statement для задания Sqoop Export?

Кто-нибудь знает, есть ли ограничение на значение 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, если количество записей на инструкцию слишком велико.

Кто-нибудь знает, как решить эту проблему? Спасибо!


person yuan0122    schedule 26.10.2015    source источник


Ответы (1)


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

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

Вы можете обойти 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'
person woot    schedule 27.10.2015
comment
Спасибо за Ваш ответ! Сейчас я пробую опцию per.transaction, посмотрим, как она работает. И, кстати, наше текущее решение — это прямое копирование vsql, но сначала экспорт в локальный файл, а затем копирование vsql из локального файла. Из вашего сценария это означает, что сначала не нужно экспортировать в файл, я прав? Спасибо! - person yuan0122; 27.10.2015
comment
Вы также можете использовать mkfifo и записывать в него в одном процессе и загружать из него в другом. Пример, который я привел выше, передает данные. Это может быть не 100%, но если вы запустите первую команду, вы должны увидеть точные данные для загрузки без верхних или нижних колонтитулов. Если это так, это можно передать прямо во вторую команду, как я показал выше. Возможно, вам придется настроить на основе разделителей и т. д. - person woot; 27.10.2015
comment
Как вы сказали, per.transaction не сработала из-за ошибки слишком большого количества файлов ros. Тогда я попробую решение COPY. Поскольку нет необходимости экспортировать в файл, это может сократить время обработки. Большое спасибо! - person yuan0122; 27.10.2015
comment
Сначала заставьте его работать в двух частях (экспортируйте данные в файл, используя > output.txt, а затем импортируйте их, используя cat output.txt | vsql.... Выполнение этого по частям облегчит разработку. - person woot; 27.10.2015
comment
Спасибо за ответ. Я тестировал их отдельно, и оба работают нормально. Успешный экспорт в целевой каталог и часть импорта также работают хорошо. Но не вместе. Одна из причин заключается в том, что -o --output_delimiter=| создаст файл с именем --output_delimiter=| в текущий каталог. Вы знаете, как это исправить? Спасибо! - person yuan0122; 28.10.2015
comment
ой. Извините, у меня нет команды, которую я мог бы протестировать, но попробуйте: -o - или полностью удалите ее. Прости за это. - person woot; 28.10.2015
comment
Это очень полезный ответ! - person Kermit; 29.10.2015
comment
@ yuan0122 Не могли бы вы отредактировать ответ относительно -o? Я не уверен, что удаление или использование -o - было правильным методом, и у меня нет возможности проверить его. - person woot; 31.10.2015