【问题标题】:NiFi forward/duplicate TCP StreamNiFi转发/复制TCP流
【发布时间】:2019-03-11 19:42:01
【问题描述】:

我应该复制一个二进制 TCP 流。

所以我设置了一个 NiFi 1.9.0 服务器,放入一个 ListenTCP 处理器和一个 PutTCP 处理器,配置正确的 IP 和端口并连接它们。

到目前为止一切顺利,数据包已被 ListenTCP 处理器接收并由 PutTCP 处理器转发。

但 NiFi 似乎以某种方式弄乱了数据,发送的数据包与接收的数据包不完全相同。我预计 NiFi 会以 1:1 的比例转发所有内容,但发生了一些事情,我不知道是什么。

我一直在使用 ListenTCP 处理器上的字符集、最大批处理大小和批处理消息删除器设置,以及 PutTCP 处理器上的传出消息删除器和字符集。

我还弄乱了一个 MergeContent 处理器,但没有让它正常工作。

在这里您可以看到接收(红色)和发送数据(使用 tcpflow 捕获)之间的区别。

Link to picture

另一个问题是我真的不知道我正在处理的数据,它在文档中说:

这些日志文件采用名为 ebm.xml 的 XML 文件描述的机器可读二进制格式。

流式事件采用基于 TCP 的二进制格式。

我确实可以访问 ebm.xml 文件,但不确定如何使用它。

有人知道如何让 NiFi 简单地转发所有内容吗? 我是 NiFi 新手,所以我可能错过了一些可能性......

【问题讨论】:

    标签: tcp stream apache-nifi


    【解决方案1】:

    ListenTCP 处理器使用换行符作为逻辑消息分隔符从流中读取数据。例如,如果流有:

    <chunk1><new-line><chunk2><new-line><chunk3><new-line>
    

    这会导致将 chunk1、chunk2 和 chunk3 读取到内部队列中。

    当它写回它们时,它使用传出消息分隔符。所以传出的流文件将是:

    <chunk1><outgoing-delim><chunk2><outgoing-delim><chunk3><outgoing-delim>
    

    不幸的是,它更适合接收文本数据,例如通常以行分隔的日志。块应该作为 byte[] 原封不动地通过,但通常二进制数据不会有这些逻辑换行符边界,所以我不确定它的效果如何。

    【讨论】:

    • 嗯,所以如果我想转发所有未修改的内容,我会在 ListenTCP 和 PutTCP 中选择相同的分隔符,对吗?我还没有找到合适的分隔符,看起来我要创建一个小 Python 脚本。或者是否有任何软件能够增加二进制 TCP 流?也许是卡夫卡?
    • 为了使用 Kafka,您仍然需要将 TCP 流读入某种类型的逻辑消息,然后使用了解 Kafka 协议的生产者将它们写入 Kafka。
    • 这可能可以使用定制的 NiFi 处理器来完成,该处理器将字节直接从接收连接传输到出站连接,但这并不是当前处理器集的真正目标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2011-09-27
    • 2021-05-10
    • 2017-02-01
    • 1970-01-01
    相关资源
    最近更新 更多