4. 常见问题
Frequently Asked Questions
系统配置过程中与运行过程中的常见问题分析与解释。
Docker安装的集群部署方式?
DataPipeline 产品是采用docker容器的部署方式,支持docker集群;单机是docker compose部署,集群是docker swarm部署。
DataPipeline的并发任务是线程还是进程?
线程。源端一个任务是一个source task,用线程池做并发,目的端一个任务是多个独立的sink task,每个sink task是一个线程。运行环境支持分布式部署,根据需要起一个或者多个source worker和sink worker实例,每个实例是独立的jvm进程,运行在容器里。sink端用多个consumer提升消费性能,kafka connect本身提供了这种并行能力,所以就不需要自己做线程池了。source端如果做成独立的task,task之间的协调需要额外的通信,否则简单hash分配的话容易不均衡,所以是一个任务一个source task。
生产环境配置推荐及回答?
一个32G节点是30个任务上限;
生产环境建议Kafka使用至少两个副本;
实际吞吐量受到上下游多重因素影响,我们只能给出的是Kafka的理论值,也就是平台的理论吞吐上限;
多节点的主要优势在于高可用和同时运行的任务数多。
一般项目使用上DataPipeline的服务是统一管理还是私有化部署?若是私有化部署若要升级怎么操作?
DataPipeline是私有化部署产品,升级操作可以参考最新版本的产品文档中部署相关部分。
DataPipeline的Kafka如果与客户目前使用的Kafka版本不一样,是否需要适配?
DataPipeline的Kafka作为消息系列缓存在系统内部使用,与您使用的Kafka节点没有关联关系,不需要适配。
在从节点上装MySQL,对单表导入1000万数据对任务有影响吗?
在使用DataPipeline的集群上,从节点安装数据库会占用cpu、内存、磁盘、IO等资源,如果数据量比较大的情况下,最好单独找一台服务器装,以便不会对任务的性能造成影响。
数据源多个表是否可以写到目的地一张表?
允许单个或多个任务的多张表往一个数据目的地表同步数据,但要求同步的表与 目的地表结构一致。
多个表表结构一致时,要求每个表的主键值不同,否同时同步多张表到同一个目的表会发生「主键冲突」现象,多条主键相同数据会保留最后一条。
若多个表结构不一致,如结构不一致问题属于结构变化策略处理范围,则会根据策略执行。
数据节点连接失败怎么办?
检查节点连接信息是否填写正确;
检查本地网络是否可以ping通节点地址;
检查节点端口是否开启;
检查SSL、Kerberos等认证信息是否需要更新。
DataPipeline如何应对Mysql数据库表和字段名称大小写不敏感问题?
您可在数据映射中修改MySQL目的地建表表名与字段名。
数据源Mysql的实时处理模式下,暂时无法读取哪些字段类型?
Mysql 的实时处理模式下,暂时无法读取字段类型为 GEOMETRY 的数据,具体请参照下表,如果存在对应类型的数据,请选择定时模式进行同步。GEOMETRY字段 POINT LINESTRING POLYGON GEOMETRY MULTIPOINT MULTILINESTRING MULTIPOLYGON GEOMETRYCOLLECTION
Mysql数据源实时处理模式下,暂不支持哪些语句操作的同步?
Mysql实时处理模式下,暂不支持下列语句:
TRUNCATE语句不会同步删除目的地数据
MySql级联删除不会删除目的地数据
Mysql级联更新不会更新目的地数据
Oracle实时模式为LogMiner时,为什么还需要设置读取频率?
当数据源为Oracle时,LogMiner实时读取模式会采用定时查询方式读取增量,所以需要用户去设置一定的读取频率,用户设置读取频率越大相对来说数据延迟性也就越大,但读取频率过小时,会对系统造成一定的压力,因此,需要用户根据实际情况设置相对合理的读取频率,目前DataPipeline会默认读取频率为60秒。
SQL Server数据源读取方式选择Change Tracking时需要注意什么?
您需要启动Change Tracking, 查看官方参考文档 。
请在同步前开启同步表的Change Columns Updates,若您未主动开启,系统会自动开启。
请确保在选择同步表时选择存在主键的表,Change Tracking的读取方式需要基于主键捕获数据更新,若不存在主键,将无法被选择。
SQL Server实时模式为Change Tracking时,为什么还需要设置读取频率?
当数据源为SQL Server时,Change Tracking实时读取模式会采用定时查询方式读取增量,所以需要用户去设置一定的读取频率,用户设置读取频率越大相对来说数据延迟性也就越大,但读取频率过小时,会对系统造成一定的压力,因此,需要用户根据实际情况设置相对合理的读取频率,目前DataPipeline会默认读取频率为60秒。
时区问题需要注意什么?
当MySQL源端有字段为timestamp,字段值为0000-00-00 00:00:00,无法同步到MySQL目的地,需要用户在清洗脚本中进行数据时区的转换。 目前DataPipeline读取源端表结构时会默认将0000-00-00 00:00:00转换成1970-01-01 00:00:00.000000000 +00:00 但是1970-01-01 00:00:00.000000000 +00:00是世界时区,需要用户根据实际的需求使用清洗脚本进行清洗,
如:转换成中国时区。
行级的物理删除,使用Change Tracking的方式,是否获取的到?DataPipeline会如何处理这类的数据?
当已同步的数据在数据源被删除(需要同步表存在主键,否则无法获取数据源数据删除信息),DataPipeline提供三种方式:
同步,删除目的地数据;
忽略,保留目的地数据;
同步,保留增量数据,并按照merge模式处理。
选择merge模式处理,需要在写入设置完成以下步骤: 各个同步表开启高级清洗。 在脚本库中选择「DML.java」脚本库。 在目的地表结构增加「dml」新字段,用于标识:insert、update、delete
MySQL增量数据同步任务可以同步视图吗?
Binlog读取模式无法同步视图,JDBC读取模式可以同步视图。
各种类型的数据源同步数据到TIDB目的地时,需要注意哪些事项?
首先,系统验证TIDB不同级别的权限,因此需要验证mysql.db/mysql.user/mysql.table_privs三张表的SELECT权限。 其次,用户需要确认TIDB的同步表是否有SELECT权限,如果TIDB里表没有SELECT权限的话,同步表时,系统无法检测到重名的表,无权限的表同步到目的地会导致任务报错,因此用户在使用TIDB目的地同步表时要保证目的地的表具有SELECT权限才可以。
Redshift并发数设置是50,DataPipeline对100个表并发插入的方案?对Redshift性能的影响?DataPipeline对大数据量并发插入Redshift的处理方式?
DataPipeline会根据Redshift的最优的性能来设置Redshift的并发数,没有一个固定值50个并发同时写就是最优的写入方案。
我们可以进行100张表的并发写入,单高并发对DataPipeline服务器内存、磁盘有很大的消耗,根据测试环境配置并发数量。
DataPipeline是通过Redshift 客户端写入到Redshift,大量并发的情况下会影响性能,所以在测试时需要根据源端、目的地端配置及性能对写入并发进行设置。
DataPipeline先将数据写成文件,当文件到一定size的时候load到Redshift。
kafka目的地支持设置新的分区吗?
目前DataPipeline同步数据到Kafka,都是要求用户自己在Kafka目的地设置好Topic和Partition等分区逻辑。默认用的是round robin,也就是用户如果定义了10个分区,数据会均匀写入。目前暂不支持往新的Topic里面写。
多个表结构不一致的表,可以同步至kafka的同一个topic吗?
目前在DataPipeline中,如果在一个数据任务中,同步多个表结构不一致的表,到kafka目的地的一个topic中,会出现数据源变化错误,导致任务无法正常运行。 该情况有两种解决方案:
创建多个任务,每个任务包含一个将要同步的表,目的地可以是相同的kafka topic,任务会正常运行。
任务设置中读取频率的实现原理是什么样的?
DataPipeline定时频率需要指定定时时间间隔,从上一个次执行读取数据开始计时,当本次执行完成读写后才会开启下次执行。如,设置定时频率为60分钟,从1点钟开始执行任务,如果60分钟内完成了读写,则2点会开始执行下一次的读写,若没有在60分钟内完成读写,则系统会等待写入完成后才开始执行下一次,也就是系统无法按照60分钟的读取频率来实现批次读取。
采用增量同步的情况,新建同步任务时,源端的数据表有大量的存量数据,如何通过产品实现数据同步的一致性的?
如数据源增量数据获取方式为日志获取,则在任务配置中,选择开启全量初始化,并在全量初始化配置中选择清空数据目的地数据,在增量数据同步之前,会先同步全量数据,保证数据一致性。
如增量数据获取方式为增量识别字段方式,则需要您在数据映射-读取限制配置中仅设置增量识别字段限制,任务运行时,会先同步全量数据,全量数据同步完毕后会按照增量识别字段进行增量同步,保证数据一致性。
数据源端基于日志的实时模式,是源库推送还是我们做捕获?
Oracle(归档日志)、MS SQL Server(Change Tracking)是通过扫描的方式,DataPipeline主动去捕获日志信息;Mysql(binlog)、PostgreSQL(wal2json)是通过源库自带的日志机制进行主动推送;
关系型数据库,如MySQL,如果出现大量的数据修改,BinLog日志如何抓取,如何实现及时的消费?
如果大数据量会出现数据堆积的状况,消化就有一定的延迟,但是只要binlog日志不被删除,消费速度比读取速度快的话就会追上数据。
读取与写入的速率限制是按照任务还是按照表?
目前DataPipeline是按照并发进行限制的,也就是按照表做限制,每一张表的读取和写入速率不会超过用户设置的速率。
读取与写入的速率限制原理是?
速率在任务执行过程中是一个平均指标,即限制单位时间内读取或写入数据的数据量即可以理解为对平均速率的限制,故数据节点读取或写入速率可能会超过平均值,但从任务整体执行的周期内,一般情况下,不会增加数据节点负载。
我们的无侵入性是如何实现的?是完全无侵入性,还是侵入性很小?是否无侵入性就意味着源端服务器没有访问请求的压力,那目的端写入是否还存在压力?
DataPipeline 对源侵入性是指无需在数据源端去按照Agent进行实时数据读取,DataPipeline采用的方式都是基于数据库本身自带的能力来实现的,如:MySQL用的是binlog;Oracle用的logminer;sql server 用的 change tracking 的方式;但对于Oracle节点的读取,我们推荐使用Agent模式进行读取,可以使用相对小的源端服务器资源换取成倍的同步速率增长。
动态限速的策略是什么?
根据配置的缓存大小,当估算堆积数据 (所有数据- 已消费数据) 的数据量大于总缓存的90%(可以后台配置) 则会停止读取。根据配置的检查时间间隔,直到下一次检查时间,重新计算是否允许读取。
估算方式:单条数据大小 = [过去数据的平均字节数(已读取的数据占比/已读取的数据量)+ 140字节]*安全系数 (安全系数:也是根据占用的缓存比例计算,剩余缓存比例越小,安全系数越大)
安全系数的计算方式:占用的缓存比例在0 - 70%之间 ,固定是环境变量配置的值,默认1.5;超过70%之后,1.5 + (已占用的缓存比例 - 固定70%) * 2
如果任务激活后进行重新同步,目的地数据会清空吗?
目前用户在选择表进行重新同步时,支持用户去选择是否要清理目标表的数据, 如果选择清理目标表的数据,则点击重新同步,目的地数据将被会清空后重新导入。
如果选择不清理目标表的数据,则点击重新同步,目的地数据将被不会被清空,目的地按主键去重,若无主键则会存在重复数据。
如何设置数据读取条件where语句?有哪些注意事项?
若用户设置了where语句,DataPipeline向数据源读取数据时会执行数据读取条件,在读取端直接过滤部分数据;
请根据数据源类型输入相对应的 SQL 语句作为数据读取条件。
一个数据表映射只能设置一个where语句,where语句中可以包含多个字段的条件。
当使用where语句设置增量识别字段作为增量数据获取手段时,数据任务第一次运行将会同步全量数据,全量数据同步完成后,会根据增量识别字段判断数据增量,进行同步。
暂停运行中的数据任务,修改映射,取消表后又新加入此表,DataPipeline对于此表的处理策略是什么样的?
激活任务时,将按照新增映射处理,按照当前任务执行配置,重新同步该表。
表结构中的精度和标度是什么意思?
精度与标度在不同数据节点中的表述方式不同。
MySQL节点,精度:Length ,标度:Decimals
Oracle节点,精度:Size ,标度:Scale
MS SQL Sever节点,精度:Size ,标度:Scale
PostgreSQL节点,精度:Length ,标度:Decimals
数据源端支持哪些字符集类型?
数据源读取使用jdbc driver,除非要进行手动编码转换,一般不需要特别关注数据库的字符集类型。写入方面,目前产品尚不支持定义表字符集,采用库默认字符集。如果出现字符范围不匹配,有可能出现乱码。如果源库和目标库的默认编码一致,不会出现这个问题。
选择增量识别为主键,如何保证源端和目标的数据一致性呢,如果该记录有修改,系统是怎么处理的?
增量识别字段应为自增字段或时间戳类型,这样我们可以通过增量字段来判断哪些数据进行了变更,一般update数据不会更新主键,所以不建议用主键做自增字段。
数据目的地ODS有大量无主键表,同步时DataPipeline是如何处理的?
在数据映射中,需要您指定该目的地表主键,如无法指定已有表主键,则无法进行增量数据同步。
DataPipeline是否支持将不同的数据表(在不同的数据库中,但是表结构一致,同时有主键和唯一性识别的字段),导入同一个目的端表?
DataPipeline支持同步表结构相同的表到目的地,但是数据源表的主键不能重复,否则数据会被覆盖。如果有唯一性识别字段,可以把这唯一性设置为新的主键,避免出现主键冲突的问题。
哪些数据错误会进入错误队列?
您可以根据数据的错误类型名称和具体的错误信息来了解导致进入错误队列的原因,例如:
「RULE_ERROR」,当您看到这个错误,就代表着数据内容因为无法匹配清洗规则而进入了错误队列。
例如,当您设置了「Column > 0」的过滤规则,而数据源「Column」字段值为NULL,平台无法进行过滤,导致了这些所有值为NULL的数据进入错误队列。
具体的清洗规则规范您可以点击查看数据清洗。
其他类型的错误您可以具体查看下方的错误信息详情来定位具体的错误来源,如果您对这些信息存在疑问,欢迎联系我们的技术团队帮您定位问题。
错误队列里的原始数据是指源端读取的原始数据还是说经过清洗规则后的数据?
目前DataPipeline支持的错误队列里的原始数据是指清洗之前读取的原数据。当用户设置了清洗脚本时,但进入了错误队列的数据是指没有清洗过的原始数据。
部分表已读取已写入等都为0,但完成进度为100%?
这是由于这部分表为空表,已读取和已写入等数据反应了数据表真实情况。我们默认把空表视作已完成全量,若您的任务选择了同步增量数据,则后续有新增数据时,这些数据将会实时更新。
任务详情页中的数据读写量具体含义是?为什么有时候还会减少?
已读取数据量是指数据任务被激活后系统从数据源读取的数据量:
当数据任务由于断点续传机制重新读取已读取的数据时不会重新记录到已读取数据量中,只有该数据被更新时会算作新的数据来记录到已读取数据量中。
已写入数据量是指系统读取数据后已经被处理的数据量:
所以已写入数据量不仅仅包括已同步到目的地的数据,还包括错误队列的数据和用户要求过滤的数据。已写入数据量也遵循当数据任务断点续传发生的重复写入数据不会记录到已写入数据量中。
读写数据量在某一段时间内会突然减少的原因是:
DataPipeline为了在传输过程中不丢失任何数据,若需要同步的表存在主键时可以支持断点续传。当数据任务由于突发情况导致重启时,数据任务会从上一个记录的读取数据点开始重新同步数据,此时已读写的数据统计值会回到上一个记录的读写点上,由此用户会看到统计值会减少的现象。
注意:当数据任务已读写统计值频发出现减少是DataPipeline同时进行读写的数据任务过多的信号,需要增加节点的方式解决。您如果经常遇到该情况,请联系DataPipeline专业工程师帮助您解决问题。
激活任务后,已读取数据百分比为什么会发生回调,如:从99% 跳到30%?
Oracle的表行数meta信息是不准的。出于性能考虑,我们在估算表大小的时候,不能用count去精确计算,就会出现,从meta信息里面拿表大小是1千万,但实际表大小是1千1百万。当实际读取超过meta信息里的值时候,就会用实际的读取数进行修正。
为什么已暂停的数据任务还会写入数据?
在DataPipeline的数据模型中,我们将数据从数据源读取出来,写入消息队列进行缓存,数据写入端来消费缓存中的数据,写入至数据目的地。当数据任务的读取速率大于写入速率时,在缓存中会产生部分已读取但尚未写入的数据,这时,暂停数据任务,数据任务需要将已读取但未写入的数据继续写入目的地,以防数据同步进度丢失。
目前进行数据任务的时候,读取速率远大于写入速率,其中,已读取且还未写入的数据会暂时存储在Kafka上,但是由于Kafka存储空间有限,超出后容易造成数据的丢失,这怎么办?
我们支持用户开启动态限速功能来定时检查kafka的最大存储空间,通过设置一个时间间隔来确认已读取且还未写入的数据量是否大于设定的Kafka的最大存储空间,从而判断是否需要暂停数据的读取。直到下一次确认,已读取且还未写入的数据量小于设定的Kafka的最大存储空间,则启动数据任务的剩下数据读取。
如果一条数据多次、频繁变化,在DataPipeline产品侧如何保证数据的并行和保序是如何保证的?
我们源端会将任务按照一定原则拆分为多个互不干扰的子任务进行并行执行。在JDBC源读取场景下,如果任务包括多张表,每个表是由一个独立线程进行顺序读取的,线程并行度可以在任务属性中进行设置。为了保证顺序写入和读取,默认每个单独子任务会创建一个独立的topic,设置一个分区,这样目的端消费的时候,同一个topic只有一个consumer在进行消费,从而保证消费的顺序性。如果可以接受非顺序消费,也可以为一个topic创建多个分区,这样目的端可以更好地利用Kafka的并行能力提高吞吐量。
产品使用期限到期所有任务都会被暂停任务,那么如何提前获知产品使用期限是否到期以避免任务被暂停?
Datapipeline提供提前通知服务,当产品距离到期10天/7天/3天时,datapipeline会向用户发送三次邮件,通知用户及时申请新的激活码,工作人员会及时为用户提供新的激活码。
什么样的实时传输任务会在性能关注中显示?
当该实时传输任务前一天至少有有一张表有数据流入的时候,才会显示在实时传输任务的性能关注里。
因主键大小写敏感导致的丢数据问题怎么解决
不同的数据节点对数据值大小写敏感支持不同,在新建数据表的场景中,您可以通过高级清洗功能,给大小写不同但值相同的主键添加前缀或后缀,以避免数据丢失;在选择已有表的场景中,您在创建数据目的地表的时候可以指定部分字符类型字段的字符集,来避免数据写入过程中,目的地数据库判断大小写不同的主键值相同导致的数据丢失问题。
最后更新于
这有帮助吗?