簡體   English   中英

在Spring雲數據流中,Sink組件無法使用kafka獲取正確的數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM