Apache Doris 0.15.3升级至1.1.5避坑实用总结

news2024/12/23 14:13:32

概述:

Apache Doris 从0.15到1.1.5属于一个大版本升级,部分语法和使用方式也发生了较大的变化,本文除前期兼容性调研(可以通过官网查到到一部分兼容性问题)已知问题外,生产环境正式升级之后遇到的突发问题进行整理总结,作为一个避坑指南,后期也会不定期更新。

正文:

1.ODBC驱动兼容性问题:

升级到1.0及以上版本后会出现ODBC版本兼容性问题,具体报错信息如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1OvpqFSs-1688723070799)(C:\Users\lit\Desktop\31480CDE-E55C-45d9-A143-3695B00E2C5D.png)]

这个报错官网也有说明,具体原因不再赘述了,需要注意的是只要是从1.0以下版本升级到1.0及以上版本的,都会出现这个问题。解决方案可以分为以下几种:

  • 重新安装新的ODBC驱动包。具体安装流程可以参考:Doris升级至1.0发行版后MySQL ODBC 不可用解决方案。
  • 修改SQL语句,将ODBC外表替换成OLAP表。

以上2种方案,都可以解决目前遇到的问题,但具体分析来看:

  • Doris官网已经明确说过,1.2版本以后将不会再维护ODBC外表了,同时通过实际生产中的应用来看,ODBC的性能和稳定性与OLAP表相差甚远,很难满足快速响应需求;

  • 如果重新安装ODBC驱动包,以前的ODBC表也没办法再使用,需要利用新的驱动重新创建ODBC,返工成本高;

    综上所述,修改SQL语句才是持久化的调整方式。

2.ODBC开启向量化导致BE停机:

如果升级之前SQL中出现了ODBC外表和OLAP表关联查询,开启向量化引擎之后,会导致BE节点挂掉。附上一个异常样例SQL:

SELECT
	`text1`,
	`text2`,
	`text3`,
	`text4` 
FROM
	test1.ods_odbc_mapping 
WHERE
	DATE_FORMAT( text1, '%Y-%m-%d' ) >= DATE_SUB( CURDATE(), INTERVAL 35 DAY ) 
	AND concat( text2, text3, text4 ) NOT IN (
	SELECT
		concat( text5, '00000000000', text3, text4 ) 
FROM
	test2.ods_olap_delta ) 

具体be.out堆栈日志信息如下:

F0704 12:58:53.773236 185790 column_vector.cpp:210] Parameters start = 0, length = 1024, are out of bound in ColumnVector<T>::insert_range_from method (data.size() = 0).
[root@gaia-pro-bigdata-be01 log]# vim be.out.bak

start time: Mon Jul 3 21:39:37 CST 2023
WARNING: Logging before InitGoogleLogging() is written to STDERR
I0703 21:39:37.529274 452701 env.cpp:46] Env init successfully.
F0704 12:58:53.773236 185790 column_vector.cpp:210] Parameters start = 0, length = 1024, are out of bound in ColumnVector<T>::insert_range_from method (data.size() = 0).
    @     0x55f96e8131fa  doris::PlanFragmentExecutor::get_vectorized_internal()
    @     0x55f96e8177bd  doris::PlanFragmentExecutor::open_vectorized_internal()
    @     0x55f96e81926f  doris::PlanFragmentExecutor::open()
    @     0x7f47096f3dd5  start_thread
    @     0x7f4709a05ead  __clone
    @              (nil)  (unknown)
*** Query id: 0-0 ***
*** Aborted at 1688446733 (unix time) try "date -d @1688446733" if you are using GNU date ***
start time: Mon Jul 3 21:39:37 CST 2023
WARNING: Logging before InitGoogleLogging() is written to STDERR
I0703 21:39:37.529274 452701 env.cpp:46] Env init successfully.
F0704 12:58:53.773236 185790 column_vector.cpp:210] Parameters start = 0, length = 1024, are out of bound in ColumnVector<T>::insert_range_from method (data.size() = 0).
    @     0x55f96e8131fa  doris::PlanFragmentExecutor::get_vectorized_internal()
    @     0x55f96e8177bd  doris::PlanFragmentExecutor::open_vectorized_internal()
    @     0x55f96e81926f  doris::PlanFragmentExecutor::open()
    @     0x7f47096f3dd5  start_thread
    @     0x7f4709a05ead  __clone
    @              (nil)  (unknown)
