HDFS文件接收器输出作为另一个流竞争条件的文件流输入



我正在使用结构化流来评估15节点Spark集群中的特定数据流。我在我的应用程序中定义了两个流式查询:

  • SQ1-从Kaffa读取数据->进程->写入HDFS文件接收器(路径-hdfs://tmp/output)
  • SQ2-从HDFS读取数据作为文件流(与上面的路径相同(->进一步处理->使用ForeachWriter写入外部数据库

这两个查询都设置为每15秒触发一次。

我的问题是,我在这里看到的是一个竞争条件吗,其中SQ2从HDFS中获取部分写入的文件(由SQ1生成(?一个更普遍的问题是,HDFS的文件接收器编写器是"原子的"吗?我试着在Spark中挖掘流媒体源代码,但没有取得多大进展。

这种方法的主要问题是Spark结构化流中的所有文件接收器(如HDFS(只能在append模式下操作。此外,一旦创建了文件,就会立即读取该文件。任何后续的更新或写入的最终确定都将被忽略。

根据这本书";Learning Spark-第二版";关于读取文件

"每个文件都必须以原子形式出现在目录列表中——也就是说,整个文件必须同时可用,并且一旦可用,就不能更新或修改文件">

"[正在写入文件]。。。它只支持追加模式,因为虽然在输出目录中写入新文件很容易(即,将数据追加到目录中(,但很难修改现有的数据文件(正如更新和完整模式所预期的那样(">

为了克服您面临的问题,您可以将流媒体查询更改为以下内容:

  • SQ1-从Kafka读取数据->进程->进一步处理->缓存/持久化
  • SQ2a将缓存的DataFrame写入HDFS文件接收器(路径-hdfs://tmp/output)
  • SQ2b使用ForeachWriter将缓存的DataFrame写入外部数据库->使用ForeachWriter写入外部数据库

最新更新