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

ApacheBeam中普通JDBC和JDBCIO连接器之间的区别?,jdbc,google-cloud-dataflow,apache-beam,Jdbc,Google Cloud Dataflow,Apache Beam,作为apachebeam编程模型的初学者,我想知道JDBC和jdbcio之间的区别是什么。我已经开发了一个简单的数据流,它涉及到正常的JDBC连接,并且工作正常 是否必须在JDBC上使用jdbcio?如果是,当我们使用普通的JDBC代码时,我们会遇到什么问题?在Beam管道中,有各种各样的选项用于读取和写入外部数据源。最常用的方法是利用Beam社区(内置I/O转换)构建的内置接收器和源。这些连接器通常会在其上花费大量的开发工作,并经过生产加固。例如,BigQueryIO已在生产中使用多年,并在整

作为apachebeam编程模型的初学者,我想知道
JDBC
jdbcio
之间的区别是什么。我已经开发了一个简单的数据流,它涉及到正常的
JDBC
连接,并且工作正常


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

在Beam管道中,有各种各样的选项用于读取和写入外部数据源。最常用的方法是利用Beam社区(内置I/O转换)构建的内置接收器和源。这些连接器通常会在其上花费大量的开发工作,并经过生产加固。例如,BigQueryIO已在生产中使用多年,并在整个生产过程中不断发展。因此,一般建议是尽可能使用标准的汇和源

然而,并非所有与外部数据源的交互都应该通过源和汇进行,在一些用例中,从DoFn到外部源的手动通信是正确的路径。下面有几个例子(当然还有更多!)

  • 数据源没有接收器/源,或者存在一个源 但它还不支持满足您需求的所有开关/模式等。 当然,您可以始终增强现有的接收器/源,或者 不存在从头构建新的I/O连接器,如果 如果能将此回馈给社区,那将是非常棒的:)
  • 您正在丰富流经流媒体管道的元素 使用大型数据集中的一小部分数据。例如,让我们 如果您的处理事件来自销售订单,您将 希望为每个项目添加信息。项的名称的信息 生活在大型多TB存储中,但平均而言,您只能访问 小部分数据用作查找键。在这个例子中,它使 通过对数据进行外部调用来丰富每个元素 存储在一个DoFn中。而不是将中的所有数据作为 源代码,并在管道内执行联接操作
额外注意事项/提示:

在调用外部系统时,请记住,Apache Beam旨在跨多个线程分发工作,这可能会给外部数据源带来很大的负载,您通常可以通过使用开始和结束包注释来减少此负载

Java(SDK 2.9.0)

  • DoFn.StartBundle
  • DoFn.FinishBundle
Python(SDK 2.9.0)

  • 启动\u bundle()
  • 完成(u bundle)

什么是普通的JDBC?您是在使用JDBC连接读取PCollection,还是在DoFn中使用它来丰富流经管道的元素?@RezaRokni我在DoFn中使用JDBC。基本上,我想了解使用jdbcio优于jdbc的优势。如果我在DoFn中使用普通的旧jdbc代码,我面临的挑战是什么?@RuiWang,我刚才在本文中将普通java jdbc代码称为普通jdbc。在DoFn中,您是否在调用中使用了数据元素的属性?例如,使用谓词调用db,该谓词使用元素的一个属性。您是否打算将其用于流式处理或批处理?非常感谢您提供的这条重要信息。我尝试为流式作业实现DoFn.startbundle概念。但当我用1亿条数据记录来执行任务时。它旋转到56个工作节点,因此我不得不停止作业。是否有任何方法可以优化startbundle中的数据库连接,以使其性能有效,而不是使用jdbcio连接器。该博客有点过时,但应该仍然有用:寻找以下调用外部服务的模式以丰富数据。如果你能问这是一个新问题,我会尽量争取时间给出最新的答案。。