Использование переменных соединений с БД в разных идентичных заданиях / преобразованиях чайника - PullRequest
0 голосов
/ 19 октября 2018

Я прочитал здесь много связанных тем, но, похоже, не нашел решения.Вот мой сценарий:

  • У меня есть несколько идентичных клиентских баз данных
  • Я использую ETL для заполнения специальных таблиц в этих базах данных, чтобы использовать их в качестве источника для отчетов PowerBI
  • Вместо того, чтобы копировать (и, следовательно, поддерживать) ETL для каждого клиента, я хочу динамически передавать соединение БД в задания / преобразования

Я планирую создать текстовый файл соединений БД для каждогоКлиент:

cust1, HOST_NAME, DATABASE_NAME, USER_NAME, PASSWORD cust2, HOST_NAME, DATABASE_NAME, USER_NAME, PASSWORD и т. Д. ...

Хост останется неизменным всегда.

Задания будут запускаться ежемесячно с использованием кухни Pentaho в коробке linux.

Поэтому, когда я запускаю задание для конкретного клиента, я хочу указать заданию использовать соединение с БД для этого конкретного заказчика, т.е.Cust2.из файла подключения.

Любая помощь очень ценится.Привет и спасибо, Хейко

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Используйте параметры!

Когда вы определяете соединение, вы видите маленький знак S в синем ромбе справа от поля ввода Database Name.Это означает, что вместо написания имени базы данных вы можете ввести параметр.

Когда вы это делаете в первый раз, это немного сложно.Так что следуйте процедуре шаг за шагом, даже если у вас возникнет желание сразу запустить ./kitchen.sh, который читает файл, содержащий строку для каждого клиента.

1) Параметризовать преобразование. Щелкните правой кнопкой мыши в любом месте, выберите Properties, затем Parameters, заполните таблицу:

  • Row1: Col1 (параметр) = HOST_NAME, Col2 (значение по умолчанию) = имя хоста для Cust1
  • Row2: Col1 = DATABASE_NAME, Col2 = имя базы данных для Cust1
  • Row3: Col1 = PORT_NUMBER, Col2 = имя базы данных для Cust1
  • Row4: Col1 = USER_NAME, Col2= имя базы данных для Cust1
  • Row5: Col1 = PASSWORD, Col2 = имя базы данных для Cust1

Затем перейдите к определению Database connection (На левой панели, вкладка View) и на панели настроек:

  • Имя хоста: $ {HOST_NAME} - имя переменной с «$ {» до и «$» после
  • Имя базы данных:$ {DATABASE_NAME} - не вводите имя, нажмите Crtl + SPACE
  • Номер порта: $ {PORT_NUMBER}
  • Имя базы данных: $ {USER_NAME}
  • Имя базы данных: $ {PASSWORD}

Проверьте соединение.Если это действительно так, попробуйте выполнить тестовый прогон.

2.Проверьте параметры. Когда вы нажимаете кнопку run, Spoon запрашивает какое-то значение Run option (Если вы в прошлом отмечали «Больше не показывать меня», используйте раскрывающийся список рядом с Run menu).

Измените значения параметров для Cust2.И проверьте, работает ли он для другого клиента.

Измените его в столбце Value и столбце Default value.Вскоре вы поймете разницу, на данный момент проверьте, работает ли она с обоими.

3.Проверьте это в командной строке. Используйте pan из командной строки .
Синтаксис должен выглядеть следующим образом:

./pan.sh -file=your_transfo.ktr -param=HOST_NAME:cust3_host -param=DATABASE_NAME:cust3_db....

На этом этапеу вас есть небольшое количество проб и ошибок, потому что синтаксис между = и : заметно варьируется в зависимости от ОС и версии PDI.Но вы должны пройти 4-6 испытаний.

4.Выполните задание В соответствии с парадигмой параллельных вычислений PDI, вы не можете использовать шаг Set variable в одном преобразовании.Вам нужно выполнить задание с двумя преобразованиями: первое читает файл csv и определяет переменные с шагом Set variable.Второе - преобразование, которое вы только что разработали и протестировали.

Не ожидайте, что оно будет запущено в первом испытании.Некоторые версии PDI содержат ошибки и требуют, например, очистки значения по умолчанию параметров в преобразовании.Вам помогает шаг Write to log, который запишет поле в журнал вызывающего задания.Конечно, вам нужно сначала поместить параметры / переменные в поле с шагом Get variable.

В частности, не начинать с полного списка клиентов! Настроить системус 2-3 клиентами раньше.

Напишите полный список клиентов в вашем CSV и запустите.

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

5.Установите задание

В принципе, это всего лишь ./kitchen.sh.

Однако, если вы хотите автоматизировать загрузку, вам будет сложно проверить, что ничего не пошлонеправильно.Поэтому откройте преобразование и используйте System date (fixed) шага Get System Info и запишите результат с данными клиента.В качестве альтернативы вы можете получить эту дату в основном задании и передать ее вместе с другими переменными.

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

0 голосов
/ 19 октября 2018

Я ежедневно запускаю подобный сценарий в своей работе.Мы используем пакетные файлы с именованными параметрами для каждого клиента. Таким образом, у нас есть один и тот же пакет KJB / KTR, который выполняется для другого клиента на основе этих параметров полностью.

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

Что касается вашего вопроса напрямую, на вкладке создания соединения вы можете использовать эти переменные в Host и DBname.Лично у нас есть один и тот же пользователь / pw, установленный на каждой клиентской БД, поэтому нам не нужно изменять их или передавать пользователя / pw в качестве переменных для каждого соединения, мы только отправляем имя хоста и базу данных с Именованными параметрами .У нас также есть фиксированный запланированный запуск, который выполняет подпрограмму для каждой базы данных, для этого мы используем тип «JOB для выполнения каждой входной строки».enter image description here

...