Doris-简介架构编译安装和数据表的基本使用

Posted 有语忆语

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Doris-简介架构编译安装和数据表的基本使用相关的知识,希望对你有一定的参考价值。

目录

1、Doris简介

Doris是由百度大数据研发,是一个现代化的MPP(Massively Parallel Processing)大规模并行处理的分析型数据库产品。仅需亚秒级响应时间即可获得查询结果,有效地支持实时数据分析。
Apache Doris 的分布式架构非常简洁,易于运维,并且可以支持 10PB 以上的超大数据集。
Apache Doris 可以满足多种数据分析需求,例如固定历史报表,实时数据分析,交互式
数据分析和探索式数据分析等。

2、Doris网址

1、官网地址
2、文档查看地址
3、下载地址
4、github地址

3、Doris架构


Doris 的架构很简洁,只设FE(Frontend)、BE(Backend)两种角色、两个进程,不依赖于外部组件,方便部署和运维,FE、BE都可线性扩展。

  • Frontend(FE),存储、维护集群元数据;负责接收、解析查询请求,规划查询计划,调度查询执行,返回查询结果。主要有三个角色:
    1)Leader 和Follower:主要是用来达到元数据的高可用,保证单节点宕机的情况下,元数据能够实时地在线恢复,而不影响整个服务。
    2)Observer:用来扩展查询节点,同时起到元数据备份的作用。如果在发现集群压力非常大的情况下,需要去扩展整个查询的能力,那么可以加observer 的节点。observer 不参与任何的写入,只参与读取。

  • Backend(BE),负责物理数据的存储和计算;依据FE 生成的物理计划,分布式地执行查询。
    数据的可靠性由BE 保证,BE 会对整个数据存储多副本或者是三副本。副本数可根据需求动态调整。

  • mysqlClient:Doris借助MySQL协议,用户使用任意MySQL的ODBC/JDBC以及MySQL的客户端,都可以直接访问Doris。

  • Broker:Broker为一个独立的无状态进程。封装了文件系统接口,提供Doris读取远端存储系统中文件的能力,包括HDFS,S3,BOS等。

3、编译和安装

3.1、软硬件需求

概述
Doris 作为一款开源的 MPP 架构 OLAP 数据库,能够运行在绝大多数主流的商用服务器上。为了能够充分运用 MPP 架构的并发优势,以及 Doris 的高可用特性,我们建议 Doris 的部署遵循以下需求:
Linux 操作系统版本需求

Linux 系统版本
CentOS7.1 及以上
Ubuntu16.04 及以上

软件需求

软件版本
Java1.8 及以上
GCC4.8.2 及以上

操作系统安装要求
设置系统最大打开文件句柄数

vi /etc/security/limits.conf 
* soft nofile 65536
* hard nofile 65536

时钟同步
Doris 的元数据要求时间精度要小于5000ms,所以所有集群所有机器要进行时钟同步,避免因为时钟问题引发的元数据不一致导致服务出现异常。

关闭交换分区(swap)
Linux交换分区会给Doris带来很严重的性能问题,需要在安装之前禁用交换分区

Liunx文件系统
这里我们推荐使用ext4文件系统,在安装操作系统的时候,请选择ext4文件系统。
开发测试环境

模块CPU内存磁盘网络实例数量
Frontend8核+8GB+SSD 或 SATA,10GB+ *千兆网卡1
Backend8核+16GB+SSD 或 SATA,50GB+ *千兆网卡1-3 *

生产环境

模块CPU内存磁盘网络实例数量(最低要求)
Frontend16核+64GB+SSD 或 RAID 卡,100GB+ *万兆网卡1-3 *
Backend16核+64GB+SSD 或 SATA,100G+ *万兆网卡3 *

注1:
1、FE 的磁盘空间主要用于存储元数据,包括日志和 image。通常从几百 MB 到几个 GB 不等。
2、BE 的磁盘空间主要用于存放用户数据,总磁盘空间按用户总数据量 * 3(3副本)计算,然后再预留额外 40% 的空间用作后台 compaction 以及一些中间数据的存放。
3、一台机器上可以部署多个 BE 实例,但是只能部署一个 FE。如果需要 3 副本数据,那么至少需要 3 台机器各部署一个 BE 实例(而不是1台机器部署3个BE实例)。多个FE所在服务器的时钟必须保持一致(允许最多5秒的时钟偏差)
4、测试环境也可以仅适用一个 BE 进行测试。实际生产环境,BE 实例数量直接决定了整体查询延迟。
5、所有部署节点关闭 Swap。
6、FE 角色分为 Follower 和 Observer,(Leader 为 Follower 组中选举出来的一种角色,以下统称 Follower)。
FE 节点数据至少为1(1 个 Follower)。当部署 1 个 Follower 和 1 个 Observer 时,可以实现读高可用。当部署 3 个 Follower 时,可以实现读写高可用(HA)。
7、Follower 的数量必须为奇数,Observer 数量随意。
8、根据以往经验,当集群可用性要求很高时(比如提供在线业务),可以部署 3 个 Follower 和 1-3 个 Observer。如果是离线业务,建议部署 1 个 Follower 和 1-3 个 Observer。
9、Broker 是用于访问外部数据源(如 HDFS)的进程。通常,在每台机器上部署一个 broker 实例即可。

默认端口号:

