DorisDB快速实战

408 阅读3分钟

最佳实践

建表

数据模型选择

Doris 数据模型上目前分为三类: AGGREGATE KEY, UNIQUE KEY, DUPLICATE KEY。三种模型中数据都是按KEY进行排序。

AGGREGATE KEY

AGGREGATE KEY相同时,新旧记录进行聚合,目前支持的聚合函数有SUM, MIN, MAX, REPLACE。

AGGREGATE KEY模型可以提前聚合数据, 适合报表和多维分析业务。

CREATE TABLE site_visit
(
    siteid      INT,
    city        SMALLINT,
    username    VARCHAR(32),
    pv BIGINT   SUM DEFAULT '0'
)
AGGREGATE KEY(siteid, city, username)
DISTRIBUTED BY HASH(siteid) BUCKETS 10;

UNIQUE KEY

UNIQUE KEY 相同时,新记录覆盖旧记录。在1.2版本之前,UNIQUE KEY 实现上和 AGGREGATE KEY 的 REPLACE 聚合方法一样,二者本质上相同,自1.2版本我们给UNIQUE KEY引入了merge on write实现,该实现有更好的聚合查询性能。适用于有更新需求的分析业务。

CREATE TABLE sales_order
(
    orderid     BIGINT,
    status      TINYINT,
    username    VARCHAR(32),
    amount      BIGINT DEFAULT '0'
)
UNIQUE KEY(orderid)
DISTRIBUTED BY HASH(orderid) BUCKETS 10;

DUPLICATE KEY

只指定排序列,相同的行不会合并。适用于数据无需提前聚合的分析业务。

CREATE TABLE session_data
(
    visitorid   SMALLINT,
    sessionid   BIGINT,
    visittime   DATETIME,
    city        CHAR(20),
    province    CHAR(20),
    ip          varchar(32),
    brower      CHAR(20),
    url         VARCHAR(1024)
)
DUPLICATE KEY(visitorid, sessionid)
DISTRIBUTED BY HASH(sessionid, visitorid) BUCKETS 10;

这里鄙人浅尝一下:聚合模式看业务场景使用,它比较适用于星状拓扑的多维度分析指标数据;唯一键模式类似聚合模式,不过聚合模式的Replace方法相对来讲效率较低,由于唯一键引入了merge on write优化了查询效率,更加适合覆盖更新的高频查询场景;复制模式限制较弱,肯定会带来效率的低下,不过我没有尝试,毕竟我的场景是统计相关~,哪里油桶了解可以普及一波~

快速体验Doris服务

  1. 安装Dcoker/Docker Compose
参照:https://docs.docker.com/engine/install/ubuntu/

  1. 配置Docker镜像加速
这里要着重说明下,我开始用的是docker默认镜像源,由于太慢,替换为了阿里云镜像源,但是在下载be镜像文件的时候,也非常的慢,所以最终换了个DaoCloud,速度是真香~
参照:https://www.daocloud.io/mirror
  1. 下载Doris镜像文件
参照:https://doris.apache.org/zh-CN/docs/dev/install/construct-docker/run-docker-cluster

将以下内容保存在docker-compose.yaml文本中

version: '3'
services:
  docker-fe:
    image: "apache/doris:1.2.1-fe-x86_64"
    container_name: "doris-fe"
    hostname: "fe"
    environment:
      - FE_SERVERS=fe1:172.20.80.2:9010
      - FE_ID=1
    ports:
      - 8030:8030
      - 9030:9030
    volumes:
      - /data/fe/doris-meta:/opt/apache-doris/fe/doris-meta
      - /data/fe/conf:/opt/apache-doris/fe/conf
      - /data/fe/log:/opt/apache-doris/fe/log
    networks:
      doris_net:
        ipv4_address: 172.20.80.2
  docker-be:
    image: "apache/doris:1.2.1-be-x86_64"
    container_name: "doris-be"
    hostname: "be"
    depends_on:
      - docker-fe
    environment:
      - FE_SERVERS=fe1:172.20.80.2:9010
      - BE_ADDR=172.20.80.3:9050
    ports:
      - 8040:8040
    volumes:
      - /data/be/storage:/opt/apache-doris/be/storage
      - /data/be/conf:/opt/apache-doris/be/conf
      - /data/be/script:/docker-entrypoint-initdb.d
      - /data/be/log:/opt/apache-doris/be/log
    networks:
      doris_net:
        ipv4_address: 172.20.80.3
networks:
  doris_net:
    ipam:
      config:
        - subnet: 172.20.80.0/16

  1. 执行Doris镜像文件
sudo docker-compose up -d
在这个上述命令前,优先执行 sudo systcl -w vm.max_map_count=20000000,否则会出现连接节点异常的问题,如何查看连接不上节点,请去看容器日志;

2023.03.04时,自己按照文档去执行的时候发生了systcl command not found问题,解决方式 sudo /sbin/sysctl -w vm.max_map_count=20000000
  1. 尝试连接
mysql -uroot -P 9030 理论上就可以连接上了,实际就是密码为空,你填写个ip和port就足够了~

好了,今天先把油桶们带进场子,明天在详细讲下效率问题