Что такое система PDI?

PDI (Pentaho Data Integration) - это ETL сервер, который написан на Java и разрабатывается компанией Pentaho.

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

Идея

Начнем с того, что такое ETL сервер. Прежде всего это сервер, который берет информацию из источника (sourse) , обрабатывает и загружает ее в сток (target). То есть ETL сервер - это посредник, цели у которого - обработать большой поток информации за как можно меньший промежуток времени.

Поток информации в среде PDI представляет из себя таблицу с данными, которая поделена по строкам.

Трансформация

Это логический элемент, в рамках которого можно создавать, изменять потоки информации и загружать потоки информации в целевые стоки (target). За создание потока отвечают шаги в разделе Input, а за целевые стоки - output и, как вариант, шаг “Dummy (do nothing)”. Информация проходит от источника до стока по связям (Hope).

Теперь немного поговорим о движении информации от источника к стоку:

  1. Данные из истока поступают частями. Как бы мы не старались, мы не можем загрузить данные мгновенно и полностью.
  2. Данные могут поступать параллельно друг другу (производится чтение данных из разных источников).
  3. Данные образуют поток информации, для которых требуется обработка.

Теперь вспомним о главной цели ETL сервер: обработка информации за максимально короткий промежуток времени. Как это осуществить - разберем на примерах.

Пример первый

Данные поступают медленно из источника. Как сократить время обработки информации?

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

Второй пример

Данные поступают из двух источников. Как обработать данные за как можно меньший промежуток времени?

Стратегия первая. Выполнять преобразования над потоком данных последовательно. В случае медленного поступления данных из двух разных источников мы увеличим общее время выполнения задачи, так как сначала мы будем обрабатывать медленный поток, потом снова медленный.
Стратегия вторая. Выполнять потоки параллельно. Это более выигрышная стратегия, так как позволяет более полно использовать вычислительные ресурсы. Параллельность может достигаться как на одной машине, так и на разных. Так PDI и поступает.
Распараллеливает выполнение процессов приведем на картинке для трех процессов:

Thee flow

В принципе, можно и явно задать последовательное исполнение процессов внутри трансформации. Это делает шаг “Block this step until steps finish”.

Thee flow wait

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

Осталось разобраться с выполнением операций над потоками.
Можно выделить следующие операции над потоками:

  1. Изменение самого потока:
    • Добавление дополнительных полей.
    • Изменение или переименование заголовков таблицы потока.
  2. Разделение и объединение потока информации.
  3. Прерывание работы над потоками (шаг Abort).

Добавление дополнительных полей
Смысл трансформаций добавить информацию в нужный поток. Сами шаги затрагивают только те поля таблицы потока, которые определенны в шаге и не затрагивают остальные поля потока.
Примером таких шагов являются:

  1. “Set field value to a constant” - добавление константы в поток. Для каждой строки будет добавлено поле с константой.
  2. “Calculator” - добавление вычисляемого поля в потоке. Для каждой строки будет добавлено поле с вычислениями.
  3. “Add sequence” - добавление последовательности чисел в поток.
  4. “Strings cut” - обрезка строковых полей.
  5. “Script” - добавление вычисляемых полей на основе кода Javascript.

Изменение или переименование заголовков таблицы потока
Цель таких шагов заключается в сужении потока или переименовании существующих полей.
Примеры таких шагов:

  1. “Select values” - как вы догадались аналог SELECT оператора из sql. Предназначение оператора изменить поток данных (количество полей, их тип и описание).
  2. “Split Fields” - разбиение поля на два других поля.

Разделение потока информации.
Цель таких шагов - разделить поток информации по строкам. Те строки, которые удовлетворяют условиям пойдут по одному пути, а другие - по другому.
Примеры:

  1. “Filter rows” разбиение потока по строкам, которые удовлетворяют условиям фильтра.
  2. “Java Filter” разбиение потока по строкам на основании работы фильтра, написанного на Java.
  3. “Switch / Case” разбиение потоков информации на основании переключателя Switch - Case.

Разбирать более сложные операции над потоками пока не вижу смысла, так как это лучше показывать на примере. Могу только добавить, что поскольку потоки информации - это таблицы, то к ним применимы все операции с таблицами внутри трансформации.

Задания (Job)

Что такое задание? Ну, по большому счету, это более крупный со стороны пользователя логический элемент работы с информацией, который может включать в себя трансформации. Трансформация - это модуль (аналог библиотеки из программирования) для задания. Задания могут включать и другие задания.
Особенности заданий:

  1. Задания выполняются последовательно! (Если не сказать системе, что задания можно выполнять параллельно).
  2. На основании заданий можно делать циклы (главное задание запускает циклическое выполнение других заданий).
  3. Задания могут обмениваться информацией (через переменные) и сохранять потоки информации между трансформациями.

Задание начинается с шага “Start” и заканчивается шагом “Success” или в случае неуспеха “Abort job”.
Цель заданий - администрирование и обеспечения обработки информации. Проверка доступности данных, получение данных из источников (получение данных по ftp и прочее), отправка писем в случае неправильного завершения шага, запуск последовательностей трансформаций и заданий. Остальное по мере возможностей будем разбирать на примерах.

Ссылки на материалы:

  1. Часть 7. Разработка ETL в PDI (видео)
  2. Spoon User Guide http://wiki.pentaho.com/display/EAI/Spoon+User+Guide
  3. Run Kettle Job for each Row http://type-exit.org/adventures-with-open-source-bi/2010/06/run-kettle-job-for-each-row/