Doris 粗学 笔记

  • 通过MySQL Client 连接Doris,需要指定-P 端口
  • 关键端口 8030(web访问) 9030(mysql连接端口) 9010(审计端口)
  • 默认账号密码: root 无密码 ;同理mysql登录也无密码
  • 启动 加--daemon 守护进程
  • 估计Doris的存储空间时,除了基本的数据空间*3,还需要预留40%的空间,作为后台压缩和中间数据的存放(比如rollup表,视图表)
  • broker 作为doris的中间件,用于连接mysql,hdfs等表作为外表
  • paritition 分区 ;tablet 分桶 ; 把表比喻一小区,分区比如一个个户型,分桶比喻户型中的卧室,客厅等
  • CREATE [EXTERNAL] TABLE 				内表外表
    [IF NOT EXISTS] 
    [database.]table_name
     (column_definition1[, column_definition2, ...] 设置字段 (可分 key维度列和value指标列)
     [, index_definition1[, index_definition12,]])  设置索引
     [ENGINE = [olap|mysql|broker|hive]]    引擎 olap默认自身引擎,mysql引擎,broker自定义引擎,hive引擎,本质上只是对外部系统或系统表的映射
     [key_desc]									根据不同数据模型,设置不同key。比如Aggregation聚合模式设置AGGREGATE KEY;Uniq唯一模型设置UNIQUE KEY;Duplicate明细模型设置DUPLICATE KEY
     [COMMENT "table comment"]; 注释
     [partition_desc]           设置分区,可分range范围分区和list指定分区
     [distribution_desc]				设置分桶
     [rollup_index]
     [PROPERTIES ("key"="value", ...)]	添加配置,比如副本为3,存储介质(SSD固态,HDD磁盘),数据有SSD迁移到HDD的时间
     [BROKER PROPERTIES ("key"="value", ...)];

  • 多列分区的 range分区的数据划分:只要有一个列值符合条件就划分到一个分区内,按列值顺序依次比较,不符合匹配下一个分区
  • 多列分区的 list分区的数据划分: 必须同时符合才被划分到一个分区
  • uniq模型,必须是同时满足key相同,才会覆盖写,保证唯一性和最新性
  • Duplicate模型的duplicate key只是指定按照哪些列进行排序
  • Doris的动态分区和Hive不一样。Hive是根据值自动创建分区,而Doris的分区需要设置范围,范围之外的分区值会被删除,动态创建分区也是在这个范围内创建。当然范围可以设置为int最大值和最小值
  • Doris不支持在任意列上创建索引,而是按key维度列的顺序取前36个字节作为前缀索引,维度列长度超过则截断(遇到varchar直接截断)。类似于HBase根据字段凭借成的rowkey;
  • Duplicate明细数据模型设置rollup时,已经没有“上卷”的概念了,只是为了修改前缀索引,提高查询索引,那么设置rollup除了添加维度列,需要添加指标列吗?
  • 物化视图会根据数据的修改(插入删除修改)而自动改变;相比rollup,它只是对指定的维度列进行聚合操作,而物化视图可以自定义选择更丰富的聚合操作,是rollup的超集
  • 物化视图和rollup表是自动会在后台聚合好吗?还是即查即算?
  • Doris的delete删除,实际是特殊的导入操作,只是标记了删除的状态;当BE进行数据compacation合并完成后,才会释放磁盘空间;多副本情况下,只有多数副本删除就显示删除成功,剩余副本后台会异步删除
  • stream load方式是使用http协议将本地文件导入doris的,它支持csv和json数据格式
  • 数据导入
