2017-10-29 9 views
1

Luwak Lucene 인덱서를 사용하여 사용자 지정 프로세서를 만들려고하고 있으므로 들어오는 플로우 파일에 대해 쿼리를 실행할 수 있습니다. 내가 알아 내려고하는 것은 Luwak 모니터 (아래 예제 코드) 안에있는 쿼리 인덱스를 업데이트하는 가장 좋은 방법입니다.NiFi - 프로세서에서 Luwak (Lucene) 인덱스를 업데이트하십시오.

편집 - 더 사용 상황에 맞는 업데이트로

, 나는 외부 사용자가// 업데이트를 추가 들어오는 flowfiles에 대해 실행되는 쿼리를 제거 할 수 있도록 의미. 고정 된 쿼리 집합으로 시작하지만 사용자 (들)가 수신 메시지에 대해 실행되는 쿼리를 변경할 수 있도록 허용하려고합니다. 여기에는 실행중인 쿼리를 변경하여 문제가 있습니다.

다른 옵션을 고려해야합니까? 10k 개가있는 경우 쿼리를 업데이트하는 데 약 20 초가 걸리는 것으로 보입니다. 이것은 거의 없지만 재로드/시작 시간은 제가 고려하려고하는 것입니다.

옵션은 나는 생각했다 :

  1. 모든 flowfile상의 UpdateAttribute 업데이트를 사용합니다. 특히 색인을 생성 할 쿼리가 많은 경우 이상적이지 않습니다.
  2. http, AWS SQS 등을 사용하여 우선 순위가 높은 흐름 파일을 보내 업데이트합니다 (다른 소스보다 높음). 끔찍한 것은 아니지만 여전히 옳은 것처럼 보입니다.
  3. 업데이트시 프로세서를 시작/중지하려면 NiFi API를 사용하십시오. 특히 업데이트가 자주 발생하는 경우 업데이트를 수행하는 매우 효율적인 방법으로 보이지 않습니다.

인스턴스화 모니터 : - :

 //Add queries to the monitor 
     for (Map.Entry<String, String> entry : bucketList.entrySet()) { 
      MonitorQuery q = new MonitorQuery(entry.getKey(),entry.getValue()); 
      monitor.update(q); 
     } 
+0

(IMHO) 문제가 명확하지 않습니다. 'UpdateAttribute','AWS SQS','NiFi API on start/stop' 옵션은 어떻게 연관되어 있습니까? – daggett

+0

프로세서가 시작된 다음 수정 될 때 쿼리를로드해야합니까? 변경중인 것은 들어오는 플로우 파일이며, 이는 인덱싱 된 쿼리와 일치합니다. –

+0

@daggett Bryan Bende : 더 많은 컨텍스트를 제공하는 EDIT를 추가했습니다. 우리는 런타임에 적용되는 쿼리를 사용자가 변경할 수 있도록하고 싶습니다. 여기에서 제가 해결해야 할 문제가 있습니다. 그들은 무한정 고정 된 채로 머 무르지 않을 것입니다. – scarpacci

답변

1

이 프로세서는 당신이 주기적으로 배경 타이머 스레드를 시작할 수 시작할 때

Monitor monitor = new Monitor(new LuceneQueryParser("field"), new TermFilteredPresearcher()); 

가 쿼리를 추가 나는 최적화하기 위해 노력하고 무엇 새 모니터를 작성한 다음 프로세서에서 사용중인 모니터를 대체합니다.

AtomicReference<Monitor> monitorHolder = new AtomicReference<Monitor>(); 

그런 다음 @OnScheduled에서 초기 모니터를 구축 할 수 있습니다 홀더에서 설정 :

당신은 아마 같은 프로세서에 멤버 변수를 만들고 싶어한다. 프로세서의 현재 실행에 영향을 미치지 않습니다 백그라운드 스레드는 monitorHolder.set (newMonitor)를 호출 할 수 있습니다에서 그런

Monitor localMonitor = monitorHolder.get(); 

하지만 걸릴 것입니다 : 당신은 항상 먼저 모니터를 얻을 onTrigger에 그런

onTrigger가 다음에 호출 될 때 적용됩니다.

+0

아. 위대한 아이디어 브라이언! 감사. 나는 그것을 시도 할 것이다. – scarpacci

관련 문제