*** Query id: 0-0 ***
*** Aborted at 1688446733 (unix time) try "date -d @1688446733" if you are using GNU date ***
*** SIGABRT unkown detail explain (@0x6e85d) received by PID 452701 (TID 0x7f460dec9700) from PID 452701; stack trace: ***
 0# doris::signal::(anonymous namespace)::FailureSignalHandler(int, siginfo_t*, void*) at /mnt/disk2/ygl/code/github/apache-doris/be/src/common/signal_handler.h:428
 1# 0x00007F470993E280 in /lib64/libc.so.6
 2# gsignal in /lib64/libc.so.6
 3# abort in /lib64/libc.so
 .6
 4# 0x000055F96E01EAFE in /soft/apache-doris-be-1.1.5-bin-x86_64/lib/doris_be
 5# 0x000055F97046E32D in /soft/apache-doris-be-1.1.5-bin-x86_64/lib/doris_be
 6# google::LogMessage::SendToLog() in /soft/apache-doris-be-1.1.5-bin-x86_64/lib/doris_be
 7# google::LogMessage::Flush() in /soft/apache-doris-be-1.1.5-bin-x86_64/lib/doris_be
 8# google::LogMessageFatal::~LogMessageFatal() in /soft/apache-doris-be-1.1.5-bin-x86_64/lib/doris_be
 9# doris::vectorized::ColumnVector<long>::insert_range_from(doris::vectorized::IColumn const&, unsigned long, unsigned long) at /mnt/disk2/ygl/code/github/apache-doris/be
/src/vec/columns/column_vector.cpp:21810# doris::vectorized::HashJoinNode::_build_output_block(doris::vectorized::Block*, doris::vectorized::Block*) at /mnt/disk2/ygl/code/github/apache-doris/be/src/vec/exec/j
oin/vhash_join_node.cpp:147611# doris::vectorized::HashJoinNode::get_next(doris::RuntimeState*, doris::vectorized::Block*, bool*) at /mnt/disk2/ygl/code/github/apache-doris/be/src/vec/exec/join/vhash
_join_node.cpp:104712# doris::PlanFragmentExecutor::get_vectorized_internal(doris::vectorized::Block**) at /mnt/disk2/ygl/code/github/apache-doris/be/src/runtime/plan_fragment_executor.cpp:3
5213# doris::PlanFragmentExecutor::open_vectorized_internal() at /mnt/disk2/ygl/code/github/apache-doris/be/src/runtime/plan_fragment_executor.cpp:301
14# doris::PlanFragmentExecutor::open() at /mnt/disk2/ygl/code/github/apache-doris/be/src/runtime/plan_fragment_executor.cpp:259
15# doris::FragmentExecState::execute() at /mnt/disk2/ygl/code/github/apache-doris/be/src/runtime/fragment_mgr.cpp:249
16# doris::FragmentMgr::_exec_actual(std::shared_ptr<doris::FragmentExecState>, std::function<void (doris::PlanFragmentExecutor*)>) at /mnt/disk2/ygl/code/github/apache-do
ris/be/src/runtime/fragment_mgr.cpp:48717# std::_Function_handler<void (), std::_Bind_result<void, void (doris::FragmentMgr::*(doris::FragmentMgr*, std::shared_ptr<doris::FragmentExecState>, std::function<void 
(doris::PlanFragmentExecutor*)>))(std::shared_ptr<doris::FragmentExecState>, std::function<void (doris::PlanFragmentExecutor*)>)> >::_M_invoke(std::_Any_data const&) at /mnt/disk2/ygl/installs/ldbtools/include/c++/11/bits/std_function.h:29118# doris::ThreadPool::dispatch_thread() at /mnt/disk2/ygl/code/github/apache-doris/be/src/util/threadpool.cpp:578
19# doris::Thread::supervise_thread(void*) at /mnt/disk2/ygl/code/github/apache-doris/be/src/util/thread.cpp:407
20# start_thread in /lib64/libpthread.so.0
21# __clone in /lib64/libc.so.6

从BE端源码insert_range_from这个方法判断,可能是因为data.size()为空,进入到if判断后,输出了从be.out中看到的日志信息Parameters start = 0, length = 1024, are out of bound in ColumnVector<T>::insert_range_from method (data.size() = 0).,但程序并没有返回,而是继续执行memcpy这个内存拷贝方法,导致操作系统内存分配异常,然后Aborted掉这个进程导致的,但至于为什么内存拷贝会出现异常,这个就没有继续深入追踪了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sM3FtOqz-1688723070800)(C:\Users\lit\AppData\Roaming\Typora\typora-user-images\image-20230705165921318.png)]
解决方案:

  • 关闭向量化引擎。需要注意的是,Doris 1.1.5版本向量化引擎默认是关闭状态,但在1.2版本以后,向量化引擎是默认开启的;
  • 修改SQL语句,将ODBC外表替换成OLAP表。