实例名称端口名称默认端口通讯方向说明
BEbe_port9060FE --> BEBE 上 thrift server 的端口,用于接收来自 FE 的请求
BEwebserver_port8040BE <–> BEBE 上的 http server 的端口
BEheartbeat_service_port9050FE --> BEBE 上心跳服务端口(thrift),用于接收来自 FE 的心跳
BEbrpc_port8060FE <–> BE, BE <–> BEBE 上的 brpc 端口,用于 BE 之间通讯
FEhttp_port8030FE <–> FE,用户 <–> FEFE 上的 http server 端口
FErpc_port9020BE --> FE, FE <–> FEFE 上的 thrift server 端口,每个fe的配置需要保持一致
FEquery_port9030用户 <–> FEFE 上的 mysql server 端口
FEedit_log_port9010FE <–> FEFE 上的 bdbje 之间通信用的端口
Brokerbroker_ipc_port8000FE --> Broker, BE --> BrokerBroker 上的 thrift server,用于接收请求

当部署多个 FE 实例时,要保证 FE 的 http_port 配置相同。
部署前请确保各个端口在应有方向上的访问权限。
IP 绑定
因为有多网卡的存在,或因为安装过 docker 等环境导致的虚拟网卡的存在,同一个主机可能存在多个不同的 ip。当前 Doris 并不能自动识别可用 IP。所以当遇到部署主机上有多个 IP 时,必须通过 priority_networks 配置项来强制指定正确的 IP。

priority_networks 是 FE 和 BE 都有的一个配置,配置项需写在 fe.conf 和 be.conf 中。该配置项用于在 FE 或 BE 启动时,告诉进程应该绑定哪个IP。示例如下:

priority_networks=10.1.3.0/24

这是一种 CIDR 的表示方法。FE 或 BE 会根据这个配置项来寻找匹配的IP,作为自己的 localIP。

注意:当配置完 priority_networks 并启动 FE 或 BE 后,只是保证了 FE 或 BE 自身的 IP 进行了正确的绑定。而在使用 ADD BACKEND 或 ADD FRONTEND 语句中,也需要指定和 priority_networks 配置匹配的 IP,否则集群无法建立。举例:

BE 的配置为:priority_networks=10.1.3.0/24

但是在 ADD BACKEND 时使用的是:ALTER SYSTEM ADD BACKEND “192.168.0.1:9050”;

则 FE 和 BE 将无法正常通信。

这时,必须 DROP 掉这个添加错误的 BE,重新使用正确的 IP 执行 ADD BACKEND。

FE 同理。

BROKER 当前没有,也不需要 priority_networks 这个选项。Broker 的服务默认绑定在 0.0.0.0 上。只需在 ADD BROKER 时,执行正确可访问的 BROKER IP 即可。

表名大小写敏感性设置
doris默认为表名大小写敏感,如有表名大小写不敏感的需求需在集群初始化时进行设置。表名大小写敏感性在集群初始化完成后不可再修改。

详细参见 变量 中关于lower_case_table_names变量的介绍。

3.2、编译

安装Doris,需要先通过源码编译,主要有两种方式:使用Docker开发镜像编译(推荐)、直接编译。直接编译的方式,可以参考官网:https://doris.apache.org/zh-CN/installing/compilation.html

3.2.1、安装Docker环境

1)Docker要求CentOS系统的内核版本高于3.10,首先查看系统内核版本是否满足

uname -r

2)使用root权限登录系统,确保yum包更新到最新

sudo yum update -y

3)假如安装过旧版本,先卸载旧版本

sudo yum remove docker docker-common docker-selinux docker-engine

4)安装yum-util工具包和devicemapper驱动依赖

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

5)设置yum源(加速yum下载速度)

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

如果连接超时,可以使用alibaba的镜像源:

sudo yum-config-manager --add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

6)查看所有仓库中所有docker版本,并选择特定版本安装,一般可直接安装最新版

yum list docker-ce --showduplicates | sort -r

7)安装docker
(1)安装最新稳定版本的方式:

sudo yum install docker-ce -y #安装的是最新稳定版本,因为repo中默认只开启stable仓库

(2)安装指定版本的方式:

sudo yum install -y
#例如:
sudoyum install docker-ce-20.10.11.ce -y

8)启动并加入开机启动

sudo systemctl start docker #启动
docker sudo systemctl enable docker #加入开机自启动

9)查看Version,验证是否安装成功

docker version

若出现Client和Server两部分内容,则证明安装成功。

3.2.2、使用Docker 开发镜像编译

1)下载源码并解压
通过wget下载(或者手动上传下载好的压缩包)。

wget
https://dist.apache.org/repos/dist/dev/incubator/doris/0.15/0.15.0-rc04/apache-doris-0.15.0-incubating-src.tar.gz

解压到/opt/software/

tar -zxvf apache-doris-0.15.0-incubating-src.tar.gz -C /opt/software

2)下载 Docker 镜像

docker pull apache/incubator-doris:build-env-for-0.15.0

可以通过以下命令查看镜像是否下载完成。

docker images

3)挂载本地目录运行镜像
以挂载本地 Doris 源码目录的方式运行镜像,这样编译的产出二进制文件会存储在宿主
机中,不会因为镜像退出而消失。同时将镜像中 maven 的 .m2 目录挂载到宿主机目录,以
防止每次启动镜像编译时,重复下载 maven 的依赖库。

docker run -it
-v /opt/software/.m2:/root/.m2
-v /opt/software/apache-doris-0.15.0-incubating-src/:/root/apachedoris-0.15.0-incubating-src/
\\ apache/incubator-doris:build-env-for-0.15.0

