DataX同步数据到StarRocks问题记录

2023-11-06

目录

需求

问题

1 连接失败

2 Too Many Versions

3 特殊字符问题

4 类型转换为问题

5 时区问题

6 权限问题

其他


需求

      最近一段时间在做数据治理的数据中台项目,前两天项目上线。整个数据治理的流程是先从数据归集到数据清洗,再到数据转换,最后是数据质量。调度平台使用DS海豚,数仓没有选择Hadoop,而是选择了StarRocks。技术选型及整体架构,今天不讲,后面再专门写专栏。今天主要记录下数据归集时候遇到的问题。 

      项目中数据归集这个模块主要支持kafka/file/mysql/oracle/ocanBase等关系数据库的抽取,对于kafka和file类型任务交给DS,数据抽取的能力是直接使用StarRocks的sreamLoad组件来做的,我们做了加工,这里不展开讲。对于非kafka、file的数据库数据归集,主要使用了DataX。需要进行归集的库有两个,其中有一个库非常顺利完成了归集任务;另外一个库的三张表却全部失败。

问题

1 连接失败

      通过给定的用户名、密码使用工具可以正常连接数据库,但是使用dataX连接失败,这个问题比较容易定位,通过查看源库的数据库版本,发现是mysql8.0的版本,而DataX3.0默认关于mysql的驱动版本是5.1.47,这个版本是不支持mysql8.0的。 通过修改mysql驱动即可解决问题。 

这里要注意:

(1)不能直接替换原来的mysql-connector-java-j5.1.47.jar,直接替换是不生效的

(2)需要分别重新编译mysql的reader和writer,参考这里

(3)重新编译好的插件放到datax的plugin目录即可

完成上述问题之后,可以正常连接mysql了进行归集任务了

2 Too Many Versions

      归集任务最后看是跑成功了,但是看细节日志发现,跑了18w的数据,有14w多都是失败,这实际上还是失败了。看了下错误日志,最多的日志就是报Too Many Versions,如下图所示:

       首先,这个错误是在writer到StarRocks的时候,SR报的错误,关于这个错误,StarRocks的挂网是这样说的:

为什么会发生 "close index channel failed" 和 "too many tablet versions" 错误?应该如何处理?

上述报错是因为导入频率太快,数据没能及时合并 (Compaction) ,从而导致版本数超过支持的最大未合并版本数。默认支持的最大未合并版本数为 1000。可以通过如下方法解决上述报错:

  • 增大单次导入的数据量,降低导入频率。

  • 在 BE 的配置文件 be.conf 中修改以下配置,通过调整合并策略实现加快合并的目的:

    cumulative_compaction_num_threads_per_disk = 4
    base_compaction_num_threads_per_disk = 2
    cumulative_compaction_check_interval_seconds = 2

    修改完成后,需要观察内存和 I/O,确保内存和 I/O 正常。

      可以简单理解为,出现这种问题,是因为导入的频率太快了,可以通过修改导入的频次或者调整合并策略。但是Datax默认就是按照批次导入的,我们设置的是最大一次可以5w条数据,为什么还会出现这种问题?

      仔细查看日志看到如下日志记录:

      原来datax只要出现脏数据,插入失败的话,就会将这一批次的数据全部回滚,然后单条一条一条执行,这也是为什么只有18w的数据,却同步了将近2个小时,而且有14w多都是失败的原因了。既然是这样,那问题就还是得尝试去找脏数据,到底是哪些数据造成了失败。

      PS:我们也尝试去调整SR的PE合并策略,但是效果不佳,而且这也不是解决问题的正确方法,毕竟数据在源库可以正常存储,就没有道理不能同步到数仓,即便真的是脏数据,也应该是在数仓的数据清洗流程对数据进行清洗。

3 特殊字符问题

      通过继续查看日志,发现非常多如下错误:

       这种错误看上去很诡异,通过对源表数据的分析,发现有一个字段的数据存在英文单引号,如下:

      这个英文单引号是一个关键字符,datax在拼接insert into 语句的时候,字段类型如果是varchar或者char类型值是通过单引号包裹的,但是因为值中已经有一个单引号,这就造成识别错误,解析失败了。针对这个问题,我们尝试修改reader中的select语句,通过给字段添加replace来解决该问题,比如:

      DataX的json文件配置根据数据源不同,配置不同,项目中是通过代码生成的,源表的colum是事先查询出来,在生成json文件的时候,循环生成querySql的,如下:

 if("reader".equals(rwFlag) && ("varchar".equals(columm.getDataType()) ||
                        "char".equals(columm.getDataType()) ||
                        "string".equals(columm.getDataType()))){
                    sql.append("\"replace(`"+columm.getColumnName() + "`,\\\"'\\\",\\\"\\\")\"");
                }else{
                    sql.append("\"`"+columm.getColumnName() + "`\"");
                }

       通过这种方式,最后问题解决,并且也可以完成数据的初步清洗。同理,如果有其他特殊字符,也可以通过这种方式解决,如果有多个特殊字符,可以通过replace套replace解决。