Block load:  LOAD LABEL db_name.label_name ...
Stream load:  curl --location-trusted -u user:passwd [-H ""...] -T data.file -
XPUT http://fe_host:http_port/api/{db}/{table}/_stream_load
Routine load: CREATE ROUTINE LOAD [db.]job_name ON tbl_name...
Binlog load:  CREATE SYNC [db.]job_name...
insert into:  
S3 load:      
  • 通过mysql client 连接doris,FE作为doris的交互角色,它分为leader,follower,observer,平时是通过jdbc连接leader主机操作doris,万一leader挂掉,虽然doris自身有负载均衡,会重新选举出新的leader,但是之前连接doris的主机IP还是原来的leader,这就导致连接失败。所以有几种方式实现高可用
    • 代码方式:通过代码进行重试和负载均衡,这个leader挂掉,循环测试连接其他FE
    • JDBC Connector:通过 jdbc:mysql://[host1][:port1],[host2][:port2][,[host3][:port3]]... [/[database]] 绑定多个FE地址,使用jdbc的重试机制
    • ProxySQL:它是mysql的中间件,代理层,就是在多个FE上架设一层proxy(代理层),来实现自动的连接负载均衡。主要是针对mysql集群(一般是主从配置,而doris的FE相当于mysql集群了,都可以是读写服务)
  • ProxySQL的两个端口,6032是管理端口(jdbc连接自身的端口),6033是对外服务端口(jdbc连接doris等对外服务的端口)
  • 安装配置基本的proxysql,然后将doris 的FE主机地址都配置到proxysql中,最后添加连接doris的账号密码;proxy可以设置哪些mysql服务专门读,或者专门写。而配置doris的FE可以先配置为10专门读。
  • mysql -udoris -pdoris -P6033 -h hadoop1 -e "show databases;" 账号密码是连接doris的账号密码,-p是proxysql的连接对外服务(doris)的端口 ,-h是proxysql的主机地址,proxysql内部已经配置doris多个FE的地址,所以只管往proxysql内提交命令,proxysql会自动路由到运行的FE上执行。
  • [broadcast ]broadcast join 广播join:类似于hive的map join,spark的broadcast join 。它将过滤后的小表广播到大表所在的各个节点上,形成一个内存hash表,然后流失读取大表的数据进行hash join。 大小表默认广播join
  • [partition] shuffle join:当小表无法加载内存中,可以显性指定shuffle join(partition join) 。即将小表和大表都按照join的key进行hash,然后进行分布式的join操作,这个对内存的消耗就会分摊到集群的所有计算节点上。
  • 在官网上学习使用SQL:快速开始 | Apache Doris
  • Spark有四种方式操作Doris,DataFrame,RDD,SparkSQL,JDBC(不推荐)
  • Flink 内部是通过Stream load操作Doris,DataStream和FlinkSQL
  • DataX不支持Doris读写,但是Doris官方提供了DataX的扩展工具,将编译好的扩展工具导入到DataX即可实现写入doris