4)切换到 JDK 8

alternatives --set java java-1.8.0-openjdk.x86_64
alternatives --set javac java-1.8.0-openjdk.x86_64
export JAVA_HOME=/usr/lib/jvm/java-1.8.0

5)准备 Maven 依赖
编译过程会下载很多依赖,可以将我们准备好的 doris-repo.tar.gz 解压到 Docker 挂载的
对应目录,来避免下载依赖的过程,加速编译。

tar -zxvf doris-repo.tar.gz -C /opt/software

也可以通过指定阿里云镜像仓库来加速下载:

vim /opt/software/apache-doris-0.15.0-incubating-src/fe/pom.xml

<repositories>标签下添加:
<repository>
 <id>aliyun</id>
 <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</repository>
vim /opt/software/apache-doris-0.15.0-incubating-src/be/pom.xml
在<repositories>标签下添加:
<repository>
 <id>aliyun</id>
 <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</repository>

6)编译 Doris

sh build.sh

如果是第一次使用 build-env-for-0.15.0 或之后的版本,第一次编译的时候要使用如下命令:

sh build.sh --clean --be --fe --ui

因为 build-env-for-0.15.0 版本镜像升级了 thrift(0.9 -> 0.13),需要通过–clean 命令强制
使用新版本的 thrift 生成代码文件,否则会出现不兼容的代码。

3.3、集群部署

主机 1主机 2主机 3
FE(LEADER)FE(FOLLOWER)FE(OBSERVER)
BEBEBE
BROKERBROKERBROKER

生产环境建议 FE 和 BE 分开。

3.3.1、创建目录并拷贝编译后的文件

1)创建目录并拷贝编译后的文件

mkdir /opt/module/apache-doris-0.15.0 cp -r
/opt/software/apache-doris-0.15.0-incubating-src/output
/opt/module/apache-doris-0.15.0

2)修改可打开文件数(每个节点)

sudo vim /etc/security/limits.conf

  • soft nofile 65535
  • hard nofile 65535
  • soft nproc 65535
  • hard nproc 65535

重启永久生效,也可以用 ulimit -n 65535 临时生效。

3.3.2、部署 FE 节点

1)创建 fe 元数据存储的目录

mkdir /opt/module/apache-doris-0.15.0/doris-meta

2)修改 fe 的配置文件

vim /opt/module/apache-doris-0.15.0/fe/conf/fe.conf
#配置文件中指定元数据路径: meta_dir = /opt/module/apache-doris-0.15.0/doris-meta
#修改绑定 ip(每台机器修改成自己的 ip) priority_networks = 192.168.8.101/24

注意:
⚫ 生产环境强烈建议单独指定目录不要放在 Doris 安装目录下,最好是单独的磁盘(如果有 SSD 最好)。
⚫ 如果机器有多个 ip, 比如内网外网, 虚拟机 docker 等, 需要进行 ip 绑定,才能正确识
别。
⚫ JAVA_OPTS 默认 java 最大堆内存为 4GB,建议生产环境调整至 8G 以上。
3)启动 hadoop1 的 FE

/opt/module/apache-doris-0.15.0/fe/bin/start_fe.sh --daemon

3.3.3、配置 BE 节点

1)分发 BE

scp -r /opt/module/apache-doris-0.15.0/be hadoop2:/opt/module scp -r
/opt/module/apache-doris-0.15.0/be hadoop3:/opt/module

2)创建 BE 数据存放目录(每个节点)

mkdir /opt/module/apache-doris-0.15.0/doris-storage1 mkdir
/opt/module/apache-doris-0.15.0/doris-storage2

3)修改 BE 的配置文件(每个节点)

vim /opt/module/apache-doris-0.15.0/be/conf/be.conf
#配置文件中指定数据存放路径: storage_root_path = /opt/module/apache-doris-0.15.0/dorisstorage1;/opt/module/apache-doris-0.15.0/doris-storage2
#修改绑定 ip(每台机器修改成自己的 ip) priority_networks = 192.168.8.101/24

注意:
⚫ storage_root_path 默认在 be/storage 下,需要手动创建该目录。多个路径之间使用英文状
态的分号;分隔(最后一个目录后不要加)。
⚫ 可以通过路径区别存储目录的介质,HDD 或 SSD。可以添加容量限制在每个路径的末尾,通过英文状态逗号,隔开,如:
storage_root_path=/home/disk1/doris.HDD,50;/home/disk2/doris.SSD,10;/home/disk2/doris
说明:
/home/disk1/doris.HDD,50,表示存储限制为 50GB,HDD;
/home/disk2/doris.SSD,10,存储限制为 10GB,SSD;
/home/disk2/doris,存储限制为磁盘最大容量,默认为 HDD
⚫ 如果机器有多个 IP, 比如内网外网, 虚拟机 docker 等, 需要进行 IP 绑定,才能正确识别。

3.3.4、在 FE 中添加所有 BE 节点

BE 节点需要先在 FE 中添加,才可加入集群。可以使用 mysql-client 连接到 FE。
1)安装 MySQL Client
(1)创建目录

mkdir /opt/software/mysql-client/

(2)上传相关以下三个 rpm 包到/opt/software/mysql-client/
➢ mysql-community-client-5.7.28-1.el7.x86_64.rpm
➢ mysql-community-common-5.7.28-1.el7.x86_64.rpm
➢ mysql-community-libs-5.7.28-1.el7.x86_64.rpm
(3)检查当前系统是否安装过 MySQL

