为啥没有 JDBC Spark Streaming 接收器?
Posted
技术标签:
【中文标题】为啥没有 JDBC Spark Streaming 接收器?【英文标题】:Why there is no JDBC Spark Streaming receiver?为什么没有 JDBC Spark Streaming 接收器? 【发布时间】:2019-02-09 11:02:04 【问题描述】:我建议通过批量读取行并使用 Spark Streaming 处理它们来处理巨大的 JDBC 表是一个好主意。这种方法不需要将所有行都读入内存。我想不会监控表中的新行,而只是读取表一次。
我很惊讶没有 JDBC Spark Streaming 接收器实现。实现Receiver 看起来并不难。
您能否描述一下为什么不存在这样的接收器(这种方法是个坏主意吗?)或提供实现的链接。
我找到了Stratio/datasource-receiver。但它会在 Spark Streaming 处理之前读取 DataFrame 中的所有数据。
谢谢!
【问题讨论】:
【参考方案1】:首先,实际的流源需要一个可靠的机制来监控更新,这根本不是 JDBC 接口的一部分,也不是主要 RDBM 的标准化(如果有的话)特性,不是再说其他平台,可以通过JDBC来访问。这意味着从这样的源进行流式传输通常需要使用日志复制或类似设施,并且高度依赖资源。
和你描述的一样
建议通过批量读取行并使用 Spark Streaming 处理它们来处理巨大的 JDBC 表是一个好主意。这种方法不需要将所有行读入内存。我想不会监控表中的新行,而只是读取表一次
真的不是流媒体的用例。流处理无限的数据流,而您所问的只是partitioning 的场景,并且此类功能已经是标准 JDBC 连接器的一部分(按范围或按谓词)。
此外,基于接收器的解决方案根本无法很好地扩展和有效地模拟顺序过程。因此,它们的应用程序相当有限,如果数据是有界的(如果您要在单个节点上顺序读取有限数据,则将 Spark 添加到等式中没有任何价值)。
【讨论】:
【参考方案2】:我认为这不是一个坏主意,因为在某些情况下,您会受到超出您能力范围的限制,例如无法应用 CDC 等策略但仍需将其用作流数据源的遗留系统。
另一方面,Spark Structure Streaming 引擎在微批处理模式下,需要定义一个偏移量,而不是高级,如您所见in this class。因此,如果您的表有一些可以用作偏移量的列,那么您肯定可以从中流式传输,尽管据我所知 RDMDS 不是“流友好型”。
我开发了Jdbc2s,它是 Spark 的 DataSource V1 流式源。如果需要,它也部署到 Maven Central。坐标在文档中。
【讨论】:
以上是关于为啥没有 JDBC Spark Streaming 接收器?的主要内容,如果未能解决你的问题,请参考以下文章
Spark streaming jdbc 在数据到来时读取流 - 数据源 jdbc 不支持流式读取
为啥 Spark Streaming 将每条 Kafka 消息保存为单个文件?
为啥当我发送两个输入流时 Spark Streaming 停止工作?
为啥由于 java.lang.OutOfMemoryError,Spark Streaming 在字符串解码时失败?