4 类型转换为问题

      关于类型转换的问题是做异构数据源之间数据同步必须要考虑的问题。 我们本次的源库是MYSQL,目标库是StarRocks。DBA同事梳理了字段类型的映射关系,如下所示:

OB(mysql租户)/MySQL StarRocks
bool bool
boolean boolean
tinyint tinyint
smallint smallint
mediumint int
int int
integer int
bigint bigint
decimal DECIMAL
numeric DECIMAL
float float
double double
bit bit
datetime datetime
timestamp datetime
date date
time time
year year
char char
varchar varchar
tinyblob
blob
mediumblob
longblob
tinytext
text
mediumtext
longtext

(1)对于无的,可以统一使用string

(2)mysql中的varchar(255)是255个字符,可以存255个汉字或者英文,但是StarRocks中varchar(255)是255个字节,如果存中文是255/3个中文,所以在StarRocks中创建目标表的时候,要注意对应字段的长度为源库表中对应字段长度的3倍

(3)StraRocks中的string等价于VARCHAR(65535字节数)

(4)对于超过65535字节的字段长度可以进行截取、过滤,一般也不建议存长字段

      按照上述方式处理之后,后面还是有一个问题,如下所示:

Error: Decimal '18392594342' is out of range. The type of 'ORDER_ACCOUNT' is DECIMAL64(10, 0)'. Row: 

      这个提示主要还是字段长度对不上,经过核查发现,主要问题在于取源表的数据结构时候,没有取到源表decimal类型的长度,SR中建表时候就使用了默认长度(10,0),而恰巧源表中有更长的数据。最后,修改目标表该字段的长度即可,如下:

对应代码中,做了如下改造:

if (StringUtils.isNotBlank(colList.getColumnLength()) && !colList.getColumnType().equals("string")){
	//字段类型+长度
	sql1.append("  " + colList.getColumnType()+"("+colList.getColumnLength()+")" + " ");
} else if("decimal".equals(colList.getColumnType().toLowerCase())){
	//如果是decimal类型,默认设置长度为(20,0)
	sql1.append("  " + colList.getColumnType()+"(20,0)" + " ");
}
else {
	//字段类型
	sql1.append("  " + colList.getColumnType() + " ");
}

 完成上述调整后,问题解决。

5 时区问题

      这个问题比较隐蔽,在开发初期也没有留意,最近项目快要上线了,数据组的同事在做数据核查,发现同样查询条件的语句在业务源表上查询出来的数据条数和在数仓中归集过来的表查询条数不一样。

    感觉百思不得其解,先尝试将数仓中同样查询条件的数据导出来再导入mysql,然后联合查询,看看到底差异数据是哪些,联合查询之后发现差异数据更多。 主要原因在于查询语句的条件是根据业务源表的一个create_time字段查询的。 

    最后直接取了某一条记录做对比,发现主键相同的两条记录,create_time不同。如下:

    看到这里,猜测应该是时区的问题。 回过头去查看Datax的Json配置文件,发现reader和writer中的jdbcUrl地址都没有设置时区,加上时区,再次执行,问题解决。 参考这里

6 权限问题

       系统已经上线有段时间了,今天早上监控平台突然连续报警,提示归集任务失败,看了下所有归集任务都失败了,仔细核查了发现是所有datax的任务都失败了,失败日志信息如下:

[INFO] 2022-12-02 00:00:02.414 +0800 [taskAppId=TASK-20221202-7705210273312_1-29152-87296] TaskLogLogger-class org.apache.dolphinscheduler.plugin.task.datax.DataxTask:[63] - -> 
sudo: pam_open_session: System error
sudo: policy plugin failed session initialization

       出现这个问题的主要原因是因为启动datax的linux用户有密码有效期,刚好昨晚上密码到期了,然后再执行任务的时候,就报如上错误。 联系集成修改启动用户不适用sudo,避免类似问题发生,然后重新执行任务,任务执行成功。

其他

      在处理该问题的过程中,在修改了驱动后,还是报错时,当时怀疑是因为源表的字符集是utf8mb4,而StarRocks中没有utf8mb4的字符集,也不支持建表指定字符集,当时想,这样的话,就无解了。后来通过调研发现,并不是这样的问题,参考这里

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DataX同步数据到StarRocks问题记录 的相关文章

  • 深度强化学习的核心算法:从QLearning到Deep QNetwork

    1 背景介绍 深度强化学习 Deep Reinforcement Learning DRL 是一种通过智能体与环境的互动学习的方法 它可以帮助智能体在没有明确指导的情况下学习如何执行最佳的动作 从而最大化收益 深度强化学习结合了强化学习 R
  • 慢思维大脑:SOP流程的心理学背景

    1 背景介绍 慢思维大脑 SOP流程的心理学背景 慢思维是指人类大脑在处理复杂问题 做出重要决策时所采用的思考方式 它与快速 自动的快思维相对 主要通过以下几种方式表现 深入思考 慢思维会让人类大脑深入思考问题的本质 从而找出更深层次的解决
  • AI大模型应用入门实战与进阶:如何训练自己的AI模型

    1 背景介绍 人工智能 Artificial Intelligence AI 是计算机科学的一个分支 旨在模拟人类智能的能力 包括学习 理解自然语言 识别图像和视频 进行决策等 随着数据量的增加和计算能力的提升 人工智能技术的发展得到了巨大
  • 如何成为一名数据科学家:必须掌握的技能和知识

    1 背景介绍 数据科学家是一种新兴的职业 它结合了计算机科学 统计学 数学和领域知识等多个领域的知识和技能 以解决实际问题 数据科学家的主要任务是收集 清洗 分析和解释大量数据 从中挖掘有价值的信息和知识 并将其应用于决策和预测 数据科学家
  • 【计算机毕业设计】病房管理系统

    当下 如果还依然使用纸质文档来记录并且管理相关信息 可能会出现很多问题 比如原始文件的丢失 因为采用纸质文档 很容易受潮或者怕火 不容易备份 需要花费大量的人员和资金来管理用纸质文档存储的信息 最重要的是数据出现问题寻找起来很麻烦 并且修改
  • 【计算机毕业设计】实验室预约管理

    身处网络时代 随着网络系统体系发展的不断成熟和完善 人们的生活也随之发生了很大的变化 人们在追求较高物质生活的同时 也在想着如何使自身的精神内涵得到提升 而读书就是人们获得精神享受非常重要的途径 为了满足人们随时随地只要有网络就可以看书的要
  • 【计算机毕业设计】Java图书馆智能选座系统

    现代经济快节奏发展以及不断完善升级的信息化技术 让传统数据信息的管理升级为软件存储 归纳 集中处理数据信息的管理方式 本图书馆智能选座系统就是在这样的大环境下诞生 其可以帮助使用者在短时间内处理完毕庞大的数据信息 使用这种软件工具可以帮助管
  • 图解python | 字符串及操作

    1 Python元组 Python的元组与列表类似 不同之处在于元组的元素不能修改 元组使用小括号 列表使用方括号 元组创建很简单 只需要在括号中添加元素 并使用逗号隔开即可 tup1 ByteDance ShowMeAI 1997 202
  • APP端网络测试与弱网模拟

    当前APP网络环境比较复杂 网络制式有2G 3G 4G网络 还有越来越多的公共Wi Fi 不同的网络环境和网络制式的差异 都会对用户使用app造成一定影响 另外 当前app使用场景多变 如进地铁 上公交 进电梯等 使得弱网测试显得尤为重要
  • Soul App:来一场始于“兴趣”,轻松自在的“零糖”社交吧

    岁末年终 回顾2023年 这一年你都做了什么呢 记不清楚没关系 互联网都帮你记录好了 2023年 B站的年轻人当 所见所闻 刷新自身认知时 往往会发送弹幕 啊 来抒发惊叹 这一年 支付宝 小荷包 的用户中00后占了4成 近一半更开启了 自动
  • 基于java的饮食分享平台系统设计与实现

    基于java的饮食分享平台系统设计与实现 I 引言 A 研究背景和动机 近年来 随着人们生活水平的提高和健康意识的增强 饮食健康已经成为越来越多人的关注焦点 因此 一个方便快捷的饮食分享平台就显得尤为重要 基于Java的饮食分享平台系统设计
  • 深入了解 Python MongoDB 操作:排序、删除、更新、结果限制全面解析

    Python MongoDB 排序 对结果进行排序 使用 sort 方法对结果进行升序或降序排序 sort 方法接受一个参数用于 字段名 一个参数用于 方向 升序是默认方向 示例 按名称按字母顺序对结果进行排序 import pymongo
  • 深入了解 Python MongoDB 查询:find 和 find_one 方法完全解析

    在 MongoDB 中 我们使用 find 和 find one 方法来在集合中查找数据 就像在MySQL数据库中使用 SELECT 语句来在表中查找数据一样 查找单个文档 要从MongoDB的集合中选择数据 我们可以使用 find one
  • 【计算机毕业设计】电商个性化推荐系统

    伴随着我国社会的发展 人民生活质量日益提高 于是对电商个性化推荐进行规范而严格是十分有必要的 所以许许多多的信息管理系统应运而生 此时单靠人力应对这些事务就显得有些力不从心了 所以本论文将设计一套电商个性化推荐系统 帮助商家进行商品信息 在
  • 【计算机毕业设计】北工国际健身俱乐部

    本系统为会员而设计制作北工国际健身俱乐部 旨在实现北工国际健身俱乐部智能化 现代化管理 本北工国际健身俱乐部管理自动化系统的开发和研制的最终目的是将北工国际健身俱乐部的运作模式从手工记录数据转变为网络信息查询管理 从而为现代管理人员的使用提
  • 【计算机毕业设计】二手图书交易系统

    随着世界经济信息化 全球化的到来和互联网的飞速发展 推动了各行业的改革 若想达到安全 快捷的目的 就需要拥有信息化的组织和管理模式 建立一套合理 动态的 交互友好的 高效的二手图书交易系统 当前的信息管理存在工作效率低 工作繁杂等问题 基于
  • CorelDRAW2024官方中文版重磅发布更新

    35年专注于矢量设计始于1988年并不断推陈出新 致力为全球设计工作者提供更高效的设计工具 CorelDRAW 滋养并见证了一代设计师的成长 在最短的时间内交付作品 CorelDRAW的智能高效会让你一见钟情 CorelDRAW 全称 Co
  • 使用企业订货软件的担忧与考虑|网上APP订货系统

    使用企业订货软件的担忧与考虑 网上APP订货系统 网上订货系统担心出现的问题 1 如果在订货系统中定错 多 货物了该怎么办 其实这也是很多人在网购或者是现实中经常会犯的一个错误 但是网上订货平台为大家提供了很多的解决方案 其中对于订单的修改
  • 温室气体排放更敏感的模型(即更高的平衡气候敏感性(ECS))在数年到数十年时间尺度上也具有更高的温度变化(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Python代码 数据
  • 对中国手机作恶的谷歌,印度CEO先后向三星和苹果低头求饶

    日前苹果与谷歌宣布合作 发布了 Find My Device Network 的草案 旨在规范蓝牙追踪器的使用 在以往苹果和谷歌的生态形成鲜明的壁垒 各走各路 如今双方竟然达成合作 发生了什么事 首先是谷歌安卓系统的市场份额显著下滑 数年来

随机推荐

  • error while loading shared libraries: librediscluster.so..: cannot open shared object file: No such

    很纳闷明明设置了环境变量 路径也对 可就是报找不到库 等仔细去看的时候 发现 librediscluster so 这个库多了两点 这种反人性操作真不知作者怎么想的 把librediscluster so 复制成librediscluste
  • 4G时代的语音回落

    原文地址 http ask zealer com post 211 很多小伙伴在享受国内逐步正在建成的4G网络之际可能并不知道 虽然移动通讯网络迈过了这么多年头 用手机打电话这种语音通话范畴之内的事情有单独所谓的传统 语音业务 而浏览网页
  • Devstack部署多节点Openstack(转)

    平台工具介绍 操作系统 Windows7 工具 VirtualBox 5 0 24 镜像 ubuntu 14 04 5 server amd64 iso 下载地址 ubuntu14 04 5 server版 DevStack版本 Mitak
  • 解析逻辑回归模型

    介绍 逻辑回归模型是业界运用最为广泛的模型 我们从下面几个方面讨论这个模型 1 在模型层面上 逻辑回归模型是被用来解决分类问题的 由于分类是一个非线性问题 所以建模的主要难点是如何将非线性问题转化为线性问题 主要从两方面入手 从分解问题的角
  • 如何在Pycharm中安装QT Designer+PyUIC

    如何在Pycharm中安装QT Designer PyUIC 一 安装QT 安装pyqt5 方法一 方法二 安装 pyqt5tools 方法一 方法二 二 指定Qt Designer和PyUIC 添加QtDesigner 添加PyUIC 最
  • 土木人职场受挫该如何破局?转行IT互联网貌似已成首选!

    大学毕业两年 一直在内耗 既不想继续做工程 又不知道出了工地 自己还能做什么 本人毕业于一类院校的建筑环境与能源应用工程专业 通俗的说就是土木工程 进施工单位是大部分土木人的归宿 本科毕业生很多选择去中铁 中建等国企或者央企 在外人看来 国
  • SVN/GIT源代码泄露

    造成SVN源代码漏洞的主要原因是管理员操作不规范 在使用SVN管理本地代码过程中 会自动生成一个名为 svn的隐藏文件夹 其中包含重要的源代码信息 但一些网站管理员在发布代码时 不愿意使用 导出 功能 而是直接复制代码文件夹到WEB服务器上
  • 二进制的概念及运算

    前言 有的朋友觉得写代码做开发应该就是专注于开发出功能 管这些二进制干嘛呢 尤其是做上层开发的朋友 但是当自己出去面试的时候就有可能会碰壁 或者是在看源码的时候就会懵 打个比方我们在看hashmap的源码的时候 并不是每个人都能马上算出这些
  • git使用cherry-pick操作失败,出现CHERRY-PCIKING解决方法

    如果你使用cherry pick出现以下情况 需要撤销这个操作 使用命令 git reset HEAD 1
  • Hive之快速入门

    一 什么是Hive Hive是建立在Hadoop上的数据仓库基础架构 它定义了简单的类SQL查询语句 称为HQL HQL语言也支持用户自定义SQL函数 通过MR任务来处理复杂的分析任务 Hive中包含SQL解析引擎 它会将SQL语句转换成M
  • SPSS多重响应分析案例

    SPSS多重响应分析案例 在市场调查问卷中 总会设计一部分多项选择题 对于多选题 一般采用频数分析 SPSS提供了专门的多选题频数分析统计分析功能 调查问卷 您拥有以下哪些品牌的贵宾卡 1 班尼路 2 真维斯 3 佐丹奴 4 堡师龙 5 苹
  • C# object介绍

    C object介绍 Object类是C 语言仲最原始 最重要得类 是所有类得 祖先 每个C 类都是它得子类 它实现了每个类都必须具有得基本方法 在 Object 类中提供了 4 个常用的方法 即 Equals GetHashCode Ge
  • $(MAKE) -C $(KERNELDIR) M= $(PWD) modules

    转载于 http blog chinaunix net xmlrpc php r blog article uid 29523795 id 4209690 在mini2440资料的LED驱动编程的编译makefile里面看到这样一句话 C是
  • 【华为OD机试 2023】士兵过河(C++ Java JavaScript Python)

    华为od机试题库 华为OD机试2022 2023 C Java JS Py https blog csdn net banxia frontend category 12225173 html 华为OD机试2023最新题库 更新中 C Ja
  • 【S-排序】python实现八大排序算法之10-基数排序(RadixSort)

    基数排序 基本思想 基数排序 Radix Sort 是桶排序的扩展 将整数按位数切割成不同的数字 然后按每个位数分别进行了多轮的桶排序 具体实现 从低位开始将待排序的数按照这一位的值放到相应的编号为0 9的桶中 等到低位排完得到一个子序列
  • type-aliases-package不生效问题记录

    项目场景 在mapper xml文件里 我们可能需要用到别名 需要在yml进行配置 mybatis mapperLocations classpath mapper xml type aliases package com example
  • 脚本安装docker 错误解决

    一 脚本安装 CentOS系统上可以使用此脚本进行安装 如下 root localhost curl sSL get docker com o get docker sh root localhost sh get docker sh mi
  • 黑苹果更新后无法开机的拯救思路

    实例 我的黑苹果osx 10 8 5 前段时间app store提示更新smc 我一看发现是黑苹果敏感部件就没更新 谁知重启后依然悲剧 提示fakeSMC出现某个错误 不能开机了 在走了几个弯路后 我总结了下面的方法 首先进win 用mac
  • 堆排序——c语言实现

    文章目录 堆的概念 堆的定义 堆的判断 堆的特性 堆的构造 自底向上构造 自顶向下构造 关于最大堆 最小堆 堆排序 堆排序的一般过程 堆排序样例过程图解 c语言代码 堆的概念 堆的定义 堆可以定义为一颗二叉树 树的节点包含键 每个节点一个键
  • DataX同步数据到StarRocks问题记录

    目录 需求 问题 1 连接失败 2 Too Many Versions 3 特殊字符问题 4 类型转换为问题 5 时区问题 6 权限问题 其他 需求 最近一段时间在做数据治理的数据中台项目 前两天项目上线 整个数据治理的流程是先从数据归集到