综合来看,向量化引擎是Doris的一个重大功能,它能极致提高查询性能,为了快速响应需求,在实际业务中肯定是要开启的,我们不可能因为使用ODBC外表而放弃向量化引擎,因此最优的解决方案就是修改SQL语句,将SQL中的ODBC外表替换掉。

3.语法变更:

在1.0版本以下时,如果要查看一个表的所有tablet,我们常用的语法是show tablet from table,但在1.0及以后的版本中,该语法发生了变化,如果还是继续使用旧的语法会出现以下报错:

mysql> show tablet from ods_test_delta\G;
ERROR 1105 (HY000): errCode = 2, detailMessage = Syntax error in line 1:
show tablet from  ods_test_delta
            ^
Encountered: FROM
Expected

mysql> 

解决方案:

使用新的查看语法show tablets from table即可。

mysql> show tablets from test_cdc_sink\G;
*************************** 1. row ***************************
               TabletId: 3944055
              ReplicaId: 3944056
              BackendId: 10003
             SchemaHash: -1
                Version: 1
      LstSuccessVersion: 1
       LstFailedVersion: -1
          LstFailedTime: NULL
          LocalDataSize: 0
         RemoteDataSize: 0
               RowCount: 0
                  State: NORMAL
LstConsistencyCheckTime: NULL
           CheckVersion: -1
           VersionCount: 1
               PathHash: -1
                MetaUrl: http://172.0.0.1:8040/api/meta/header/3944055
       CompactionStatus: http://172.0.0.1:8040/api/compaction/show?tablet_id=3944055
4.CHAR类型字段隐士转换问题:

在1.0以下版本中,如果OLAP表中的字段是char类型,在使用in过滤数据时,如果in里面的过滤条件是数值类型,是可以执行的;但在1.0及以后的版本,如果in里面继续使用数值类型,会报类型转换异常detailMessage = can not cast from origin type TINYINT to target type=CHAR(2),具体测试参考如下:

##建表语句
CREATE TABLE `ods_test_in_delta` (
  `id` INT NULL COMMENT 'id',
  `name` varchar(500) NULL COMMENT 'name',
  `age` int NULL COMMENT 'age',
  `address` varchar(500) NULL COMMENT 'address',
  `status` char(2) NULL COMMENT 'status',
  `ranke` varchar(1) NULL COMMENT 'ranke',
  `grade` TINYINT(1) NULL COMMENT 'grade'
) ENGINE=OLAP
UNIQUE KEY(`id`)
COMMENT 'OLAP'
DISTRIBUTED BY HASH(`id`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 3",
"in_memory" = "false",
"storage_format" = "V2",
"disable_auto_compaction" = "false"
);

##插入语句
insert into ods_test_in_delta(id,name,age,address,status,ranke,grade) VALUES(1,"张三",28,"西安","1","1",1);
insert into ods_test_in_delta(id,name,age,address,status,ranke,grade) VALUES(2,"李四",21,"上海","2","2",6);
insert into ods_test_in_delta(id,name,age,address,status,ranke,grade) VALUES(3,"王二",22,"北京","1","3",2);
insert into ods_test_in_delta(id,name,age,address,status,ranke,grade) VALUES(4,"麻子",18,"天津","3","6",1);
insert into ods_test_in_delta(id,name,age,address,status,ranke,grade) VALUES(5,"横七",56,"济南","4","4",3);
insert into ods_test_in_delta(id,name,age,address,status,ranke,grade) VALUES(6,"竖八",47,"杭州","5","5",4);
  • case 1: status字段类型为char,根据status in (1,3,5),会出现报错:
mysql> SELECT * from ods_test_in_delta  where status in (1,3,5)\G;
ERROR 1105 (HY000): errCode = 2, detailMessage = can not cast from origin type TINYINT to target type=CHAR(2)
ERROR: 
No query specified

mysql> 
  • case2 :grade 字段类型为tinyint,根据grade in ("1","3","2"),可以正常查询出结果:
mysql> SELECT * from ods_test_in_delta  where grade in ("1","3","2");
+------+--------+------+---------+--------+-------+-------+
| id   | name   | age  | address | status | ranke | grade |
+------+--------+------+---------+--------+-------+-------+
|    1 | 张三   |   28 | 西安    | 1      | 1     |     1 |
|    3 | 王二   |   22 | 北京    | 1      | 3     |     2 |
|    4 | 麻子   |   18 | 天津    | 3      | 6     |     1 |
|    5 | 横七   |   56 | 济南    | 4      | 4     |     3 |
+------+--------+------+---------+--------+-------+-------+
4 rows in set (0.01 sec)

mysql>
  • case3 :ranke 字段类型为varchar,根据 ranke in (2,3,5),可以正常查询出结果:
mysql> SELECT * from ods_test_in_delta where ranke in (2,3,5); 
+------+--------+------+---------+--------+-------+-------+
| id   | name   | age  | address | status | ranke | grade |
+------+--------+------+---------+--------+-------+-------+
|    2 | 李四   |   21 | 上海    | 2      | 2     |     6 |
|    3 | 王二   |   22 | 北京    | 1      | 3     |     2 |
|    6 | 竖八   |   47 | 杭州    | 5      | 5     |     4 |
+------+--------+------+---------+--------+-------+-------+
3 rows in set (0.01 sec)

mysql> 

从以上3个case 可以看出,1.0以上版本兼容了 varcharint之间的隐士转换,但对char类型没有做类型转换。遇到这种情况,只能提高SQL书写规范,尽量减少这种类型转换的需求。

总结:

通过本次从0.15升级到1.1.5版本的过程中来看,因为前期也做了大量兼容性调研工作,所以升级工作整体还是比较顺利的,但升级过后也遇到以上这些问题在调研过程中并没有涉及到。目前已知问题中,除了ODBCOLAP关联会导致BE节点down机外,暂时还没有发现其他比较严重的问题,所以大家在升级Apache Doris时还是要做好前提兼容性调研的工作,避免出现不可控异常导致生产环境瘫痪,后续如果有新的版本兼容问题,也会持续更新。

换的需求。

总结:

通过本次从0.15升级到1.1.5版本的过程中来看,因为前期也做了大量兼容性调研工作,所以升级工作整体还是比较顺利的,但升级过后也遇到以上这些问题在调研过程中并没有涉及到。目前已知问题中,除了ODBCOLAP关联会导致BE节点down机外,暂时还没有发现其他比较严重的问题,所以大家在升级Apache Doris时还是要做好前提兼容性调研的工作,避免出现不可控异常导致生产环境瘫痪,后续如果有新的版本兼容问题,也会持续更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/727902.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Web 安全】刚开始学渗透,零基础怎么入门?

上周旁听了一个大学学长组织的线上网络安全交流会&#xff0c;里边不乏充斥着各位行业大牛&#xff0c;讲的内容确实精彩&#xff0c;可能对于网络安全经验 5 年的人来说&#xff0c;是受益匪浅&#xff0c;欢迎程度极高&#xff0c;恨不得跳出屏幕来表示赞同&#xff0c;毕竟很…

2022年06月份青少年软件编程Scratch图形化等级考试试卷三级真题(含答案)

2022-06 Scratch三级真题 分数&#xff1a;100 题数&#xff1a;38 测试时长&#xff1a;60min 一、单选题(共25题&#xff0c;共50分) 1.点击绿旗&#xff0c;舞台上的角色会说出&#xff1f;&#xff08; &#xff09;(2分) A. 2022年5月1日 B. 1日5月2022年 C. 2022…

【2023最全教程】性能测试基础知识学习路线(建议收藏)

本文介绍一下性能测试的基础内容和一些学习经验&#xff0c;主要讲针对服务器端的性能测试。其他代码级性能测试、前端性能测试等属于比较细分的领域&#xff0c;建议大家有需要的时候针对性得去学。而对于服务器端的性能测试&#xff0c;即使是不做性能测试的人&#xff0c;最…

如何利用GIS数据转换器-栅格 实现去云

GIS数据转换器-栅格不仅能够实现数据转换、数据分割、数据。还可以实现简单去云。 首先打开一副LANDSAT的数据 然后查看云的值范围&#xff0c;值大约为&#xff1a;20000-45000之间 然后在数据转换器中设置设置&#xff0c;过滤范围 点转换按钮进行转换,这样云位置的像素就被…

SpringBoot教学资料3-SpringBoot启动常见问题

java.lang.RuntimeException: java.lang.RuntimeException: org.codehaus.plexus.component.repository.exc Maven版本过高 &#xff0c;与你使用的IDEA版本不兼容。 推荐版本&#xff1a;maven3.6(建议)/maven3.9 控制台Process terminated https://blog.csdn.net/weixin_4458…

SMALE周报_20230707

