本文将为您介绍数据同步速度的影响因素,如何通过调整同步作业的并发配置来达到最大化同步速度,作业限速和不限速的区别,以及自定义资源组的注意事项。

DataWorks数据集成支持任意位置任意网络环境下的任意数据源之间的实时、离线数据互通,是一站式数据同步的全栈平台,并允许您在各种云和本地数据存储中每天复制数十TB的数据。

速度超快的数据传输性能以及400+对异构数据源之间的数据互通是确保您专注于核心大数据问题的关键,您可构建高级分析解决方案并从所有数据获得深入洞察。

数据同步速度的影响因素

影响数据同步速度的因素如下所示。
  • 来源端数据源
    • 数据库的性能:CPU、内存、SSD硬盘、网络和硬盘等。
    • 并发数:如果数据源并发数高,数据库负载便高。
    • 网络:网络的带宽(吞吐量)、网速。一般来说,数据库的性能越好,它可以承载的并发数越高,可为数据同步作业设置更高的并发进行数据的抽取。
  • 数据集成的同步任务配置
    • 传输速度:是否设置任务同步速度上限值。
    • 并发:从源并行读取或并行写入数据存储端的最大线程数。
    • WAIT资源。
    • Bytes的设置:单个线程的Bytes=1048576,在网速比较敏感时,会出现超时现象,建议设置小一些。
    • 查询语句是否建索引。
  • 目的端数据源
    • 性能:CPU、内存、SSD 硬盘、网络和硬盘。
    • 负载:目的数据库负载过高会影响同步任务数据写入效率。
    • 网络:网络的带宽(吞吐量),网速。

数据源端和目的端数据库的性能、负载和网络情况主要由您自己关注和调优,下文将为您重点介绍在数据集成产品中配置同步任务的核心配置。

并发

向导模式通过界面化配置并发数,指定任务所使用的并行度。通过脚本模式配置并发数的示例如下。

"setting": {
      "speed": {
        "concurrent": 10
      }
    }   }

限速

商业化之后,数据集成同步任务默认不限速,任务将在所配置的并发数的限制上以最高能达到的速度进行同步。另一方面,考虑到速度过高可能对数据库造成过大的压力从而影响生产,数据集成同时提供了限速选项,您可以按照实际情况调优配置(建议选择限速之后,最高速度上限不应超过30MB/s)。脚本模式通过如下示例代码配置限速,代表1MB/s的传输带宽。

"setting": {
      "speed": {
         "throttle": true // 限流
        "mbps": 1, // 具体速率值
      }
    }
说明
  • 当throttle设置为false时,表示不限速,则mbps的配置无意义。
  • 流量度量值是数据集成本身的度量值,不代表实际网卡流量。通常情况下,网卡流量往往是通道流量膨胀到1至2倍,实际流量膨胀看具体的数据存储系统传输序列化情况。
  • 半结构化的单个文件没有切分键的概念,多个文件可以设置作业速率上限来提高同步的速度,但作业速率上限和文件的个数有关。例如有n个文件,作业速率上限最多设置为nMB/s,如果设置n+1MB/s还是以nMB/s速度同步,如果设置为n-1MB/s,则以n-1MB/s速度同步。
  • 关系型数据库设置作业速率上限和切分键才能根据作业速率上限将表进行切分,关系型数据库只支持数值型作为切分键,但Oracle数据库支持数值型和字符串类型作为切分键。

数据同步过慢的场景

  • 场景一:同步任务使用公共调度(WAIT)资源时,一直在等待状态。
    • 场景示例

      在DataWorks中对任务进行测试时,出现任务一直等待的状态,或好多测试任务都处于等待状态,而且还提示了系统内部错误。

      例如一个数据同步任务执行完成,共等待了约800s,但是日志显示任务只运行了 18s,使用的是默认资源组,现在运行其他同步任务,也是RDS到MaxCompute,一共几百条数据,一直处于等待中 。

      显示的等待日志如下所示:
      2017-01-03 07:16:54 : State: 2(WAIT) | Total: 0R 0B | Speed: 0R/s 0B/s | Error: 0R 0B | Stage: 0.0%
    • 解决方法

      因为您使用的是公共调度资源,公共资源能力是受限的有很多项目都在使用,不只是单个用户的2-3个任务,任务实际运行10秒,但是延长到800秒,是因为您的任务下发执行时,发现资源不足,需等待获取资源。

      如果对于同步速度和等待时间比较敏感,建议在低峰期配置同步任务,一般晚上零点到3点同步任务比较多,这样可以避开零点到3点的时间段,便可相对减少等待资源的情况。

  • 场景二:

    提高多个任务导入数据到同一张表的同步速度。

    • 场景示例

      想要将多个数据源的表同步到一张表里,所以将同步任务设置成串行任务,但是最后发现同步时间很长。

    • 解决方法

      可以同时启动多个任务,同时往一个数据库进行写入,需注意以下问题:

      • 确保目标数据库负载能力是能够承受,避免不能正常工作。
      • 在配置工作流任务时,可以选择单个任务节点,配置分库分表任务或者在一个工作流中设置多个节点同时执行。
      • 如果任务执行时,出现等待资源(WAIT)情况,可以低峰期配置同步任务,这样任务有较高的执行优先级。
  • 场景三:

    数据同步任务where条件没有索引,导致全表扫描同步变慢。

    • 场景示例

      执行的SQL如下所示:

      select bid,inviter,uid,createTime from `relatives` where createTime>='2016-10-2300:00:00'and reateTime<'2016-10-24 00:00:00';

      从2016-10-25 11:01:24.875开始执行,到2016-10-25 11:11:05.489开始返回结果。同步程序在等待数据库返回SQL查询结果,MaxCompute需等待很久才能执行。

    • 分析原因

      where条件查询时,createTime列没有索引,导致查询全表扫描。

    • 解决方法

      建议where条件使用有索引相关的列,提高性能,索引也可以补充添加。