扩展表 
审计日志插件 
Flink Doris Connector 
Spark Doris Connector 
DataX doriswriter 
Logstash Doris Output Plugin 
Doris Manager 
SeaTunnel 
自定义函数 
  • 基本所有的数据库都支持ODBC的连接操作,Doris通过ODBC可以直接操作mysql,oracle等数据库外表
  • Prometheus 和 Grafana可以监控Flink 的运行情况,以及Doris的运行情况,Doris官方在Grafana上传了监控模板,直接下载即可查看
  • 优化方式:为了更好的进行针对性的调优,Doris提供了QueryProfile,它让我们了解Doris的执行情况,比如读写情况,内存cpu资源消耗情况等。在FE的界面上查看QueryProfile情况。另外想要深入查看可以使用pprof(查看8.1.3)
  • explain 查看执行流程情况; explain graph 以图的方式查看执行流程情况
  • join性能优化:set enable_cost_based_join_reorder=true; Doris通过代价模型自动帮助调整SQL中的join顺序,以提高获取最优的join的效率。
  • 导入导出优化:主要是针对FE和BE的配置;导入超时先看监控(Grafana),再pprof调试工具+代码分析
    • 由于单个导入BE的最大处理量是3G(默认值),导入最大超时时间是4H(默认值);所以针对导入大文件的可以调大“最大处理量”和设置合理“最大超时时间”,一般超过500G,4H的文件导入建议进行文件切分。
  • 查询优化:创建Bitmap索引,BloomFilter索引
  • 合理的分区分桶数:
    • 一个表的Tablet(数据片) = Partition num(分区数) * Bucket num(分桶数) > 略大于整个集群的磁盘数量。可以单分区 或 单分桶
    • 一个数据片Tablet的数据量理论上没有大小限制,但建议1G - 10G范围内。Tablet数据量过小,聚合效果不佳,元数据管理压力大; Tablet数据量过大,不利于副本迁移补齐,增加Schema change 和 rollup失败重试的代价。(这些操作失败重试的粒度是Tablet)
    • 当Tablet的数据量原则 和 数量原则冲突时,建议优先考虑数据量原则
    • 建表时,每个分区的Bucket数量统一指定。但是在动态增加分区时,可以指定新分区的Bucket数量。一个Partition的Bucket数量一旦指定不可更改。所以在确定Bucket数量时,要考虑集群扩容的情况,不然即使扩容也不能提高并发度。
  • 备份恢复:Doris支持将当前数据以文件的形式,通过Broker备份到远程存储系统中,然后通过 恢复 命令,从远程存储系统将数据恢复到任意Doris集群。这个功能可以对Doris的数据进行快照备份或数据迁移
    • 备份:将指定表或分区的数据,以Doris存储的文件的形式,上传到远程仓库中进行存储。提交备份请求后,对数据进行快照,由BE并发完成上传仓库后,FE将对应的元数据写成本地文件,再由broker将本地元数据文件上传远程仓库,完成备份工作。
    • 恢复:指定一个远程仓库中已存在的备份,将备份内容恢复到本地集群中。提交恢复请求后,在本地集群创建对应的元数据,比如创建相应的分区表,对这个表创建一个空快照,主要是为了让BE上产生对应的快照目录,用于接收从远程仓库下载的快照文件,然后下载远程仓库的快照文件到上一步的快照目录内,下载完成后,对各个快照文件映射为当前本地表的元数据。最后重新加载使其生效。
  • 备份:现仅支持最小分区粒度的全量备份(增量未来可能实现)。如果需要对数据进行定期备份,可以在建表时合理规划分区和分桶,然后按分区定时备份。当数据量较大时,建议按分区分别执行,以降低失败重试代价
  • 数据迁移:因为备份是对通过快照完成的,所以快照阶段之后的新导入的数据不会备份,如果需要在将新数据重新导入到新集群。建议在迁移完成后,同时向新旧两个集群并行导入一段时间,确保数据和业务的正确性后,再将业务迁移到新集群。
  • 在同一个database数据库下,只能有一个正在执行的备份或恢复工作。
  • 如果恢复作业是一次覆盖操作(指定恢复数据到已经存在的表或分区中),那么集群上被覆盖的数据就不能在被还原了,即使恢复作业失败或取消,有可能造成之前的数据已损坏或无法访问。所以只能重新在执行恢复操作。建议非必要情况下,尽量不要使用覆盖的方式恢复数据,除非确认当前数据已不再使用。
  • 创建远程仓库路径:CREATE REPOSITORY `hdfs_ods_dw_backup`
    WITH BROKER `broker_name`
    ON LOCATION "hdfs://hadoop1:8020/tmp/doris_backup"
    PROPERTIES (
     "username" = "",
     "password" = ""
    )
    查看远程仓库镜像:SHOW SNAPSHOT ON `repo_name` [WHERE SNAPSHOT = "snapshot" [AND TIMESTAMP ="backup_timestamp"]];
    删除远程仓库: drop repository 'repo_name';  # 只是删除Doris的仓库映射,实际仓库数据不删
    创建备份作业语法:BACKUP SNAPSHOT [db_name].{snapshot_name}
    TO `repository_name`
    ON (
     `table_name` [PARTITION (`p1`, ...)],
     ...
    )
    PROPERTIES ("key"="value", ...);
    查看备份作业状态: show backup [from db_name];
    取消备份作业: cancel backup from db_name;
    
    
    
    创建恢复作业语法:
    RESTORE SNAPSHOT [db_name].{snapshot_name}
    FROM `repository_name`
    ON (
     `table_name` [PARTITION (`p1`, ...)] [AS `tbl_alias`],
     ...
    )
    PROPERTIES ("key"="value", ...);
    查看恢复作业状态: show restore [from db_name]; 只要状态不是cancelled(取消)就说明作业还在继续
    取消恢复作业: cancel restore from db_name;
  • doris 1.0.0 版本实验性功能:向量化执行引擎;Hive外表;laterval view 炸裂函数;mysqldump导出(这也是一种备份,数据迁移的方式);支持SeaTunnel插件。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

secretWHD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值