Использование языка выражений NiFi

Язык выражений NiFi позволяет управлять значениями атрибутов FlowFile при настройке свойств процессоров.

Язык выражений также может применяться:

Структура языка выражений

Язык выражений NiFi всегда начинается с начального разделителя ${ и заканчивается конечным разделителем }. Между начальным и конечным разделителями находится текст самого выражения. В своей простейшей форме выражение может состоять только из имени атрибута. Например, ${topic.name} вернет значение атрибута названия топика.

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

Вы можете заменить часть значения атрибута, вызвав функцию replace — ${topic.name:replace('1', '2')}. В этом случае мы обращаемся к атрибуту topic.name, а затем меняем часть значения этого атрибута с 1 на 2.

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

Структура вызова функции

Вызов функции состоит из 5 элементов:

  • Разделитель вызовов функций :.

  • Имя функции, в примере выше replace.

  • Открывающая фигурная скобка (.

  • Аргументы функции. Необходимые аргументы зависят от того, какая функция вызывается. В этом примере используются аргументы:

    • 1 — текст, который должен быть заменен;

    • 2 — текст замены.

  • Закрывающая скобка ) указывает на конец вызова функции.

На любой атрибут FlowFile можно ссылаться с помощью языка выражений. Однако, если имя атрибута содержит "специальный символ", имя атрибута необходимо экранировать, заключив его в кавычки. Следующие символы считаются "специальными символами" — $, |, {, }, (, ), [, ], ,, :, ;, /, *, ', пробел, \t, \r, \n.

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

Также существуют некоторые функции. Эти функции вызываются простым вызовом в начале выражения, например, ${hostname()}. Попытка вызвать функцию с субъектом приведет к ошибке.

Иерархия языка выражений

При использовании языка выражений для ссылки на свойство по имени существует определенная иерархия, в которой NiFi будет искать значение.

Текущая иерархия в NiFi выглядит так:

  1. Поиск FlowFile для атрибута/ключа.

  2. Поиск переменных группы процессов для атрибута/ключа.

  3. Поиск файла в реестре файлов для атрибута/ключа.

  4. Поиск свойств JVM NiFi для атрибута/ключа.

  5. Поиск переменных системной среды для атрибута/ключа.

NiFi ищет и возвращает первое вхождение соответствующего свойства. Если подходящее свойство не найдено, возвращается null.

Pедактор языка выражений