目录标题 1. 上周回顾2. 本周计划3. 完成情况3.1. 背景3.2. 不确定性类别3.3. 具体方法3.3.1. Aleatoric Uncertainty3.3.1. Epistemic Uncertainty 4. 存在的主要问题5. 下一步工作 1. 上周回顾 这周开始写周报&#xff0c;此项为空。 2. 本周计划 总结不确定性在神经网络中…

96、基于STM32单片机的温湿度DHT11 烟雾火灾报警器蓝牙物联网APP远程控制设计(程序+原理图+任务书+参考论文+开题报告+流程图+元器件清单等)

单片机及温湿度、烟雾传感器是烟雾报警器系统的两大核心。单片机好比一个桥梁&#xff0c;联系着传感器和报警电路设备。近几年来&#xff0c;单片机已逐步深入应用到工农业生产各部门及人们生活的各个方面。各种类型的单片机也根据社会的需求而开发出来。单片机是器件级计算机…

试题小结2

1.内部类和子类的区别 内部类是指在一个外部类的内部再定义一个类&#xff0c;内部类对外部类有访问权限&#xff0c;可以访问类中定义的所有变量和方法。 子类是从父类中继承的类&#xff0c;子类可以访问父类所有public和protected的属性和方法。 Java语言有四个权限访问修…

Android11 Settings菜单加载

一、加载默认亮度 1、top_level_settings.xml 2、AndroidManifest.xml 3、DisplaySettings ①getPreferenceScreenResId ②buildPreferenceControllers 4、display_settings.xml 5、AutoBrightnessPreferenceController 6、BrightnessLevelPreferenceController ①getCurren…

全网最细,Pytest自动化测试-重复执行用例 pytest-repeat(实战)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 平常在做功能测试…

应对Python爬虫IP被封的策略及建议。

我们在进行数据抓取使用代理ip的时候需要有一些约束规定&#xff0c;才能保证我们持续稳定的抓取数据。 大概整理了一下&#xff0c;需要注意以下几点&#xff0c;仅供参考&#xff1a; 1、使用高质量的代理服务器&#xff1a;选择一些可靠的代理服务器&#xff0c;确保它们的…

从歌手李玟的自杀传闻,看骑行健身对心理健康的深远影响

从歌手李玟的自杀传闻&#xff0c;看骑行健身对心理健康的深远影响 最近&#xff0c;歌手李玟的自杀传闻让大众一片哗然。这个消息无疑成为了各大平台的热点话题。然而&#xff0c;作为骑友&#xff0c;我们今天再次谈谈骑行健身的重要性。 首先&#xff0c;我们要明确一点&…

性能测试如何做?性能测试实战从0-1进阶(内涵面试题+答案)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试实战 - 部…

checkout

git-checkout - Switch branches or restore working tree files# 用index或者指定commit中的版本,来更新工作区中的文件 # 切换分支 Updates files in the working tree to match the version in the index or the specified tree. If no pathspec was given,git checkout wil…

SonarQube扫描常见Bug、漏洞修复整理(持续更新中)

目录 DMS1、A "NullPointerException" could be thrown; "sra" is nullable here.2、Cast one of the operands of this multiplication operation to a "long"3、Call "remove()" on "requestContainer".4、Use try-with-r…

echarts条形图 动态 设置标签背景和柱状图渐变颜色

<!--Description: 横向渐变柱状图 --> <template><div ref"horizontal" class"w-full h-full"></div> </template><script> import * as echarts from echarts export default {components: {},props: [data],data() …

c++11 标准模板(STL)(std::basic_ostream)(八)

定义于头文件 <ostream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_ostream 提供字符流上的高层输出操作。受支持操作包含有格式…

kubernetes 节点排水维护 cordon, drain, uncordon

1.这三个命令是正式release的1.2新加入的命令&#xff0c;三个命令一起介绍&#xff0c;是因为三个命令配合使用可以实现节点的维护。在1.2之前&#xff0c;因为没有相应的命令支持&#xff0c;如果要维护一个节点&#xff0c;只能stop该节点上的kubelet将该节点退出集群&#…

Java-API简析_java.net.InetAddress类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131590559 出自【进步*于辰的博客】 因为我发现目前&#xff0c;我对Java-API的学习意识比较薄弱…

git因网络问题报错

Failed to connect to github.com port 443 after 21051 ms: Couldnt connect to server Recv failure: Connection was reset 你是否最近也有遇到这种情况呢&#xff1f; 公司项目目前保存在github上, 在 git pull 和 git push 的时候总是遇到以上情况 也是困扰了我不少…