我建议最好通过批量读取行并使用Spark Streaming处理它们来处理巨大的JDBC表。这种方法不需要将所有行读入内存。我想不监视表中的新行,而只读取表一次。
我很惊讶没有JDBC Spark Streaming接收器实现。实施Receiver看起来并不困难。
您能描述为什么不存在这样的接收器(这种方法不好吗?)或提供实现的链接。
我找到了Stratio/datasource-receiver。但它会先读取DataFrame中的所有数据,然后再通过Spark Streaming进行处理。
谢谢!
答案 0 :(得分:2)
首先,实际的 streaming 源将需要一种可靠的机制来监视更新,这根本不是JDBC接口的一部分,也不是主要RDBM的标准化(如果有的话)功能,而不是提到可以通过JDBC访问的其他平台。这意味着从这样的源流式传输通常需要使用日志复制或类似的工具,并且高度依赖于资源。
与您描述的一样
建议最好通过批量读取行并使用Spark Streaming处理它们来处理巨大的JDBC表。这种方法不需要将所有行读入内存。我想不监视表中的新行,而只需读取表一次
确实不是流的用例。流处理无限的数据流,而您只是作为partitioning的情况而已,而这种功能已经是标准JDBC连接器的一部分(无论是范围还是谓词)。
此外,基于接收器的解决方案无法很好地扩展,无法有效地对顺序过程进行建模。因此,它们的应用程序相当有限,并且如果数据有界,它的吸引力也不会降低(如果您要在单个节点上顺序读取有限的数据,则将Spark添加到等式中没有任何价值)。 / p>
答案 1 :(得分:1)
我认为这不是一个坏主意,因为在某些情况下,您的约束超出了您的能力范围,例如您不能在其中应用策略的传统系统,例如CDC,但仍必须将其用作流数据源。
另一方面,在微批量模式下,Spark Structure Streaming引擎需要定义一个偏移量,该偏移量可以被高级定义,如您所见in this class。因此,尽管据我所知,RDMDS并不是“流友好的”,但如果表中有一些可用作偏移量的列,则可以肯定地从中进行流化。
我开发了Jdbc2s,它是Spark的DataSource V1流源。如果需要,它也已部署到Maven Central。坐标在文档中。