Проблема с временем выполнения / памятью при копировании таблиц Excel в SQL с помощью Talend

#performance #talend

#Производительность #талант

Вопрос:

Я копирую данные из таблицы Excel в таблицы SQL. На данный момент это около 2000 строк, распределенных по 18 таблицам. Проблема с моей работой в том, что она отнимает слишком много времени. На выполнение этой работы уходит около 2,5 минут.

Другая проблема, с которой я сталкиваюсь, связана с памятью. Я попытался скопировать около 250 000 строк, но не смог запустить задание с базовыми настройками. Я должен увеличить распределение Xms и Xmx.

Вот , y job design

Как мне решить эти проблемы?

Ответ №1:

Вы должны начать свою работу с tMSSQLConnection (я думаю, что это СУБД, которую вы используете), а затем завершить ее с помощью компонента tMSSQLCommit и посмотреть, поможет ли это вообще, поскольку может быть, что Talend открывает большое количество подключений к базе данных, а не объединяет их.

Увеличение размера коммита также поможет ускорить массовые загрузки, но, очевидно, если что-то не удастся зафиксировать, это приведет к потере всего коммита.

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

Иногда использование памяти в задании можно улучшить, разделив процесс на отдельные задания и связав их как дочерние задания в одном большом родительском задании-оболочке с компонентами tRunJob. Это также сделает работу более управляемой.

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

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

Это можно сделать, используя компонент tFilterRow и выбирая только первые x записей (по некоторому условию фильтра, если в наборе данных их нет, вы всегда можете добавить одну, предварительно обработав все, чтобы дать каждой строке a Numeric.Sequence ), обработав ее и поместив в свою таблицу, а затем выбрав следующие x записей ии так далее.

Комментарии:

1. Я использую соединение tMSSql, но не знаю, как использовать фиксацию tMSSql. Порядок расположения таблиц имеет значение, поскольку они зависят друг от друга. Я отредактировал свой вопрос и загрузил новый скриншот. Как вы можете видеть свойство моей таблицы профилей, я думаю, что я открываю новое соединение для каждой моей таблицы. Я прав? Нужно ли мне менять эту часть? Реинжиниринг моей работы — это не то, что я хотел бы делать с этой задачей.

2. Компоненты фиксации обычно используются в сочетании с компонентами отката, чтобы вы могли лучше справляться с неожиданным поведением в своих заданиях, в противном случае Talend автоматически зафиксирует данные в соответствии с вашими выходными компонентами базы данных или в конце задания. Похоже, что вы просто используете одно соединение (при условии, что эти компоненты вывода базы данных используют компонент подключения, а не открывают свое собственное соединение). Я хотел бы знать, почему порядок обрабатываемых таблиц имеет какое-либо значение, потому что для меня это просто похоже на массовое задание ETL.

3. Позже в моей работе я выполняю поиск в базе данных. т.Е. Таблица скопирует некоторые столбцы из листа Excel и некоторые столбцы из уже заполненных таблиц. Это должно удовлетворять ограничениям внешнего ключа. Эти столбцы будут ключевыми столбцами, созданными базой данных.

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

5. Поможет ли использование одного tMap для всех таблиц?

Ответ №2:

Используйте «Опалить запрос вставки» в выводе MSSQL. Убедитесь, что вы используете правильный размер пакета. Партия должна быть МЕНЬШЕ ИЛИ РАВНА: 2000 / column count . Это может ускорить скорость загрузки.

Однако я не уверен в ошибках памяти. Я думаю, что talend пытается считывать входные данные Excel в память целиком, поэтому для увеличения файлов Excel вам нужно больше памяти.

Комментарии:

1. 2000 — это общее количество строк в 18 таблицах. Оно варьируется от 2 до 250. Как мне рассчитать максимально допустимый размер пакета?

2. Я пробовал этот подход, но не вижу никакой существенной разницы во времени выполнения.

3. Моя строка / Сек зависит от количества записей в таблице Excel. Для листа Excel из 10 строк -> 1,25 строки / сек, 500 строк -> 50 строк / сек. Он увеличивается по мере увеличения количества строк в листе Excel. У меня было до 4000 строк в секунду. Я заметил, что для открытия листа Excel требуется время (около 5-6 секунд). У меня есть 17 таблиц для копирования данных, поэтому при каждом запуске задания требуется по крайней мере 17 * 6 = 100 секунд, чтобы просто открыть листы Excel.

4. Если вы видите такую задержку при открытии листов Excel, ваше единственное реальное решение — распараллелить его или просто принять как есть. Если производительность действительно так важна для вас, то вам придется переделать свою работу на два задания и включить многопоточность для первого задания, содержащего начальную загрузку.

5. Проблема была с таблицей Excel. В нем были потайные простыни и простыня с пуговицами, которые делали его размер очень большим. Я удалил их, и теперь это работает очень быстро.