Spark结构化流自定义StateStoreProvide

时间:2018-12-07 17:03:45

标签: java apache-spark spark-structured-streaming

默认情况下,结构化流作业使用HDFSStateStoreProvide。使用HDFS存储的问题在于它不可扩展。 在繁忙时间,当作业从kafka获取更多数据时,由于以下错误,该作业失败:

18/12/06 15:54:35 ERROR scheduler.TaskSetManager: Task 191 in stage 231.0 failed 4 times; aborting job
18/12/06 15:54:35 ERROR streaming.StreamExecution: Query eventQuery [id = 42051afe-b1bc-438d-8143-2d7e5def717c, runId = 6201c769-b115-4b92-bad5-450b8803b88b] terminated with error
org.apache.spark.SparkException: Job aborted due to stage failure: Task 191 in stage 231.0 failed 4 times, most recent failure: Lost task 191.3 in stage 231.0 (TID 24016, sparkstreamingc1n5.host.bo1.csnzoo.com, executor 659): java.io.EOFException
    at java.io.DataInputStream.readInt(DataInputStream.java:392)
    at org.apache.spark.sql.execution.streaming.state.HDFSBackedStateStoreProvider.org$apache$spark$sql$execution$streaming$state$HDFSBackedStateStoreProvider$$readSnapshotFile(HDFSBackedStateStoreProvider.scala:481)
    at org.apache.spark.sql.execution.streaming.state.HDFSBackedStateStoreProvider$$anonfun$org$apache$spark$sql$execution$streaming$state$HDFSBackedStateStoreProvider$$loadMap$1.apply(HDFSBackedStateStoreProvider.scala:359)
    at org.apache.spark.sql.execution.streaming.state.HDFSBackedStateStoreProvider$$anonfun$org$apache$spark$sql$execution$streaming$state$HDFSBackedStateStoreProvider$$loadMap$1.apply(HDFSBackedStateStoreProvider.scala:358)
    at scala.Option.getOrElse(Option.scala:121)
  

如何配置自定义状态存储提供?

出于测试目的,我尝试添加一个伪造的类

--conf spark.sql.streaming.stateStore.providerClass=com.streaming.state.RocksDBStateStoreProvider

但是,即使不存在此类,该工作仍在选择HDFSStateStoreProvider。这是预期的行为吗?

  

我可以使用任何键值数据库编写自定义状态提供程序吗?

或者它仅限于RocksDBCassandra

1 个答案:

答案 0 :(得分:0)

  

如何配置自定义状态存储提供?

您配置自定义状态存储提供程序的方法看起来很正确,但是一旦运行查询就无法更改状态存储提供程序。 (Spark将从检查点的元数据中读取配置。)此限制是有道理的,因为在更改状态存储提供程序时,不能保证恢复状态。

  

我可以使用任何键值数据库编写自定义状态提供程序吗?

一旦您的自定义状态提供程序实现了状态存储提供程序的规范,就没有特定限制。需要考虑两个主要事项:1. Spark将为每个批次检查更改。2. Spark需要状态存储提供程序以特定版本还原状态。您的自定义状态提供程序应具有高性能-因为它将增加每个批次的延迟。

您可能还需要考虑由于自定义状态提供程序而将(传递)依赖项添加到Spark应用程序中。