Настройка значения свойств процессоров более удобна при использовании редактора языка выражений. Для выражений, начинающихся с ввода ${, редактор выделяет круглые и фигурные скобки, чтобы пользователь мог легко определить, какая открывающая скобка или фигурная скобка соответствует какой закрывающей скобке или фигурной скобке.

Выделение скобок
Выделение скобок
Выделение скобок
Выделение скобок

Редактор также предоставляет контекстно-зависимую справку, предоставляя список всех функций, которые можно использовать в текущей позиции курсора. Для активации этой функции необходимо нажать Ctrl+Space на клавиатуре.

Kонтекстно-зависимая справка
Kонтекстно-зависимая справка
Kонтекстно-зависимая справка
Kонтекстно-зависимая справка

Пользователь также может ввести часть имени функции, а затем нажать Ctrl+Space, чтобы увидеть все функции, которые можно использовать и которые начинаются с того же префикса. Если напечатать в редакторе ${topic:replace и затем нажать Ctrl+Space, появится всплывающее окно со списком функций:

  • replace

  • replaceAll

  • replaceEmpty

  • replaceFirst

  • replaceNull

Быстрый выбор функции
Быстрый выбор функции
Быстрый выбор функции
Быстрый выбор функции

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

Типы данных для языка выражений

Каждое значение субьекта функции, значение аргумента и значение, возвращаемое функцией, имеют определенный тип данных. Тип субьекта функции (Subject Type), тип аргументов (Arguments), если они есть, или тип значения, возвращаемого функцией (Return Type), указаны в описании каждой из функций.

Язык выражений поддерживает четыре различных типа данных:

  • String — последовательность символов, которая может состоять из цифр, букв, пробелов и специальных символов.

  • Number — целое число, состоящее из одной или нескольких цифр (от 0 до 9). При преобразовании в числа из типов данных Date они представляются как количество миллисекунд с полуночи по Гринвичу 1 января 1970 года.

  • Decimal — числовое значение, которое может поддерживать десятичные и более крупные значения с минимальной потерей точности. Точнее, это 64-битная IEEE 754 с плавающей запятой двойной точности.

  • Date — объект, который содержит дату и время. Используя функции Date Manipulation и Type Coercion, этот тип данных можно преобразовать в/из строк и чисел.

  • Boolean — логическое значение, значение которого может быть true или false.

После оценки функций языка выражений все атрибуты сохраняются как тип String.

Использование языка выражений при работе с процессорами

Язык выражений широко используется в интерфейсе NiFi Server для настройки свойств процессора. Не все свойства процессора поддерживают язык выражений. Информация о том, поддерживается ли язык выражений для данного свойства процессора указана в верхней части окна для ввода значения при настройке процессора на вкладке PROPERTIES.

Также при нажатии на иконку info question mark у наименования свойства видно, какая область видимости для языка выражений поддерживается:

  • NONE — язык выражений не поддерживается для этого свойства.

  • VARIABLE_REGISTRY — язык выражений поддерживается для этого свойства на уровне переменных. При этом поиск переменной выполняется иерархически:

    • Переменные определяются на уровне группы процессов, а затем, рекурсивно, до группы процессов более высокого уровня до корневой группы процессов.

    • Переменные, определенные в файлах пользовательских свойств через свойство nifi.variable.registry.properties в файле nifi.properties.

    • Переменные среды, определенные на уровне JVM и свойствах системы.

  • FLOWFILE_ATTRIBUTES — для языка выражений можно использовать атрибуты каждого отдельного файла потока, а также переменные.

Пример ссылки на переменную

Для процессора PublishKafka при настройке свойства Kafka Brokers можно использовать только переменные.

Область видимости для языка выражений
Область видимости для языка выражений
Область видимости для языка выражений
Область видимости для языка выражений

Создав переменную kafka.broker со значением kafka-1.ru-central1.internal:9092, этим значением можно манипулировать, установив при помощи языка выражений также значения kafka-2.ru-central1.internal:9092, kafka-3.ru-central1.internal:9092 и т.д., как описано выше. Выражение для замены части значения переменной выглядит следующим образом:

${kafka.broker:replace('1', '2')}
Указание нескольких значений с заменой части текста
Указание нескольких значений с заменой части текста
Указание нескольких значений с заменой части текста
Указание нескольких значений с заменой части текста
ПРИМЕЧАНИЕ

Замена символов может быть использована при большом количестве брокеров Kafka c именами хостов, отличающихся несколькими символами. При создании новых процессоров, используя замену одного или нескольких символов, можно задавать значение брокеров Kafka без необходимости писать наименование брокера вручную, вносить каждый брокер Kafka в контекст параметров или в качестве переменной.

Пример ссылки на атрибут FlowFile

Далее, настраивая следующее свойство Topic Name для процессора PublishKafka, можно увидеть, что данное свойство разрешает использовать атрибуты FlowFile.

Область видимости для языка выражений
Область видимости для языка выражений
Область видимости для языка выражений
Область видимости для языка выражений

Для данного свойства можно задать значение атрибута FlowFile filename и к нему присоединить значение текущего времени при помощи функции now с применением функции format.

ВНИМАНИЕ

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

  • Для автоматического создания топика необходимо включить параметр auto.create.topics.enable в группе server.properties при конфигурировании сервиса Kafka.

  • Наименование топика может включать буквенно-цифровые символы (в том числе в кодировке ASCII), а также символы ., _ и -. При использовании других символов будет сформирована ошибка и создан бюллетень.

Выражение выглядит следующим образом:

${filename}_${now():format("HH.mm.ss", "GMT+3")}
Наименование файла с применением текущего времени в качестве имени топика
Наименование файла с применением текущего времени в качестве имени топика
Наименование файла с применением текущего времени в качестве имени топика
Наименование файла с применением текущего времени в качестве имени топика

Тогда, если значение атрибута filename в данном FlowFile  — datafile, процессор PublishKafka публикует данные в топике datafile_12.26.14, где 12.26.14 — время публикации топика в формате "HH.mm.ss", в часовом поясе "GMT+3".

ПРИМЕЧАНИЕ

Наименование файла с применением текущего времени в качестве имени топика может быть использовано при необходимости публикации в топики Kafka данных из FlowFile, созданного из часто перезаписываемого локального файла.

Пример значения параметра в контексте параметров

Cвойство Topic Name процессора PublishKafka можно настроить через контекст параметров. Если в контексте параметров создать параметр topic со значением ${filename} и параметр time со значением ${now():format("HH.mm.ss", "GMT+3")}, можно применить созданные параметры в качестве свойства.

Выражение выглядит следующим образом:

#{topic}_#{time}
Наименование файла с применением текущего времени в качестве имени топика
Наименование файла с применением текущего времени в качестве имени топика
Наименование файла с применением текущего времени в качестве имени топика
Наименование файла с применением текущего времени в качестве имени топика

Тогда, если значение атрибута filename в данном FlowFile  — datafile, процессор PublishKafka публикует данные в топике datafile_12.26.14, как и в предыдущем примере.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней