Слиги в Искра - изпълнение

Имам групова работа в Scala/Spark, която динамично създава правила за Drools в зависимост от някакъв вход и след това оценява правилата. Също така имам като вход RDD[T], който съответства на фактите, които трябва да бъдат вмъкнати в системата за правила.

Досега вмъквам фактите един по един и след това задействам всички правила за този факт. Правя това с помощта на rdd.aggregate.

Операторът seqOp се дефинира по следния начин:

/**
 * @param broadcastRules the broadcasted KieBase object containing all rules
 * @param aggregator used to accumulate values when rule matches
 * @param item the fact to run Drools with
 * @tparam T the type of the given item
 * @return the updated aggregator
 */
def seqOp[T: ClassTag](broadcastRules: Broadcast[KieBase])(
  aggregator: MyAggregator,
  item: T) : MyAggregator = {
  val session = broadcastRules.value.newStatelessKieSession
  session.setGlobal("aggregator", aggregator)
  session.execute(CommandFactory.newInsert(item))
  aggregator
}

Ето пример за генерирано правило:

dialect "mvel"
global batch.model.MyAggregator aggregator
rule "1"
 when condition
 then do something on the aggregator
end 

За същата RDD на партидата бяха необходими 20 минути за оценка на 3K правила, но 10 часа за оценка на 10K правила!

Чудя се дали вмъкването на факт по факт е най-добрият подход. По-добре ли е да вмъкнете всички елементи от RDD наведнъж, след което да активирате всички правила? Не ми се струва оптимално, тъй като всички факти ще бъдат в работната памет едновременно.

Виждате ли проблем с горния код?


person Zied Koubaa    schedule 30.05.2018    source източник
comment
Звучи, че вашата работа може да доведе до известна промяна в схемата за разделяне. Има ли правила, които можете да очаквате да бъдат оценени с времена на изпълнение в различни порядъци или повече или по-малко всички правила са подобни?   -  person stefanobaghino    schedule 30.05.2018
comment
Правилата са повече или по-малко подобни. Дадох пример за генерирано правило по-горе   -  person Zied Koubaa    schedule 30.05.2018
comment
Какво ви казва потребителският интерфейс на Spark за това как се разделят данните? Забелязвате ли някакво изкривяване?   -  person stefanobaghino    schedule 30.05.2018
comment
Не, данните са добре разделени между различни изпълнители   -  person Zied Koubaa    schedule 30.05.2018
comment
Забелязвате ли необичайни GC времена?   -  person stefanobaghino    schedule 30.05.2018
comment
Не, всъщност времето за GC е повече или по-малко същото, независимо от продължителността на задачата   -  person Zied Koubaa    schedule 30.05.2018
comment
можеш ли да дадеш репродуцент на проекта си, за да проверя къде правиш грешка?   -  person Prog_G    schedule 31.05.2018


Отговори (1)


Най-накрая разбрах проблема, той беше по-скоро свързан с действието, извършено върху агрегатора, когато дадено правило съвпада, отколкото оценката на правилата.

person Zied Koubaa    schedule 31.05.2018