【问题标题】:Difference between normal JDBC and JDBCIO connector in apache Beam?apache Beam中普通JDBC和JDBCIO连接器的区别?
【发布时间】:2019-02-18 09:11:10
【问题描述】:

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

是否必须使用jdbcio 而不是JDBC?如果是,我们在使用普通的JDBC 代码时会遇到哪些问题?

【问题讨论】:

  • 什么是正常的 JDBC?
  • 您是在使用 JDBC 连接读取 PCollection,还是在 DoFn 中使用它来丰富流经管道的元素?
  • @RezaRokni 我在 DoFn 中使用 jdbc。基本上我想了解使用 jdbcio 优于 jdbc 的优势。如果我在 DoFn 中使用普通的旧 jdbc 代码,我面临的挑战是什么?
  • @RuiWang,在这种情况下,我只是将纯 java jdbc 代码称为普通 jdbc。
  • 在您的 DoFn 中,您是否在调用中使用数据元素的属性?例如,使用使用元素属性之一的谓词调用数据库。您还打算将其用于流式处理或批处理吗?

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


【解决方案1】:

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

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

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

额外说明/提示:

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

Java (SDK 2.9.0)

  • DoFn.StartBundle
  • DoFn.FinishBundle

Python (SDK 2.9.0)

  • start_bundle()
  • finish_bundle()

【讨论】:

  • 非常感谢您提供这条重要信息。我尝试为流式作业实现 DoFn.startbundle 概念。但是当我使用 1 亿条数据记录运行这项工作时。它正在旋转多达 56 个工作节点,因此我不得不停止这项工作。有什么方法可以优化 startbundle 内部的数据库连接,使其性能有效,而不是使用 jdbcio 连接器。
  • 博客有点过时了,但应该仍然有用:cloud.google.com/blog/products/gcp/… 寻找以下模式调用外部服务来丰富数据。如果你能问这是一个新问题,我会尽量抽出时间给出更新的答案..
猜你喜欢
  • 1970-01-01
  • 2012-03-17
  • 2017-08-31
  • 1970-01-01
  • 2020-12-22
  • 2012-04-01
  • 1970-01-01
  • 2021-04-13
  • 2018-05-22
相关资源
最近更新 更多