Doris 1.0 开始官网提供了编译好的二进制包,可以直接下载使用。如果老版本想滚动升
级新版本,可以参照官方说明:https://doris.apache.org/zh-CN/installing/upgrade.html
版本通告:https://mp.weixin.qq.com/s/Ju3K67jOrBdJ8BX-V1IIgw
过去 Apache Doris 的 SQL 执行引擎是基于行式内存格式以及基于传统的火山模型进行设计的,在进行 SQL 算子与函数运算时存在非必要的开销,导致 Apache Doris 执行引擎的效率受限,并不适应现代 CPU 的体系结构。向量化执行引擎的目标是替换 Apache Doris 当前的行式 SQL 执行引擎,充分释放现代 CPU 的计算能力,突破在 SQL 执行引擎上的性能限制,发挥出极致的性能表现。
基于现代 CPU 的特点与火山模型的执行特点,向量化执行引擎重新设计了在列式存储系统的 SQL 执行引擎:
⚫ 重新组织内存的数据结构,用 Column 替换 Tuple,提高了计算时 Cache 亲和度,分支预测与预取内存的友好度
⚫ 分批进行类型判断,在本次批次中都使用类型判断时确定的类型,将每一行类型判断的虚函数开销分摊到批量级别。
⚫ 通过批级别的类型判断,消除了虚函数的调用,让编译器有函数内联以及 SIMD 优化的机会从而大大提高了 CPU 在 SQL 执行时的效率,提升了 SQL 查询的性能。
https://blog.csdn.net/qq_35423190/article/details/123129172
https://zhuanlan.zhihu.com/p/344706733
set enable_vectorized_engine = true;
set batch_size = 4096;
batch_size 代表了 SQL 算子每次进行批量计算的行数。Doris 默认的配置为 1024,这个配
置的行数会影响向量化执行引擎的性能与 CPU 缓存预取的行为。官方推荐配置为 4096。
CREATE TABLE IF NOT EXISTS test_db.user
(
`user_id` LARGEINT NOT NULL COMMENT "用户 id",
`username` VARCHAR(50) NOT NULL COMMENT "用户昵称",
`city` VARCHAR(20) NOT NULL COMMENT "用户所在城市",
`age` SMALLINT NOT NULL COMMENT "用户年龄",
`sex` TINYINT NOT NULL COMMENT "用户性别",
`phone` LARGEINT NOT NULL COMMENT "用户电话",
`address` VARCHAR(500) NOT NULL COMMENT "用户地址",
`register_time` DATETIME NOT NULL COMMENT "用户注册时间"
)
UNIQUE KEY(`user_id`, `username`)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 10
PROPERTIES("replication_num" = "1");
insert into test_db.user values\
(10000,'wuyanzu',' 北 京 ',18,0,12345678910,' 北 京 朝 阳 区 ','2017-10-01
07:00:00'),\
(20000,'wuyanzu',' 北 京 ',19,0,12345678910,' 北 京 朝 阳 区 ','2017-10-01
07:00:00'),\
(30000,'zhangsan','北京',20,0,12345678910,'北京海淀区','2017-11-15
06:10:20');
explain select name from user where user_id > 20000
开启了向量化执行引擎之后,在 SQL 的执行计划之中会在 SQL 算子前添加一个 V 的
标识。
1)NULL 值
由于 NULL 值在向量化执行引擎中会导致性能劣化。所以在建表时,将对应的列设置
为 NULL 通常会影响向量化执行引擎的性能。这里推荐使用一些特殊的列值表示 NULL 值,
并在建表时设置列为 NOT NULL 以充分发挥向量化执行引擎的性能。
2)与行存执行引擎的部分差异
在绝大多数场景之中,用户只需要默认打开 session 变量的开关,就可以透明地使用向
量化执行引擎,并且使 SQL 执行的性能得到提升。但是,目前的向量化执行引擎在下面一
些微小的细节上与原先的行存执行引擎存在不同,需要使用者知晓。这部分区别分为两类
(1)a 类 :行存执行引擎需要被废弃和不推荐使用或依赖的功能
⚫ Float 与 Double 类型计算可能产生精度误差,仅影响小数点后 5 位之后的数字。如
果对计算精度有特殊要求,请使用 Decimal 类型。
⚫ DateTime 类型不支持秒级别以下的计算或 format 等各种操作,向量化引擎会直接
丢弃秒级别以下毫秒的计算结果。同时也不支持 microseconds_add 等,对毫秒计算
的函数。
⚫ 有符号类型进行编码时,0 与-0 在 SQL 执行中被认为是相等的。这可能会影响
distinct,group by 等计算的结果。
⚫ bitmap/hll 类型在向量化执行引擎中:输入均为 NULL,则输出的结果为 NULL 而
不是 0。
(2)b 类: 短期没有在向量化执行引擎上得到支持,但后续会得到开发支持的功能
⚫ 不支持原有行存执行引擎的 UDF 与 UDAF。
⚫ string/text 类型最大长度支持为 1MB,而不是默认的 2GB。即当开启向量化引擎后,
将无法查询或导入大于 1MB 的字符串。但如果关闭向量化引擎,则依然可以正常
查询和导入。
⚫ 不支持 select … into outfile 的导出方式。
⚫ 不支持 external broker 外表。
10.2 Hive 外表
Hive External Table of Doris 提供了 Doris 直接访问 Hive 外部表的能力,外部表省去
了繁琐的数据导入工作,并借助 Doris 本身的 OLAP 的能力来解决 Hive 表的数据分析问
题:
⚫ 支持 Hive 数据源接入 Doris
⚫ 支持 Doris 与 Hive 数据源中的表联合查询,进行更加复杂的分析操作
CREATE [EXTERNAL] TABLE table_name (
col_name col_type [NULL | NOT NULL] [COMMENT "comment"]
) ENGINE=HIVE
[COMMENT "comment"]
PROPERTIES (
'property_name'='property_value',
...
);
参数说明:
(1)外表列
⚫ 列名要与 Hive 表一一对应
⚫ 列的顺序需要与 Hive 表一致
⚫ 必须包含 Hive 表中的全部列
⚫ Hive 表分区列无需指定,与普通列一样定义即可。
(2)ENGINE 需要指定为 HIVE
(3)PROPERTIES 属性:
⚫ hive.metastore.uris:Hive Metastore 服务地址
⚫ database:挂载 Hive 对应的数据库名
⚫ table:挂载 Hive 对应的表名
支持的 Hive 列类型与 Doris 对应关系如下表:
Hive | Doris | 描述 |
---|---|---|
BOOLEAN | BOOLEAN | |
CHAR | CHAR | 当前仅支持 UTF8 编码 |
VARCHAR | VARCHAR | 当前仅支持 UTF8 编码 |
TINYINT | TINYINT | |
SMALLINT | SMALLINT | |
INT | INT | |
BIGINT | BIGINT | |
FLOAT | FLOAT | |
DOUBLE | DOUBLE | |
DECIMAL | DECIMAL | |
DATE | DATE | |
TIMESTAMP | DATETIME | Timestamp 转 成 Datetime会损失精度 |
注意:
⚫ Hive 表 Schema 变更不会自动同步,需要在 Doris 中重建 Hive 外表。
⚫ 当前 Hive 的存储格式仅支持 Text,Parquet 和 ORC 类型
⚫ 当前默认支持的 Hive 版本为 2.3.7、3.1.2,未在其他版本进行测试。后续后支持
更多版本。
完成在 Doris 中建立 Hive 外表后,除了无法使用 Doris 中的数据模型(rollup、预聚合、
物化视图等)外,与普通的 Doris OLAP 表并无区别
1)Hive 中创建测试表:
CREATE TABLE `test11` (
`k1` int NOT NULL COMMENT "",
`k2` char(10) NOT NULL COMMENT "",
`k3` timestamp NOT NULL COMMENT "",
`k5` varchar(20) NOT NULL COMMENT "",
`k6` double NOT NULL COMMENT ""
)
insert into test11 values (1,'a',unix_timestamp(),'haha',1.0);
2)Doris 中创建外表
CREATE TABLE `t_hive` (
`k1` int NOT NULL COMMENT "",
`k2` char(10) NOT NULL COMMENT "",
`k3` datetime NOT NULL COMMENT "",
`k5` varchar(20) NOT NULL COMMENT "",
`k6` double NOT NULL COMMENT ""
) ENGINE=HIVE
COMMENT "HIVE"
PROPERTIES (
'hive.metastore.uris' = 'thrift://hadoop1:9083',
'database' = 'test',
'table' = 'test11'
);
3)查询外表
select * from t_hive;
通 过 Lateral View 语 法 , 我 们 可 以 使 用 explod_bitmap 、 explode_split 、
explode_jaon_array 等 Table Function 表函数,将 bitmap、String 或 Json Array 由一列展
开成多行,以便后续可以对展开的数据进行进一步处理(如 Filter、Join 等)。
1)创建测试表:
CREATE TABLE test3 (k1 INT,k2 varchar(30))
DISTRIBUTED BY HASH (k1) BUCKETS 2
PROPERTIES("replication_num" = "1");
INSERT INTO test3 VALUES (1,''), (2,null), (3,','),
(4,'1'),(5,'1,2,3'),(6,'a,b,c');
2)设置参数开启
set enable_lateral_view=true;
3)explode_bitmap:展开一个 bitmap 类型
select k1, e1 from test3 lateral view
explode_bitmap(bitmap_from_string("1")) tmp1 as e1 order by k1, e1;
4)explode_split:将一个字符串按指定的分隔符分割成多个子串
select k1, e1 from test3 lateral view explode_split(k2, ',') tmp1
as e1 order by k1, e1;
5)explode_json_array:展开一个 json 数组
select k1, e1 from test3 lateral view
explode_json_array_int('[1,2,3]') tmp1 as e1 order by k1, e1;
select k1, e1 from test3 lateral view
explode_json_array_double('[1.0,2.0,3.0]') tmp1 as e1 order by k1,
e1;
select k1, e1 from test3 lateral view
explode_json_array_string('[1,"b",3]') tmp1 as e1 order by k1, e1;
Doris 1.0 支持通过 mysqldump 工具导出数据或者表结构,下面几种操作:
1)导出 test 数据库中的 user 表:
mysqldump -h127.0.0.1 -P9030 -uroot --no-tablespaces --databases
test_db --tables user > dump1.sql
2)导出 test_db 数据库中的 user 表结构:
mysqldump -h127.0.0.1 -P9030 -uroot --no-tablespaces --databases
test_db --tables user --no-data > dump2.sql
3)导出 test_db 数据库中所有表:
mysqldump -h127.0.0.1 -P9030 -uroot --no-tablespaces --databases
test_db
4)导出所有数据库和表
mysqldump -h127.0.0.1 -P9030 -uroot --no-tablespaces --all-databases
5)导出的结果可以重定向到文件中,之后可以通过 source 命令导入到 Doris 中
source /opt/module/doris-1.0.0/dump1.sql