使用 netcat 处理火花流中的日志时,它会删除最后几行



我有一个火花流服务,我正在根据一些离线生成的模型处理和检测异常。我从日志文件将数据馈送到此服务中,该文件使用以下命令进行流式传输

tail -f <logfile>| nc -lk 9999

在这里,Spark 流服务从端口 9999 获取数据。但是,我观察到最后几行被丢弃,即火花流没有收到这些日志行或它们没有被处理。

但是,我还观察到,如果我只是将日志文件作为标准输入而不是尾随它,则不会删除任何行:

nc -q 10 -lk 9999 < logfile

谁能解释为什么会发生这种行为?对于流式传输日志数据以触发流式处理实例的问题,还有什么更好的解决方案?

在 Spark Streaming 中,数据通过线路传入,并在每个块间隔上构成一个块。此块会在其他计算机上复制(根据您的存储级别在形成后立即进行复制。一旦批处理间隔过去,自上次批处理间隔刻度以来形成的每个块都会构成新RDD的一部分。一旦您形成了此RDD,您就可以计划作业,因此在批处理间隔n期间收集的数据将在批处理间隔n+1期间进行处理

因此,"最后丢失一些数据"的罪魁祸首可能是:

  • 在监视 Spark 输入的同时,您正在观察输入文件。如果您考虑即时监控 t ,在批处理间隔过后n,您的日志文件已经生成了 n 个批处理的数据,然后是一些("多一点"(。除了,下一批(n+1(的开始是在数据收集阶段的这个阶段,以接收器上的块的形式出现。没有数据丢失,批处理n+1的处理尚未开始。

  • 或者,应用程序假定它在每个RDD中接收相似数量的元素,并且没有正确处理可能(小得多(的最后一RDD

  • 或者,您要在最后一个批处理间隔过去之前停止应用程序或数据(您需要等待n+1批处理间隔才能看到n批数据的处理(。

  • 或者执行程序的系统时钟发生了一些奇怪的事情。你有没有想过将它们与 ntp 同步?

最新更新