30 问最后一篇了,希望这 30 问能解答大家在使用 Apache Doris 或者选择 Apache Doris 的时候产生的各种疑虑。
在 Doris 内,是通过 null 值 与 "" 值来区分的,一个在 CSV 中是类似 \N 这样的值,一个是无数据的,一个是空字符串,这两个值在存储到 Doris 中以后是不一样的,空字符串无法通过 is null 或者 is not null 来做过滤,同时如果导入有默认值的话,那么空字符串不会生成默认值。
当前不可以,如果太过高频的数据插入,会让 Doris 的数据版本合并压力骤增,关于这个问题有两点可以表述的:
当前不支持优先级设置,但是这个在 Doris 查询层做了很多工作来保证。
1.1.2 开始,Doris 开始使用 MemTracker 来做统一的内存申请管理,本身 Doris 是一款 MPP 架构数据库,在计算的时候会比较依赖内存来做高速缓存,所以如果内存申请不够,复杂 SQL 可能是无法执行的,这会保证整个集群不会因为某个大 SQL 直接吃完所有的内存而饿死小查询,这个硬限默认 2G,如果想调整单次查询的内存申请大小,可以通过 SET exec_mem_limit=4g; 这样的语句来申请硬限。1.2.0 开始,MemTracker 的限制默认策略从硬限变为了软限,软限就是会尽可能从当前集群申请内存,来满足大查询的要求,而不必再预估单次大查询到底要多少 G 内存才行,使用体感会好很多,如果一个大查询发下来,本来需要 20G 内存,当前可用内存只有 12G,那么会在接下来 5 秒内尽可能的清理内存空间,如果 5 秒内能清理出来,满足运行内存大小,那么就执行,如果清理不出来,就 cancel 该查询,那如果想回到硬限策略,可以在 BE 配置文件中设置 enable_query_memory_overcommit=false 即可关闭软限,打开硬限。max_user_connectors 来进行调整,如果有资源限制诉求,调整这个并发度可以有效的解决某些用户可能会错误使用查询导致整个集群负载过高的问题。Doris join 好的原理如果展开来讲,可能篇幅会非常之广,这里只做简明扼要的答疑,如果有对更详细的知识点感兴趣的看官老爷,可以移步至 Apache Doris 官网查看 JOIN 优化相关的篇章。
那么这个问题省流答疑就是——在 JOIN 方面有大量的优化手段和底层设计。
Hash Join & Nest Loop Join,前者仅限于等值 JOIN但性能好,后者更通用但性能差。先说一个我们认为是长期愿景且为之努力的目标:
在未来五到十年,将 Apache Doris 打造成 OLAP 领域的工业界标准,努力看齐 OLTP 领域的 MySQL & Oracle!
这个愿景是整个社区都为之努力的一个目标,那么在细粒度来看,我们生存发展策略和前景在我们眼里,又是如何的呢?
首先谈生存发展策略,我们认为在未来的数据分析领域,一定是要求数据时效性越来越高、数据可靠性越来越高、维护复杂性越来越低、架构复杂度越来越低的趋势,那么 Apache Doris 我们定义为新一代的实时数据仓库的根本原因也在这里。
关键词有几个:
Unique Key 模型或者 Agg 模型,在导入过程中就完成了计算,那么查询时的效率会进一步提升,至于查询阶段,Doris 有 MPP 加持,有向量化引擎加持,有 CBO&RBO 加持,计算速度也是实时的,所以综合下来,Apache Doris 是在实时这一块非常能打的一款数据库产品。那么前景如何呢?
Doris 当前全球已经有两千多家用户了,这个数字在去年年初是三百家,同时 Doris 连续十个月蝉联全球 Apache 大数据项目活跃度第一的 Title,现在月活跃贡献者已经一百多人了,要比 15-16 年 Apache Spark 项目最火的时候的活跃人数还要多,所以 Apache Doris 一定是未来更多人的选择,也是更多企业在后续招人时候的一项必面技术栈了,打个广告,关注 Apache Doris 补习班,让你无惧 Doris 面试 ^_^
Doris 内部存储是借鉴了 HDFS 的存储机制的,是有副本概念的,集群默认是 3 副本来保证数据的高可用和高可靠,同时内部的自我修复机制,可以保证同一 Tablet 的某个副本损坏后,根据多数派原则来进行坏副本修复,这些是无需感知和干预的。
Doris 的存储是多级连形式存储具体的物理数据的。
首先是存储的目录,这个由 be.conf 中的 storage_root_path 来配置,在这个目录下,下一层按照 Bucket 来进行组织,在 Bucket 目录下,又根据 Tablet 来进行划分,用 tablet_id 来命名目录,那么最后在 Tablet 目录下存放实际的 Segment 数据物理文件。
Segment 物理文件默认大小是 256MB,格式分三部分,一部分是数据区域,存放具体数据,一部分是索引区域,存放 Index 数据,还有一部分是 Footer 信息,主要是存放元数据相关的信息。
高并发点查是利用 2.0 版本里的行列混存来实现的,在高并发点查的情况下有几种方式来保证资源隔离避免互相争抢导致的问题:
单位查询下吃的资源不多,那么如果并发度不是特别高的情况下,其实对 AdHoc 的影响不是很大,反而要考虑 AdHoc 是否会影响高并发点查的查询时延。本身删除数据对 Doris 而言相当于一次导入动作,所以不建议频繁的删除。
如果是大批量数据更新的时候,建议使用以下几种操作来处理:
AGG 模型的 REPLACE_IF_NOT_NULL 和 Unique Key 模型的 REPLACE 算子来完成数据的更新,这种更新无需考虑手工处理,往里灌数据即可。当前在 1.2.4.1 版本及以后版本里,都可以使用 Hive Catalog 的联邦查询能力加 INSERT INTO SELECT 语句来完成数据从外表到内表的灌入,这个灌入的效率非常快,适合定期调度脚本来同步增量的数据。
如果是大批量的数据迁移,那么在后续的 X2Doris 工具可以很好的完成这件事,X2Doris 是 Apache Doris 社区的王华杰大佬(也是 Apache StreamPark Chair)的杰作,已经处于内测阶段了,本身工具是带可视化界面的,还可以做 DDL 的可视化迁移和重新设计工作,可以极大的降低迁移工作成本。
来自用户的这三十问还是比较有难度的,希望能通过这次答疑来给大家带来一些知识收获。后续 Apache Doris 补习班还是会更多的尽可能给大家带来简洁明了但充满知识干货的系列文章,或许你要参加的下一个面试的面试官,就在这里找他问你的问题哦 ^_^