04. Refining Hello World (ru)
Оптимизация примера "Здравствуй, Мир!"
Теперь, когда Преобразование проверено в работе, его необходимо оптимизировать для выполнения возлагаемых задач.
Описание
Вот что позволит оптимизировать работу Преобразования:
- Сделать так, чтобы входящий файл мог располагаться не только в каталоге где хранится файл Преобразования. Имя файла также может изменятся, для чего необходимо передавать его в Преобразование как параметр при запуске.
- Проверять наличие входящего файла.
- Название исходящего файла должно зависеть от имени входящего.
Для этого следует использовать алгоритм:
- Получить параметр.
- Создать исходящий файл с приветствием.
- Проверить что параметр равен null; если так, то прервать выполнение.
- Проверить что файл существует; если не так, то прервать выполнение.
Реализовать данный алгоритм можно с помощью Spoon и схемы Задание, организовав Элементы Задания по средствам Переходов. Порядок и путь выполнения Элементов Задания и Переходов происходит согласно результатам выполнения каждого из Элементов. По этому можно говорить о Заданиях, как ориентированных на контроль потоков.
Элементы Задания это составные единицы выполнения функций в рамках отдельного Задания. Каждый Элемент это отдельная законченная функция, диапазон выполняемых функций охватывает задачи от проверки наличия таблиц баз данных до отправки электронных сообщений. Внутри одного Задания есть возможность запускать Преобразования или другие Задания, они тоже будут Элементами Задания.
Переход это графическое представление для указания последовательности выполнения Элементов Задания. Если Переход имеет только один источник и только один приёмник, то Элементы Задания могут иметь любое количество исходящих и входящих Переходов.
Задача данного примера будет выполняться следующим образом:
- Получение входного параметра будет реализовано с помощью Преобразования (1). Оно будет составлено согласно представленной ниже диаграммы:
- Проверка полученного параметра будет производится на основе результата выполнения Преобразования (1). В зависимости от результата будет выбираться следующий Шаг.
- Существование исходящего файла будет проверено специальным Элементом Задания.
- Для выполнения основной функции Задания, создаваемого в рамках данного примера, необходимо изменить Преобразование разработанное в предыдущем примере "Здравствуй, Мир!".
Созданное Задание будет иметь следующий графический вид:
Подготовка окружения
В данной части руководства входящий и исходящий файлы будут размещаться в специально созданном каталоге Files. Каталог необходимо создать и разместить в нём файл list.csv.
Чтобы каждый раз не приходилось указывать полный путь к каталогу с файлами, необходимо создать переменную содержащую его. Для этого следует изменить файл конфигурации kettle.properties, расположенный в C:\Documents and Settings\<username>\.kettle каталога Windows или ~/.kettle каталога в других операционных системах. В конфигурационный файл добавляется строка, с указанием полного пути к содержанию каталога Files:
FILES=C:/Pentaho/Files
или
FILES=/home/PentahoUser/Files
Spoon загружает данные из этого файла при запуске, по этому следует выйти Spoon и запустить его снова.
Всё готово к началу работы над данной частью руководства. Задача будет состоять из:
- Создание Элемента Задания Преобразование 1.
- Изменение Элемента Задания Преобразование 2.
- Конструирование единого Задания из Элементов.
Создание Элемента Преобразование 1
- Создать Преобразование по аналогии с первым примером. Назвать Преобразование get_file_name.
- Переместить Шаги в рабочую область и соединить как показано на диаграмме:
- Get System Info (из категории Input)
- Filter Rows (из категории Flow)
- Abort (из категории Flow)
- Set Variable (из категории Job)
- Настроить Шаги.
- Запустить Преобразование get_file_name.
Настройка Шагов
Настройка Шага Получение системной информации (Get System Info)
Данный Шаг предназначен для получения Преобразованием информации извне, например системной даты или параметров введённых в командную строку. В этом примере он необходим для получения параметра из командной строки. В окне настроек внизу расположены строки, их заполнение создаёт столбцы системных данных в исходящем потоке этого Шага.
- Дважды нажать на Шаг Get System Info.
- Назвать данный Шаг Получить системную информацию.
- В первой строке списка в столбце Name ввести имя получаемого значения my_file.
- Далее нажать на столбец Type, раскроется список с доступными значениями. Выбрать command line argument 1.
- Нажать OK для завершения и принятия настроек для Шага Get System Info.
Настройка Шага Фильтр строк (Filter Rows)
На данном Шаге происходит разделение одного единого потока данных на два, в соответствии с установленными условиями. Строки, значения которых совпадают с условиями, отправляются в первом исходящем потоке, остальные строки, не удовлетворяющие условию, направляются во второй поток.
- Дважды нажать на Шаг Filter Rows.
- Назвать данный Шаг Фильтровать строки.
- Установить условие: в графе field выбрать my_file и заменить = на IS NOT NULL.
- В раскрывающемся списке Send 'true' data to Step выбрать Шаг Set Variable.
- В раскрывающемся списке Send 'false' data to Step выбрать Шаг Abort.
- Нажать OK для завершения и принятия настроек для Шага Filter Rows.
Теперь если значение параметра не равно NULL поток передаётся на Шаг Назначить переменную, в обратном случае на Шаг Прервать преобразование.
Настройка Шага Прерывания (Abort Step)
- Дважды нажать на Шаг Abort Step.
- Назвать данный Шаг Прервать преобразование.
- Больше ничего не требуется настраивать в этом Шаге. Если данные переданы на этот Шаг, Преобразование прерывается и отрицательный результат выполнения передаётся в основное Задание. Нажать OK для завершения и принятия настроек для Шага Abort Step.
Настройка Шага Назначение переменной (Set Variable)
Данный Шаг предназначен для создания переменных из Входящих Полей. В нижней части окна настроек расположен список создаваемых переменных. Каждая графа резервируется для одной переменной.
- Дважды нажать на Шаг Set Variable.
- Назвать данный Шаг Назначить переменную.
- Нажать внизу кнопку Get Fields, единственным доступным Входящим Полем будет my_file. Назначить для него имя переменной Variable name, тоже наименование, но только в верхнем регистре MY_FILE.
- Указать для переменной область действия, в данном примере это JVM. В графе Variable scope type выбрать Valid in the Java Virtual Machine.
- Нажать OK для завершения и принятия настроек для Шага Set Variable.
Проверка выполнения
Для проверки работы полученного Преобразования выбрать Transformation и нажать Run.
- В появившемся окне есть раздел Parameters. В нём в виде списка заносятся параметры передающиеся в Приложения из командной строки. В первой строке в столбце Value ввести list.
- Нажать кнопку Launch.
- В окне журнала необходимо найти следующую строку:
Это означает, что в результате выполнения Преобразования была присвоено значение переменной MY_FILE.
Назначить переменную.0 - Set variable MY_FILE to value [list]
- Повторить запуск Преобразования, но при этом не указывать значение в разделе Parameters. Теперь следует отыскать в журнале строки:
Данный вариант выполнения означает, что параметр не был получен и Преобразование выполнено с ошибкой.
Прервать преобразование.0 - Row nr 1 causing abort : [] Прервать преобразование.0 - Aborting after having seen 1 rows.
Изменение Элемента Преобразование 2
Теперь необходимо добавить в Преобразование hello возможность получения параметров для определения имён файлов. Если параметр будет foo, то данные будут получены из файла foo.csv и записаны в файл foo_with_greetings.xml. Также будет добавлен фильтр для исключения пустых строк получаемых из входящего файла.
Внедрение переменных
- Открыть Преобразование hello.ktr.
- Открыть окно настроек для Шага Получение имён.
- Удалить содержимое графы Filename и нажать Ctrl-Пробел, появится список доступных переменных. В списке присутствует переменная FILES добавленная в kettle.properties. Выбрать её и добавить к ней имя переменной полученной в предыдущем Преобразовании get_file_name. Текст будет иметь вид:
${FILES}/${MY_FILE}.csv
- Нажать OK.
- Открыть окно настроек для Шага Выгрузка списка приветствий.
- Заменить содержимое графы Filename на:
${FILES}/${MY_FILE}_with_greetings.xml
- Нажать OK.
Фильтрация строк
- Перетащить Шаг Filter Rows на линию Перехода между Шагами Получение имён и Создание приветствия (когда линия Перехода изменит свой вид, необходимо отпустить клавишу мыши). Теперь следует одобрить разделения данного перехода новым Шагом.
- Дважды нажать на Шаг Filter Rows.
- Назвать данный Шаг Фильтрация пустых строк.
- В графе field выбрать поле name и назначить условия для выборки IS NOT NULL.
- Оставить графы Send 'true' data to Step и Send 'false' data to Step незаполненными. В результате работы фильтра в исходящем потоке остаются только строки удовлетворяющие условию (строки с заполненными именами).
- Нажать кнопку OK.
- Нажать File и выбрать Save As, сохранить это Преобразование под именем hello_with_parameters.
Запуск
Для проверки произведённых изменений необходимо задать значение переменной MY_FILE. Так как данная переменная создаётся не внутри данного Преобразования, необходимо её задать вручную.
- Перейти в меню Edit, выбрать Set Environment Variables. Откроется окно со списком переменных.
- В нижней части списка расположена переменная MY_FILE, в столбце Value набрать имя файла без расширения.
- Нажать кнопку OK.
- Перейти в меню Transformation и выбрать Run.
- В разделе Variables должны быть созданные переменные. Нажать кнопку Launch для запуска Преобразования.
- Проверьте наименование и содержание получившегося файла.
Конструирование основного Задания
Теперь требуется разработать структуру основного Задания.
- Создать Задание:
- Перейти в меню New, выбрать Job.
- Рабочая область предназначена для размещения Элементов Задания и Переходов между ними.
- Перейти в меню Job, выбрать Settings....
- В открывшемся окне задаются основные свойства Задания. Заполнить графы имя Job name и описание Description. Нажать кнопку OK.
- Перейти в меню File, выбрать Save. Сохранить Задание в каталоге Tutorial под именем hello.
- Построить каркас Задания из Элементов и Переходов. Список доступных Заданий расположен слева от рабочей области. Все Элементы Заданий, как и Шаги Преобразований упорядочены по категориям.
Начнём конструировать Задание:
- Переместим в рабочую область по одному Элементу Задания Start и Success из категории General, два Элемента Transformation из категории General и один Элемент File Exists из категории Conditions, назовём их и соединим Переходами.
- Переместим два Элемента Abort в рабочую область, назовём их и соединим Переходами. Стрелки Переходов должны быть красного цвета.
- Настройка Шага Преобразование 1:
- Дважды нажать на Преобразование (1). Откроется окно настроек.
- В графе Transformation filename указать имя файла Преобразования get_file_name.ktr.
- Так как Преобразования и Задания находятся в одном каталоге следует добавить следующий путь к каталогу:
${Internal.Job.Filename.Directory}/get_file_name.ktr
- Нажать кнопку OK.
- Настройка Шага Преобразование 2:
- Дважды нажать на Преобразование (2). Откроется окно настроек.
- Ввести имя файла для данного преобразования в графе Transformation Filename:
${Internal.Job.Filename.Directory}/hello_with_parameter.ktr
- Нажать кнопку OK.
- Настройка Шага Наличие файла:
- Дважды нажать на Преобразование (2). Откроется окно настроек.
- Поместить в графу Filename путь к файлу наличие которого необходимо проверить. Это имя входящего файла в Преобразование 2:
_Примечание: Напомним переменная ${FILES} была определена в файле kettle.properties, а переменная ${MY_FILE} создана в результате выполнения Элемента Преобразование (1).
${FILES}/${MY_FILE}.csv
- Настройка Шага Прерывание работ (1):
- Задать служебное Сообщение в графе Message.
Имя файла не заданно.
- Задать служебное Сообщение в графе Message.
- Настройка Шага Прерывание работ (2):
- Задать служебное Сообщение в графе Message.
_Примечание: При выполнении имена переменных будут заменены на фактические значения. Например:
Файл ${FILES}/${MY_FILE}.csv отсутствует.
Файл С:/Pentaho/Files/list.csv отсутствует.
- Задать служебное Сообщение в графе Message.
Настройка Переходов
Последовательность выполнения Элементов Задания, может зависеть или не зависеть от результата выполнения Элемента источника Перехода. Путь по которому осуществляется Переход выделяется цветом:
- чёрным цветом, выделяется Переход, который не зависит от результата выполнения Элемента источника;
- зелёным цветом, выделяется Переход, если результат выполнения Элемента источника положительный (без ошибки);
- красным цветом, выделяется Переход, если результат выполнения Элемента источника отрицательный (с ошибокой).
Следует правильно назначить типы Переходов для успешного выполнения создаваемого Задания:
- Преобразование (1) является первым выполняемым в данном Задании (переход из Шага Start чёрного цвета).
- Если Элемент Преобразование (1) не найдёт параметр (т.е. Преобразование выполнено с ошибкой), то контроль (согласно красной стрелке Перехода) передаётся на Элемент Прерывание работ (1).
- Если Элементом Преобразование (1) будет получен параметр (т.е. Преобразование выполнено успешно), то контроль (согласно зелёной стрелке Перехода) передаётся на Элемент Наличие файла.
- Если файл найден не будет (проверка Элементом Наличие файла выполнена неудачно), то контроль (согласно красной стрелке Перехода) передаётся на Элемент Прерывание работ (2).
- Если проверка Элементом Наличие файла будет успешно выполнена, контроль (согласно зелёной стрелке Перехода) будет передан на Элемент Преобразование (2).
- Общий результат успешного выполнения Задания (указан Элементом Выполнение работ) не будет зависеть от результатов выполнения Элемента Преобразование (2).
Для выбора типа условия, необходимо сделать следующее:
- Навести курсор на стрелку Перехода между двумя Элементами.
- Нажать правую клавишу мыши, появится контекстное меню.
- Выбрать раздел Evaluation, и указать одно из доступных условий.
Принципы выполнения
Выполнение Задания напрямую зависит от последовательности выполнения Элементов и руководствуется условиями Переходов. Выполнение происходит последовательно. Выполнение очередного Элемента Задания невозможно пока все предшествующие Задания не будут окончены.
Для реальных задач Задание может служить хорошим инструментом для решения проблем связанных с последовательностью выполнения Преобразований. Так, если необходимо чтобы часть Преобразования была выполнена прежде чем начнётся следующая, одно Преобразование разделяется на два независимых Преобразования, которые последовательно выполняются в рамках одного Задания.
Проверка выполнения Задания
Для проверки выполнения созданного Задания необходимо перейти в меню Transformation и нажать Run.
- В появившемся окне в разделе Arguments в первой строке в графе Value задать значение list (имя исходящего файла без расширения).
- Нажать кнопку Launch.
- Под рабочей областью откроются вкладки содержащие отчёты о выполнении Задания.
На вкладке Job metrics последовательно представлено выполнение каждого из Элементов. В нём отображены только те Элементы, которые фактически были выполнены, если Элемент не был запущен, то его на вкладке нет.
На вкладке Logging содержится журнал выполнения Задания. В нём отображена детальная информация о выполнении каждого Элемента Задания, в том числе время начала и окончания выполнения. Также, если при выполнении Задания было запущено Преобразование, его журнал будет включён в данный журнал. Если для данного примера был создан новый файл, то в последней строке журнала содержится строка:
Spoon - Job has ended.
Также если входящий файл был list.csv, то созданный исходящий файл должен называться list_with_greetings.xml и располагаться в указанном каталоге. Необходимо найти и проверить его.
Теперь введём в качестве параметра имя несуществующего файла и запустим Задание повторно. Выполнение Задания будет прервано и в журнале будет следующие сообщение (где <path_and_file> это имя файла и путь к нему):
Прерывание работ (2) - ERROR : Файл <path_and_file> отсутствует.
Теперь вообще удалим параметры и запустим Задание. В данном случае Задание также будет прервана и в журнале будет запись:
Прерывание работ (1) - ERROR : Имя файла не задано.
Kitchen
Kitchen это средство для запуска Заданий из окна терминала. Скрипт kitchen.bat для Windows и kitchen.sh для остальных операционных систем расположены в каталоге приложения. Если его запустить, то будет выведен список доступных для него ключевых команд с описанием.
Запустить выполнение Задания можно простейшей командой:
kitchen /file <Jobs_path>/Hello.kjb <par> /norep
- /norep команда не включает подключение Spoon к репозитарию.
- /file указывает на имя файла содержащего Задание.
- <Jobs_path> полный путь к каталогу с примером, С:/Pentaho/Tutorial или /home/PentahoUser/Tutorial.
- <par> это тот параметр, который необходимо получить из внешней среды для успешного выполнения Задания. Это будет имя файла без расширения csv.
- Могут быть добавлены и другие ключевые параметры такие как детализация журнала, но в данном случае они используются по-умолчанию.
После запуска команды, Задание будет выполнено аналогично как в Spoon. Но в данном случае журнал выполнения будет выведен в окне терминала, если не будет перенаправлен в текстовой файл. Формат журнала несильно отличается от того, что представлен в графической оболочке Spoon.
Дальше попробуйте запустить Задание без параметра или с неправильным параметром (файл с таким именем отсутствует) и проверьте результат выполнения. Также поэкспериментируйте с Kitchen изменяя варианты представления журналов выполнения.