Oozie почасовой координатор рассчитывает на будущие действия
На 5-минутной отметке каждого часа у меня есть данные за прошедший час, загруженные в hdfs. Я думал, что смогу настроить задание координатора на 10-минутную отметку каждого часа, чтобы обрабатывать эти данные, проверяя, существует ли каталог для этого часа. То, что в итоге происходит, - это то, что координатор будет нормально работать с данными за прошлый час во время представления, продолжит работать нормально в течение следующих 2 часов, а затем будущие действия перейдут от "ожидания" к "тайм-ауту". Я предполагаю, что по умолчанию есть максимальный предел для того, как долго действие может оставаться в "ожидании". Кажется, немного нелогичным, если ограничение времени ожидания применяется ко всем действиям в абсолютном будущем времени. Во всяком случае, вот пример файла координатора.xml. Я ищу какие-либо предложения о том, как создать его таким образом, который имеет больше смысла, или о том, как увеличить время ожидания по умолчанию.
<datasets>
<dataset name="hourly_cl" frequency="${coord:hours(1)}" initial-instance="2016-02-08T11:10Z" timezone="PST">
<uri-template>hdfs://user/tzl/warehouse/incoming/logmessages.log.${YEAR}${MONTH}${DAY}/${HOUR}/</uri-template>
<done-flag></done-flag>
</dataset>
<dataset name="hourly_cl_out" frequency="${coord:hours(1)}" initial-instance="2016-02-05T11:10Z" timezone="PST">
<uri-template>hdfs://user/tzl/warehouse/output/logmessages.log.${YEAR}${MONTH}${DAY}/${HOUR}/</uri-template>
<done-flag></done-flag>
</dataset>
</datasets>
<input-events>
<data-in name="coordInput1" dataset="hourly_cl">
<instance>${coord:current(-1)}</instance>
</data-in>
</input-events>
<output-events>
<data-out name="clout" dataset="hourly_cl_out">
<instance>${coord:current(-1)}</instance>
</data-out>
</output-events>
<action>
<workflow>
<app-path>${appPath}</app-path>
<configuration>
<property>
<name>inputPath</name>
<value>${coord:dataIn('coordInput1')}</value>
</property>
<property>
<name>outputPath</name>
<value>${coord:dataOut('clout')}</value>
</property>
</configuration>
</workflow>
</action>
Также заметил при просмотре журналов, что oozie проверяет КАЖДУЮ МИНУТУ для каждого каталога данных. Другими словами, в 18:01 он проверит эти существующие logmessages.log.20160208 / 18
logmessages.log.20160208 / 19
logmessages.log.20160208 / 20
logmessages.log.20160208 / 21
...
и в 18:02 снова проверит logmessages.log.20160208 / 18
logmessages.log.20160208 / 19
logmessages.log.20160208 / 20
logmessages.log.20160208 / 21
...
Это, вероятно, занимает ненужные циклы процессора. Я предположил, установив частоту на час, это было бы достаточно разумно, чтобы не тратить время на проверку будущих наборов данных, когда я определил экземпляр как данные за прошлый час: current(-1)
1 ответ
Я решил эту проблему с простой настройкой свойств. Представляя это под координатором-приложением
<coordinator-app name="cl_test" frequency="${coord:hours(1)}" start="..." end="..." timezone="PST" xmlns="uri:oozie:coordinator:0.2">
<controls>
<timeout>1440</timeout>
<concurrency>2</concurrency>
<throttle>1</throttle>
</controls>
...
...
</coordinator-app>
В частности, <throttle>
свойство ограничивает количество действий, которые можно перевести в состояние ожидания. Таким образом, установив его на 1, время ожидания применяется только к следующему действию, которое находится в состоянии "ожидания". <timeout>
также изменяет лимит времени ожидания действий, хотя я считаю, <concurrency>
ограничивает количество действий, которые могут быть запущены одновременно.