sudo rpm -qa|grep mariadb
#如果存在,先卸载
sudo rpm -e --nodeps mariadb mariadb-libs mariadb-server

(4)安装

rpm -ivh /opt/software/mysql-client/*

2)使用 MySQL Client 连接 FE

mysql -h hadoop1 -P 9030 -uroot

默认 root 无密码,通过以下命令修改 root 密码。

SET PASSWORD FOR ‘root’ = PASSWORD(‘000000’);

3)添加 BE

ALTER SYSTEM ADD BACKEND “hadoop1:9050”;
ALTER SYSTEM ADD BACKEND “hadoop2:9050”;
ALTER SYSTEM ADD BACKEND “hadoop3:9050”;

4)查看 BE 状态

SHOW PROC ‘/backends’;

3.3.5、启动 BE

1)启动 BE(每个节点)

/opt/module/apache-doris-0.15.0/be/bin/start_be.sh --daemon

2)查看 BE 状态

mysql -h hadoop1 -P 9030 -uroot -p
SHOW PROC ‘/backends’;

Alive 为 true 表示该 BE 节点存活。

3.3.6、部署 FS_Broker(可选)

Broker 以插件的形式,独立于 Doris 部署。如果需要从第三方存储系统导入数据,需要部署相应的 Broker,默认提供了读取 HDFS、百度云 BOS 及 Amazon S3 的 fs_broker。fs_broker 是无状态的,建议每一个 FE 和 BE 节点都部署一个 Broker。
1)编译 FS_BROKER 并拷贝文件
(1)进入源码目录下的 fs_brokers 目录,使用 sh build.sh 进行编译
(2)拷贝源码 fs_broker 的 output 目录下的相应 Broker 目录到需要部署的所有节点上,改名为: apache_hdfs_broker。建议和 BE 或者 FE 目录保持同级。
方法同 2.2。
2)启动 Broker

/opt/module/apache-doris-0.15.0/apache_hdfs_broker/bin/start_broker.sh
–daemon

3)添加 Broker
要让 Doris 的 FE 和 BE 知道 Broker 在哪些节点上,通过 sql 命令添加 Broker 节
点列表。
(1)使用 mysql-client 连接启动的 FE,执行以下命令:

mysql -h hadoop1 -P 9030 -uroot -p
ALTER SYSTEM ADD BROKER broker_name “hadoop1:8000”,“hadoop2:8000”,“hadoop3:8000”;

其中 broker_host 为 Broker 所在节点 ip;broker_ipc_port 在 Broker 配置文件中的
conf/apache_hdfs_broker.conf。
4)查看 Broker 状态
使用 mysql-client 连接任一已启动的 FE,执行以下命令查看 Broker 状态:

SHOW PROC “/brokers”;

注:在生产环境中,所有实例都应使用守护进程启动,以保证进程退出后,会被自动拉
起,如 Supervisor(opens new window)。如需使用守护进程启动,在 0.9.0 及之前版本中,
需要修改各个 start_xx.sh 脚本,去掉最后的 & 符号。从 0.10.0 版本开始,直接调用 sh
start_xx.sh 启动即可。

3.4、扩容和缩容

Doris 可以很方便的扩容和缩容 FE、BE、Broker 实例。

3.4.1 FE 扩容和缩容

可以通过将 FE 扩容至 3 个以上节点来实现 FE 的高可用。
1)使用 MySQL 登录客户端后,可以使用 sql 命令查看 FE 状态,目前就一台 FE

mysql -h hadoop1 -P 9030 -uroot -p

SHOW PROC ‘/frontends’;

也可以通过页面访问进行监控,访问 8030,账户为 root,密码默认为空不用填写。
2)增加 FE 节点
FE 分为 Leader,Follower 和 Observer 三种角色。 默认一个集群,只能有一个 Leader,可以有多个 Follower 和 Observer。其中 Leader 和 Follower 组成一个 Paxos 选择组,如果Leader 宕机,则剩下的 Follower 会自动选出新的 Leader,保证写入高可用。Observer 同步Leader 的数据,但是不参加选举。
如果只部署一个 FE,则 FE 默认就是 Leader。在此基础上,可以添加若干 Follower 和Observer。

ALTER SYSTEM ADD FOLLOWER “hadoop2:9010”;

ALTER SYSTEM ADD OBSERVER “hadoop3:9010”;

3)配置及启动 Follower 和 Observer
第一次启动时,启动命令需要添加参–helper leader 主机: edit_log_port:
(1)分发 FE,修改 FE 的配置(同 2.4.2)

scp -r /opt/module/apache-doris-0.15.0/fe hadoop2:/opt/module/
apache-doris-0.15.0

scp -r /opt/module/apache-doris-0.15.0/fe hadoop3:/opt/module/
apache-doris-0.15.0

(2)在 hadoop2 启动 Follower

/opt/module/apache-doris-0.15.0/fe/bin/start_fe.sh --helper
hadoop1:9010 --daemon

(3)在 hadoop3 启动 Observer

/opt/module/apache-doris-0.15.0/fe/bin/start_fe.sh --helper
hadoop1:9010 --daemon

4)查看运行状态
使用 mysql-client 连接到任一已启动的 FE。

SHOW PROC ‘/frontends’;

5)删除 FE 节点命令

ALTER SYSTEM DROP FOLLOWER[OBSERVER] “fe_host:edit_log_port”;

注意:删除 Follower FE 时,确保最终剩余的 Follower(包括 Leader)节点为奇数。

3.4.2 BE 扩容和缩容

1)增加 BE 节点
在 MySQL 客户端,通过 ALTER SYSTEM ADD BACKEND 命令增加 BE 节点。
2)DROP 方式删除 BE 节点(不推荐)

ALTER SYSTEM DROP BACKEND “be_host:be_heartbeat_service_port”;

注意:DROP BACKEND 会直接删除该 BE,并且其上的数据将不能再恢复!!!所以我们强烈不推荐使用 DROP BACKEND 这种方式删除 BE 节点。当你使用这个语句时,会有对应的防误操作提示。
3)DECOMMISSION 方式删除 BE 节点(推荐)

ALTER SYSTEM DECOMMISSION BACKEND
“be_host:be_heartbeat_service_port”;

⚫ 该命令用于安全删除 BE 节点。命令下发后,Doris 会尝试将该 BE 上的数据向其他 BE 节点迁移,当所有数据都迁移完成后,Doris 会自动删除该节点。
⚫ 该命令是一个异步操作。执行后,可以通过 SHOW PROC ‘/backends’; 看到该 BE 节点的 isDecommission 状态为 true。表示该节点正在进行下线。
⚫ 该命令不一定执行成功。比如剩余 BE 存储空间不足以容纳下线 BE 上的数据,或者剩余机器数量不满足最小副本数时,该命令都无法完成,并且 BE 会一直处于
isDecommission 为 true 的状态。
⚫ DECOMMISSION 的进度,可以通过 SHOW PROC ‘/backends’; 中的 TabletNum 查看,如果正在进行,TabletNum 将不断减少。
⚫ 该操作可以通过如下命令取消:

CANCEL DECOMMISSION BACKEND “be_host:be_heartbeat_service_port”;

取消后,该 BE 上的数据将维持当前剩余的数据量。后续 Doris 重新进行负载均衡。

3.4.3 Broker 扩容缩容

Broker 实例的数量没有硬性要求。通常每台物理机部署一个即可。Broker 的添加和删除可以通过以下命令完成:

ALTER SYSTEM ADD BROKER broker_name “broker_host:broker_ipc_port”;

ALTER SYSTEM DROP BROKER broker_name “broker_host:broker_ipc_port”;

ALTER SYSTEM DROP ALL BROKER broker_name;

Broker 是无状态的进程,可以随意启停。当然,停止后,正在其上运行的作业会失败,重试即可。

4、数据表的基本使用

4.1、创建用户和数据库

1)创建test用户

mysql -h hadoop1 -P 9030 -uroot -p
create user ‘test’ identified by ‘test’;

2)创建数据库

create database test_db;

3)用户授权

grant all on test_db to test;

4.2、Doris中数据表的基本概念

在Doris中,数据都以关系表(Table)的形式进行逻辑上的描述。

4.2.1、Row&Column

一张表包含行(Row)和列(Column)。Row 即用户的一行数据。Column 用于描述一行数据中不同的字段。

  • 在默认的数据模型中,Column 只分为排序列和非排序列。存储引擎会按照排序列对数据进行排序存储,并建立稀疏索引,以便在排序数据上进行快速查找。
  • 而在聚合模型中,Column 可以分为两大类:Key 和 Value。从业务角度看,Key 和Value 可以分别对应维度列和指标列。从聚合模型的角度来说,Key 列相同的行,会聚合成一行。其中 Value 列的聚合方式由用户在建表时指定。

4.2.2、Partition&Tablet

在 Doris 的存储引擎中,用户数据首先被划分成若干个分区(Partition),划分的规则通常是按照用户指定的分区列进行范围划分,比如按时间划分。而在每个分区内,数据被进一
步的按照 Hash 的方式分桶,分桶的规则是要找用户指定的分桶列的值进行 Hash 后分桶。每个分桶就是一个数据分片(Tablet),也是数据划分的最小逻辑单元。

  • Tablet 之间的数据是没有交集的,独立存储的。Tablet 也是数据移动、复制等操作的最小物理存储单元。
  • Partition 可以视为是逻辑上最小的管理单元。数据的导入与删除,都可以或仅能针对一个 Partition 进行。

4.3、建表示例

4.3.1、建表语法

使用 CREATE TABLE 命令建立一个表(Table)。更多详细参数可以查看:

help create table;

建表语法:

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [database.]table_name
(column_definition1[, column_definition2, …]
[, index_definition1[, index_definition12,]])
[ENGINE = [olap|mysql|broker|hive]]
[key_desc]
[COMMENT “table comment”];
[partition_desc]
[distribution_desc]
[rollup_index]
[PROPERTIES (“key”=“value”, …)]
[BROKER PROPERTIES (“key”=“value”, …)];

Doris建表是一个同步命令,命令返回成功,即表示建表成功。
Doris 支持支持单分区和复合分区两种建表方式。
1)复合分区:既有分区也有分桶
第一级称为 Partition,即分区。用户可以指定某一维度列作为分区列(当前只支持整型和时间类型的列),并指定每个分区的取值范围。
第二级称为 Distribution,即分桶。用户可以指定一个或多个维度列以及桶数对数据进行 HASH 分布。
2)单分区:只做 HASH 分布,即只分桶。

4.3.2、字段类型

字段类型名类型字节单位长度
TINYINT1 字节范围:-2^7 + 1 ~ 2^7 - 1
SMALLINT2 字节范围:-2^15 + 1 ~ 2^15 - 1
INT4 字节范围:-2^31 + 1 ~ 2^31 - 1
BIGINT8 字节范围:-2^63 + 1 ~ 2^63 - 1
LARGEINT16 字节范围:-2^127 + 1 ~ 2^127 - 1
FLOAT4 字节支持科学计数法
DOUBLE12 字节支持科学计数法
DECIMAL[(precision, scale)]16 字节保证精度的小数类型。默认是DECIMAL(10, 0)precision: 1 ~ 27scale: 0 ~ 9其中整数部分为 1 ~ 18不支持科学计数法
DATE3 字节范围:0000-01-01 ~ 9999-12-31
DATETIME8 字节范围:0000-01-01 00:00:00 ~ 9999-12-31 23:59:59
CHAR[(length)]定长字符串。长度范围:1 ~ 255。默认为 1
VARCHAR[(length)]变长字符串。长度范围:1 ~ 65533
BOOLEAN与 TINYINT 一样,0 代表 false,1 代表 true
HLL1~16385 个字节hll 列类型,不需要指定长度和默认值、长度根据数据的聚合程度系统内控制,并且 HLL 列只能通过 配 套 的 hll_union_agg 、Hll_cardinality、hll_hash 进行查询或使用
BITMAPbitmap 列类型,不需要指定长度和默认值。表示整型的集合,元素最大支持到 2^64 - 1
STRING变长字符串,0.15 版本支持,最大支持 2147483643 字节(2GB-4),长度还受 be 配置string_type_soft_limit, 实际能存储的最大长度取两者最小值。只能用在 value 列,不能用在 key 列和分区、分桶列

注意:聚合模型在定义字段类型后,可以指定字段的 agg_type 聚合类型,如果不指定,则该列为 key 列。否则,该列为value 列, 类型包括:SUM、MAX、MIN、REPLACE。

4.3.3、Doris建表示例

4.3.3.1、Range Partition

CREATE TABLE IF NOT EXISTS example_db.expamle_range_tbl
(
 `user_id` LARGEINT NOT NULL COMMENT "用户 id",
 `date` DATE NOT NULL COMMENT "数据灌入日期时间",
 `timestamp` DATETIME NOT NULL COMMENT "数据灌入的时间戳",
 `city` VARCHAR(20) COMMENT "用户所在城市",
 `age` SMALLINT COMMENT "用户年龄",
 `sex` TINYINT COMMENT "用户性别",
 `last_visit_date` DATETIME REPLACE DEFAULT "1970-01-01 
00:00:00" COMMENT "用户最后一次访问时间",
 `cost` BIGINT SUM DEFAULT "0" COMMENT "用户总消费",
 `max_dwell_time` INT MAX DEFAULT "0" COMMENT "用户最大停留时间",
 `min_dwell_time` INT MIN DEFAULT "99999" COMMENT "用户最小停留时间"
)
ENGINE=OLAP
AGGREGATE KEY(`user_id`,`date`,`timestamp`,`city`,`age`,`sex`)
partition by range(`date`)
(
PARTITION `p201701` VALUES LESS THAN ("2017-02-01"),
 PARTITION `p201702` VALUES LESS THAN ("2017-03-01"),
 PARTITION `p201703` VALUES LESS THAN ("2017-04-01")
)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 16 
PROPERTIES
(
"replication_num" = "3",
 "storage_medium" = "SSD",
 "storage_cooldown_time" = "2018-01-01 12:00:00"
)

 

4.3.3.2、 List Partition

CREATE TABLE IF NOT EXISTS example_db.expamle_list_tbl
(
 `user_id` LARGEINT NOT NULL COMMENT "用户 id",
 `date` DATE NOT NULL COMMENT "数据灌入日期时间",
 `timestamp` DATETIME NOT NULL COMMENT "数据灌入的时间戳",
 `city` VARCHAR(20) COMMENT "用户所在城市",
 `age` SMALLINT COMMENT "用户年龄",
 `sex` TINYINT COMMENT "用户性别",
 `last_visit_date` DATETIME REPLACE DEFAULT "1970-01-01 
00:00:00" COMMENT "用户最后一次访问时间",
 `cost` BIGINT SUM DEFAULT "0" COMMENT "用户总消费",
 `max_dwell_time` INT MAX DEFAULT "0" COMMENT "用户最大停留时间",
 `min_dwell_time` INT MIN DEFAULT "99999" COMMENT "用户最小停留时
间"
)
ENGINE=olap
AGGREGATE KEY(`user_id`, `date`, `timestamp`, `city`, `age`, `sex`)
PARTITION BY LIST(`city`)
(
 PARTITION `p_cn` VALUES IN ("Beijing", "Shanghai", "Hong Kong"),
 PARTITION `p_usa` VALUES IN ("New York", "San Francisco"),
 PARTITION `p_jp` VALUES IN ("Tokyo")
)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 16
PROPERTIES
(
 "replication_num" = "3",
 "storage_medium" = "SSD",
 "storage_cooldown_time" = "2018-01-01 12:00:00"
);

4.3.4、数据划分

4.3.4.1、列定义

以 AGGREGATE KEY 数据模型为例进行说明。更多数据模型参阅 Doris 数据模型。
列的基本类型,可以通过在 mysql-client 中执行 HELP CREATE TABLE; 查看。
AGGREGATE KEY 数据模型中,所有没有指定聚合方式(SUM、REPLACE、MAX、
MIN)的列视为 Key 列。而其余则为 Value 列。
定义列时,可参照如下建议:
➢ Key 列必须在所有 Value 列之前。
➢ 尽量选择整型类型。因为整型类型的计算和查找比较效率远高于字符串。
➢ 对于不同长度的整型类型的选择原则,遵循够用即可。
➢ 对于 VARCHAR 和 STRING 类型的长度,遵循 够用即可。
➢ 所有列的总字节长度(包括 Key 和 Value)不能超过 100KB。

4.3.4.2、分区与分桶

Doris 支持两层的数据划分。第一层是 Partition,支持 Range 和 List 的划分方式。第二层是 Bucket(Tablet),仅支持 Hash 的划分方式。
也可以仅使用一层分区。使用一层分区时,只支持 Bucket 划分。

4.3.4.2.1、Partition

➢ Partition 列可以指定一列或多列。分区类必须为 KEY 列。多列分区的使用方式在后面介绍。
➢ 不论分区列是什么类型,在写分区值时,都需要加双引号。
➢ 分区数量理论上没有上限。
➢ 当不使用 Partition 建表时,系统会自动生成一个和表名同名的,全值范围的
Partition。该 Partition 对用户不可见,并且不可删改。
1) Range 分区
分区列通常为时间列,以方便的管理新旧数据。不可添加范围重叠的分区。
Partition 指定范围的方式
⚫ VALUES LESS THAN (…) 仅指定上界,系统会将前一个分区的上界作为该分区的下界,生成一个左闭右开的区间。分区的删除不会改变已存在分区的范围。删除分区可能出现空洞。
⚫ VALUES […) 指定同时指定上下界,生成一个左闭右开的区间。
通过 VALUES […) 同时指定上下界比较容易理解。这里举例说明,当使用 VALUES
LESS THAN (…) 语句进行分区的增删操作时,分区范围的变化情况:
(1)如上 expamle_range_tbl 示例,当建表完成后,会自动生成如下 3 个分区:

p201701: [MIN_VALUE, 2017-02-01)
p201702: [2017-02-01, 2017-03-01)
p201703: [2017-03-01, 2017-04-01)

(2)增加一个分区 p201705 VALUES LESS THAN (“2017-06-01”),分区结果如下:

p201701: [MIN_VALUE, 2017-02-01)
p201702: [2017-02-01, 2017-03-01)
p201703: [2017-03-01, 2017-04-01)
p201705: [2017-04-01, 2017-06-01)

(3)此时删除分区 p201703,则分区结果如下:

p201701: [MIN_VALUE, 2017-02-01)
p201702: [2017-02-01, 2017-03-01)
p201705: [2017-04-01, 2017-06-01)

注意到 p201702 和 p201705 的分区范围并没有发生变化,而这两个分区之间,出现了一个空洞:[2017-03-01, 2017-04-01)。即如果导入的数据范围在这个空洞范围内,是无法导入的。
(4)继续删除分区 p201702,分区结果如下:

p201701: [MIN_VALUE, 2017-02-01)
p201705: [2017-04-01, 2017-06-01)

空洞范围变为:[2017-02-01, 2017-04-01)
(5)现在增加一个分区 p201702new VALUES LESS THAN (“2017-03-01”),分区结果如下:

p201701: [MIN_VALUE, 2017-02-01)
p201702new: [2017-02-01, 2017-03-01)
p201705: [2017-04-01, 2017-06-01)

可以看到空洞范围缩小为:[2017-03-01, 2017-04-01)
(6)现在删除分区 p201701,并添加分区 p201612 VALUES LESS THAN (“2017-01-01”)

Apache Doris 编译部署

标签(空格分隔): Doris系列


一:Doris 的介绍

1.1 Doris 的概述

Doris由百度大数据部研发,之前叫百度Palo,于2017年开源,2018年贡献到 Apache 社区后,更名为Doris。

Apache Doris是一个现代化的基于MPP(大规模并行处理)技术的分析型数据库产品。简单来说,MPP是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,将各自部分的结果汇总在一起得到最终的结果(与Hadoop相似)。仅需亚秒级响应时间即可获得查询结果,有效地支持实时数据分析。
Apache Doris可以满足多种数据分析需求,例如固定历史报表,实时数据分析,交互式数据分析和探索式数据分析等。令您的数据分析工作更加简单高效!

1.2 Doris的特点

1.性能卓越
TPC-H、TPC-DS性能领先,性价比高,高并发查询,100台集群可达10w QPS,流式导入单节点50MB/s,小批量导入毫秒延迟
2. 简单易用
高度兼容MySql协议;支持在线表结构变更高度集成,不依赖于外部存储系统
3.扩展性强
架构优雅,单集群可以水平扩展至200台以上
4.高可用性
多副本,元数据高可用

二: OLTP、OLAP 的介绍

2.1 概念介绍:

概念
    联机事务处理 OLTP(On-Line Transaction Processing)。
操作型处理,叫联机事务处理OLTP(On-Line Transaction Processing),主要目标是做数据处理,它是针对具体业务在数据库联机的日常操作,通常对少数记录进行查询、修改。
用户较为关心操作的响应时间、数据的安全性、完整性和并发支持的用户数等问题。
传统的关系型数据库系统(RDBMS)作为数据管理的主要手段,主要用于操作型处理。

 常用的数据库有:Oracle ,MySQL , sqlserver,postresql 

    联机分析处理 OLAP(On-Line Analytical Processing)。
      分析型处理,叫联机分析处理OLAP(On-Line Analytical Processing),主要目标是做数据分析。
一般针对某些主题的历史数据进行复杂的多维分析,支持管理决策。
数据仓库是OLAP系统的一个典型示例,主要用于数据分析。

2.2 OLAP 引擎介绍

OLAP按存储器的数据存储格式分为MOLAP(Multi-dimensional OLAP) 、ROLAP(Relational OLAP)和 HOLAP(Hybrid OLAP)。

MOLAP,基于多维数组的存储模型,也是OLAP最初的形态,特点是对数据进行预计算,以空间换效率,明细和聚合数据都保存在cube中。但生成cube需要大量时间和空间。MOLAP可选Kylin、Druid等开源产品。

ROLAP,完全基于关系模型进行存储数据,不需要预计算,按需即时查询。明细和汇总数据都保存在关系型数据库事实表中。

HOLAP,混合模型,细节数据以ROLAP存放,聚合数据以MOLAP存放。这种方式相对灵活,且更加高效。

doris是一个ROLAP引擎, 可以满足:灵活多维分析、明细+聚合、主键更新

2.3 Doris 的使用场景

Doris的具体使用场景,主要是它的接收数据源,以及它的一个整体的模块,还有最后它的一个可视化的呈现。后面会有一张更详细的图去介绍它整个的来源,以及最后可以输出的数据流向。
一般情况下,用户的原始数据,比如日志或者在事务型数据库中的数据,经过流式系统或离线处理后,导入到Doris中以供上层的报表工具或者数据分析师查询使用。

三:Doris 的原理与架构

3.1 doris 架构:

Doris主要整合了Google Mesa(数据模型),Apache Impala(MPP Query Engine)和Apache ORCFile (存储格式,编码和压缩) 的技术。

Mesa可以满足我们许多存储需求的需求,但是Mesa本身不提供SQL查询引擎。

Impala是一个非常好的MPP SQL查询引擎,但是缺少完美的分布式存储引擎。

自研列式存储:存储层对存储数据的管理通过storage_root_path路径进行配置,路径可以是多个。存储目录下一层按照分桶进行组织,分桶目录下存放具体的tablet,按照tablet_id命名子目录。


3.2 doris 名词说明:

Doris的架构很简洁,使用MySQL协议,用户可以使用任何MySQL ODBC/JDBC和MySQL客户端直接访问Doris,只设FE(Frontend)、BE(Backend)两种角色、两个进程,不依赖于外部组件,方便部署和运维。
FE:Frontend,即 Doris 的前端节点。主要负责接收和返回客户端请求、元数据以及集群管理、查询计划生成等工作
BE:Backend,即 Doris 的后端节点。主要负责数据存储与管理、查询计划执行等工作。
FE,BE都可线性扩展
FE主要有两个角色,一个是follower,另一个是observer。多个follower组成选举组,会选出一个master,master是follower的一个特例,Master跟follower,主要是用来达到元数据的高可用,保证单节点宕机的情况下,元数据能够实时地在线恢复,而不影响整个服务。
Observer节点仅从 leader 节点进行元数据同步,不参与选举。可以横向扩展以提供元数据的读服务的扩展性。
数据的可靠性由BE保证,BE会对整个数据存储多副本或者是三副本。副本数可根据需求动态调整。 

四:doris 编译安装

4.1 环境介绍

系统:centos7.9x64

主机名:
cat /etc/hosts 
-----
172.16.10.11    flyfishsrvs01 
172.16.10.12    flyfishsrvs02
172.16.10.13    flyfishsrvs03
172.16.10.14    flyfishsrvs04
172.16.10.15    flyfishsrvs05
172.16.10.16    flyfishsrvs06
172.16.10.17    flyfishsrvs07
------

系统安装好docker:
docker 安装省略

docker images 

下载好doris 的源码编译包:
wget https://dlcdn.apache.org/incubator/doris/0.15.0-incubating/apache-doris-0.15.0-incubating-src.tar.gz

4.2 doris 编译

编译用的机器最好采用阿里云云主机:

拉取Doris官方提供的Docker镜像,目前可用版本有:build-env、build-env-1.1、build-env-1.2、build-env-1.4.1、build-env-1.4.2

docker pull apache/incubator-doris:build-env-1.4.2

docker run -it -v /export/softwares/.m2:/root/.m2 -v /export/software/incubator-doris-DORIS-0.15.0-release/:/root/incubator-doris-DORIS-0.15.0-release/ apache/incubator-doris:build-env-1.4.2

 apache/incubator-doris:build-env-1.4.2

把 apache-doris-0.15.0-incubating-src.tar.gz 复制到容器里面 解压
cd  apache-doris-0.15.0-incubating-src
sh build.sh

将 dorios 所需要文件copy 出来

docker ps -a |grep dorios

mkdir doris-software

docker cp 1b47f1efea87:/root/apache-doris-0.15.0-incubating-src/output doris-software/

cd doris-software/output 

ls -ld * 

将 doris-software 打包 留作部署

tar -zcvf doris-software-0.15.0.tar.gz  output


以上是关于Doris-简介架构编译安装和数据表的基本使用的主要内容,如果未能解决你的问题,请参考以下文章

Doris hdfs数据导入doris动态分区表

字节跳动基于Doris的湖仓分析探索实践

Doris实践——Doris编译安装及环境准备

Doris的单机部署与安装

Flink进阶篇-CDC 原理实践和优化&采集到Doris中

Doris+Flink搭建数据平台