[英]Sink component doesn't get the right data with kafka in spring cloud data flow
我不是母語為英語的人,但我盡量表達我的問題。 我遇到了這個困擾了我兩天的問題而且我仍然無法找到解決方案。
我已經構建了一個將在Hadoop YARN中的Spring Can Data Flow中運行的流。
該流由Http源,處理器和文件接收器組成。
1.Http來源
HTTP Source組件有兩個輸出通道與兩個不同的目標綁定,這兩個目標是application.properties中定義的dest1和dest2。
spring.cloud.stream.bindings.output.destination = dest1 spring.cloud.stream.bindings.output2.destination = dest2
下面是HTTP源代碼snipet供您參考..
@Autowired
private EssSource channels; //EssSource is the interface for multiple output channels
##output channel 1:
@RequestMapping(path = "/file", method = POST, consumes = {"text/*", "application/json"})
@ResponseStatus(HttpStatus.ACCEPTED)
public void handleRequest(@RequestBody byte[] body, @RequestHeader(HttpHeaders.CONTENT_TYPE) Object contentType) {
logger.info("enter ... handleRequest1...");
channels.output().send(MessageBuilder.createMessage(body,
new MessageHeaders(Collections.singletonMap(MessageHeaders.CONTENT_TYPE, contentType))));
}
##output channel 2:
@RequestMapping(path = "/test", method = POST, consumes = {"text/*", "application/json"})
@ResponseStatus(HttpStatus.ACCEPTED)
public void handleRequest2(@RequestBody byte[] body, @RequestHeader(HttpHeaders.CONTENT_TYPE) Object contentType) {
logger.info("enter ... handleRequest2...");
channels.output2().send(MessageBuilder.createMessage(body,
new MessageHeaders(Collections.singletonMap(MessageHeaders.CONTENT_TYPE, contentType))));
}
2.處理器
處理器有兩個多輸入通道和兩個輸出通道,用於綁定不同的目的地。 目標綁定在處理器組件項目的application.properties中定義。
//input channel binding
spring.cloud.stream.bindings.input.destination=dest1
spring.cloud.stream.bindings.input2.destination=dest2
//output channel binding
spring.cloud.stream.bindings.output.destination=hdfsSink
spring.cloud.stream.bindings.output2.destination=fileSink
以下是處理器的代碼段。
@Transformer(inputChannel = EssProcessor.INPUT, outputChannel = EssProcessor.OUTPUT)
public Object transform(Message<?> message) {
logger.info("enter ...transform...");
return "processed by transform1";;
}
@Transformer(inputChannel = EssProcessor.INPUT_2, outputChannel = EssProcessor.OUTPUT_2)
public Object transform2(Message<?> message) {
logger.info("enter ... transform2...");
return "processed by transform2";
}
3.文件接收器組件。
我使用Spring的官方fil sink組件。 行家://org.springframework.cloud.stream.app:文件灌入卡夫卡:1.0.0.BUILD-快照
我只是在其applicaiton.properties文件中添加目標綁定。 spring.cloud.stream.bindings.input.destination =文件接收
4.Finding:
我期望的數據流應該是這樣的:
Source.handleRequest() - > Processor.handleRequest()
Source.handleRequest2() - > Processor.handleRequest2() - > Sink.fileWritingMessageHandler();
只應將“由transform2處理”的字符串保存到文件中。
但經過我的測試,數據流實際如下:
Source.handleRequest() - > Processor.handleRequest() - > Sink.fileWritingMessageHandler();
Source.handleRequest2() - > Processor.handleRequest2() - > Sink.fileWritingMessageHandler();
“由transform1處理”和“由transform2處理”字符串都保存到文件中。
5.Question:
雖然Processor.handleRequest()中輸出通道的目標綁定到hdfsSink而不是fileSink,但數據仍然會流向文件Sink。 我無法理解這一點,這不是我想要的。 我只希望來自Processor.handleRequest2()的數據流向文件接收器而不是兩者。 如果我做得不對,有誰可以告訴我該怎么做以及解決方案是什么? 這讓我困惑了2天。
謝謝你的幫助。
亞歷克斯
您的流定義是這樣的(其中'-2'版本是具有多個通道的版本)?
http-source-2 | processor-2 | file-sink
請注意,Spring Cloud Data Flow將覆蓋applications.properties
中定義的目標,這就是為什么即使處理器的spring.cloud.stream.bindings.output.destination
設置為hdfs-sink
,它也會實際匹配file-sink
的輸入file-sink
。
這里解釋了從流定義配置目標的方式(在點擊的上下文中): http : //docs.spring.io/spring-cloud-dataflow/docs/current/reference/htmlsingle/#spring-cloud-dataflow -stream抽頭-DSL
您可以做的是簡單地交換通道1和2的含義 - 使用側通道進行hdfs。 這有點脆弱 - 因為Stream的input
/ output
通道將自動配置,其他通道將通過application.properties
配置 - 在這種情況下,最好通過流定義配置側通道目標或在部署時間 - 請參閱http://docs.spring.io/spring-cloud-dataflow/docs/current/reference/htmlsingle/#_application_properties 。
在我看來,這些也可能是兩個流使用常規組件監聽單獨的端點 - 假設數據應該並排流動。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.