Apache Beam中普通JDBC和JDBCIO连接器之间的区别?

时间:2019-02-11 16:01:47

标签: jdbc google-cloud-dataflow apache-beam

作为Apache Beam编程模型的初学者,我想知道JDBCjdbcio之间的区别。我开发了一个简单的数据流,该数据流涉及正常的JDBC连接,并且按预期运行。

是否必须在jdbcio上使用JDBC?如果是,那么使用普通的JDBC代码会遇到什么问题?

1 个答案:

答案 0 :(得分:1)

在Beam管道中,有用于读取和写入外部数据源的各种选项。最常见的方法是利用Beam社区构建的内置接收器和源(内置I / O转换)。这些连接器通常会花费大量的开发精力在它们上面,并且已经过生产硬化。例如,BigQueryIO在生产中已经使用了很多年,并且在此期间一直在不断发展。因此,一般建议是尽可能使用标准的水槽和水源。

但是,并非所有与外部数据源的交互都应该通过Sources和Sinks进行,在某些情况下,从DoFn到外部源的手动通信是正确的路径。下面是一些示例(当然还有更多!);

  • 数据源没有接收器/源,或者有源 但它尚不支持您需要的所有开关/模式等。 当然,您始终可以增强现有的接收器/源,或者 不存在从头开始构建新的I / O连接器,如果 将其贡献回社区的可能性很大:)
  • 您正在丰富流传输管道中流动的元素 包含来自大型数据集的一小部分数据。例如,让我们 说您的处理事件来自销售订单,您会 喜欢为每个项目添加信息。物品的信息 家住大型TB商店,但平均而言,您只能访问一个 一小部分数据用作查找关键字。在这个例子中 通过外部调用数据来丰富每个元素的感觉 存储在DoFn中。而不是将所有数据读入 在管道中进行源操作并执行联接操作。

其他注释/提示:

在调用外部系统时,请记住,Apache Beam旨在将工作分配到多个线程中,这会给您的外部数据源带来很大的负担,您通常可以通过使用start&end bundle批注来减轻这种负担。

Java(SDK 2.9.0)

  • DoFn.StartBundle
  • DoFn.FinishBundle

Python(SDK 2.9.0)

  • start_bundle()
  • finish_bundle()