docker集群部署doris
1. 前言
这篇文章主要讲述如何在 docker 环境下搭建 doris 集群,以及一些注意事项。开始前请参考下必备技能表
技能槽 | 熟练度 |
---|---|
docker
|
熟悉 |
dockerfile
|
熟悉 |
docker-compose
|
熟悉 |
linux
|
熟悉 |
ctrl + c , ctrl + v
|
精通 |
如果已经具备以上技能,并满足对应的熟练度要求,那么请继续,反之去熟悉一下技能
2. 简介
引用官网一句话
支持对海量大数据进行快速分析的 MPP 数据库
官网地址:https://doris.apache.org
3. 编译
由于官方没有直接给出编译后的程序,所以只能自己编译后使用
个人猜测应该是在 apache 还处于孵化阶段的原因。
本教程使用官方比较推荐的 docker
方式编译
3.1. 源码下载
前往github下载 Apache Doris 0.14.0 (incubating) Release
源码
3.2. 环境搭建
将源码解压至当前目录的source/0.14.0
下
如对 docker-compose 比较了解的话,目录放哪都无所谓,只要能挂在到容器的
/root/source
即可
创建 build.yml
并键入以下内容
version: "3.7"networks:doris-build:name: doris-builddriver: bridgeservices:doris-build:image: apachedoris/doris-dev:build-env-1.2container_name: devhostname: devprivileged: truecommand: ["source/0.14.0/build.sh"]volumes:- ./data/.m2:/root/.m2- ./source:/root/sourcenetworks:- doris-build
3.3. 编译源码
执行 docker-compose -f build.yml up
,等待执行完毕,整个过程大概需要十分钟左右,因此第一次需要到mavan
下载第三方库。
如果期间遇到
Could not transfer artifact net.sourceforge.czt.dev:cup-maven-plugin:pom:1.6-cdh from/to xxx
问题,根据 github 上的 PR 修改下fe/pom.xml
的cloudera
仓库
此时你会在源码的目录下得到output
文件夹,目录结构如下
source/0.14.0/output/
├── be
│ ├── bin
│ ├── conf
│ ├── lib
│ └── www
├── fe
│ ├── bin
│ ├── conf
│ ├── lib
│ ├── spark-dpp
│ └── webroot
└── udf├── include└── lib
4. 运行
鉴于编译环境用 docker
,那么我们运行的时候也使用 docker
4.1. 制作镜像
新建Dockerfile
并键入以下内容
FROM centos:7.5.1804RUN \yum clean metadata && \yum -y install epel-release && \yum clean metadata && \yum -y install make which tar rpm-build yum-utils python-argparse python-yaml java-1.8.0-openjdk-devel gcc gcc-c|| createrepo jq glibc-static krb5-workstation openssh-clients && \yum clean allENV JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdkRUN mkdir -p /home/dorisCOPY ./source/0.14.0/output/fe /home/doris/feCOPY ./source/0.14.0/output/be /home/doris/beCOPY ./source/0.14.0/fs_brokers/apache_hdfs_broker/output/apache_hdfs_broker /home/doris/fs_broker
运行docker build --pull --rm -f Dockerfile -t doris:0.14.00 .
编译镜像
4.2. 编排容器
新建 docker-compose.yml
并键入以下内容
version: "3.7"
networks:doris:name: dorisdriver: bridgeservices:fe-leader:image: doris:0.14.00restart: alwayscontainer_name: fe-leaderhostname: fe-leaderenvironment:- TZ=Asia/Shanghaicommand: /home/doris/fe/bin/start_fe.shvolumes:- ./doris/fe/leader/log:/home/doris/fe/log- ./doris/fe/leader/doris-meta:/home/doris/fe/doris-meta- ./doris/fe/leader/conf:/home/doris/fe/conf- /etc/localtime:/etc/localtime:rostdin_open: truetty: trueports:- 8030:8030- 8040:8040- 9030:9030networks:- dorisfe-follower-1:image: doris:0.14.00restart: alwayscontainer_name: fe-follower-1hostname: fe-follower-1environment:- TZ=Asia/Shanghaicommand: /home/doris/fe/bin/start_fe.sh --helper fe-leader:9010volumes:- ./doris/fe/fe-follower-1/log:/home/doris/fe/log- ./doris/fe/fe-follower-1/doris-meta:/home/doris/fe/doris-meta- ./doris/fe/fe-follower-1/conf:/home/doris/fe/conf- /etc/localtime:/etc/localtime:rostdin_open: truetty: truesecurity_opt:- seccomp:unconfinedprivileged: truedepends_on:- fe-leadernetworks:- dorisfe-observer-1:image: doris:0.14.00restart: alwayscontainer_name: fe-observer-1hostname: fe-observer-1environment:- TZ=Asia/Shanghaicommand: /home/doris/fe/bin/start_fe.sh --helper fe-leader:9010volumes:- ./doris/fe/fe-observer-1/log:/home/doris/fe/log- ./doris/fe/fe-observer-1/doris-meta:/home/doris/fe/doris-meta- ./doris/fe/fe-observer-1/conf:/home/doris/fe/conf- /etc/localtime:/etc/localtime:rostdin_open: truetty: truesecurity_opt:- seccomp:unconfinedprivileged: truedepends_on:- fe-leadernetworks:- dorisbe:image: doris:0.14.00restart: alwayscontainer_name: behostname: beenvironment:- TZ=Asia/Shanghaicommand: /home/doris/be/bin/start_be.shvolumes:- "./doris/be/log:/home/doris/be/log"- "./doris/be/storage:/home/doris/be/storage"- "./doris/be/conf:/home/doris/be/conf/"- "/etc/localtime:/etc/localtime:ro"stdin_open: truetty: truesecurity_opt:- seccomp:unconfineddepends_on:- fe-leadernetworks:- dorismysql:image: "mysql:5.7"container_name: mysqlrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: "123456"MYSQL_USER: "root"MYSQL_PASS: "123456"TZ: Asia/Shanghaivolumes:- ./doris/mysql:/var/lib/mysql- ./doris/mysql:/docker-entrypoint-initdb.d/- ./doris/mysql/sources.list:/etc/apt/sources.listdepends_on:- fe-leadernetworks:- doris
4.3. 运行容器
- 新建
doris/fe
文件夹并保持如下结构
doris/fe/
├── fe-follower-1
│ ├── conf
│ ├── doris-meta
│ └── log
├── fe-observer-1
│ ├── conf
│ ├── doris-meta
│ └── log
└── leader├── conf├── doris-meta└── log
- 新建
doris/be/conf
文件夹 - 复制前面编译出来的
output/fe/conf/fe.conf
到对应的 fe 的 conf 文件夹里 - 复制
output/be/conf/be.conf
到对应的 conf 文件夹里 - 执行
docker-compose up -d
5. 配置
当容器运行后,各容器之间是独立运行的,需要将follower、oberver、be
添加到leader
中才能形成集群,如果只不需要集群可以只添加be
至leader
,添加前后顺序可以随便
- leader follower oberver 相关资料请查阅官方文档,这里就不阐述了
- 当且必须在
be
被添加到leader
后,可使用mysql
数据库连接工具如navcat
、dbeaver
连接到leader
的9010
端口,该端口是mysql
协议,默认账号为root
,密码为空
5.1. 添加 follower
执行docker exec -it mysql /bin/bash
进入mysql
容器
执行脚本将follower
添加到leader
中
mysql -h fe-leader -u root -P 9030 <<EOFALTER SYSTEM ADD FOLLOWER "fe-follower-1:9010";
EOF
5.2. 添加 observer
同样在mysql
容器内执行脚本
mysql -h fe-leader -u root -P 9030 <<EOFALTER SYSTEM ADD OBSERVER "fe-observer-1:9010";
EOF
5.3. 添加 be
依旧在mysql
容器内执行脚本
mysql -h fe-leader -u root -P 9030 <<EOFALTER SYSTEM ADD BACKEND "be:9050";
EOF
5.4. 验证各容器运行状态
在mysql
容器内执行脚本查看所有 fe 节点信息
mysql -h fe-leader -u root -P 9030 <<EOFSHOW PROC '/frontends';
EOF
输出内容如下
Name | IP | HostName | EditLogPort | HttpPort | QueryPort | RpcPort | Role | IsMaster | ClusterId | Join | Alive | ReplayedJournalId | LastHeartbeat | IsHelper | ErrMsg | Version |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
172.26.0.6_9010_1624243783898 | 172.26.0.6 | fe-observer-1.doris | 9010 | 8030 | 9030 | 9020 | OBSERVER | false | 1667475297 | true | true | 557 | 2021-06-21 11:00:55 | false | 0.14.0-release-Unknown | |
172.26.0.3_9010_1624243326588 | 172.26.0.3 | fe-follower-1.doris | 9010 | 8030 | 9030 | 9020 | FOLLOWER | false | 1667475297 | true | true | 557 | 2021-06-21 11:00:55 | true | 0.14.0-release-Unknown | |
172.26.0.2_9010_1624242600423 | 172.26.0.2 | fe-leader | 9010 | 8030 | 9030 | 9020 | FOLLOWER | true | 1667475297 | true | true | 558 | 2021-06-21 11:00:55 | true | 0.14.0-release-Unknown |
如果Alive
列为true
则标识已成功添加到leader
中,反之则失败,此时需要查看对应日志fe.log
文件,根据具体信息解决
doris/fe/
├── fe-follower-1
│ ├── conf
│ │ ├── fe.conf
│ │ └── log4j2-spring.xml
│ ├── doris-meta
│ │ ├── bdb
│ │ └── image
│ └── log
│ ├── fe.audit.log
│ ├── fe.gc.log.20210621-103001
│ ├── fe.log
│ ├── fe.out
│ └── fe.warn.log
├── fe-observer-1
│ ├── conf
│ │ ├── fe.conf
│ │ └── log4j2-spring.xml
│ ├── doris-meta
│ │ ├── bdb
│ │ └── image
│ └── log
│ ├── fe.audit.log
│ ├── fe.gc.log.20210621-104708
│ ├── fe.gc.log.20210621-105052
│ ├── fe.log
│ ├── fe.out
│ └── fe.warn.log
└── leader├── conf│ ├── fe.conf│ ├── log4j2-spring.xml│ ├── table1_data│ ├── table2_data│ ├── tools│ └── up.sh├── doris-meta│ ├── bdb│ └── image└── log├── fe.audit.log├── fe.gc.log.20210621-102958├── fe.log├── fe.out└── fe.warn.log
在mysql
容器内执行脚本查看所有 be 节点信息
mysql -h fe-leader -u root -P 9030 <<EOFSHOW PROC '/backends';
EOF
输出内容如下
BackendId | Cluster | IP | HostName | HeartbeatPort | BePort | HttpPort | BrpcPort | LastStartTime | LastHeartbeat | Alive | SystemDecommissioned | ClusterDecommissioned | TabletNum | DataUsedCapacity | AvailCapacity | TotalCapacity | UsedPct | MaxDiskUsedPct | ErrMsg | Version | Status |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
10004 | default_cluster | 172.26.0.4 | be.doris | 9050 | 9060 | 8040 | 8060 | 2021-06-21 10:40:42 | 2021-06-21 16:09:01 | true | false | false | 0 | .000 | 140.327 GB | 263.000 GB | 46.64 % | 46.64 % | 0.14.0-release-Unknown | {“lastSuccessReportTabletsTime”:“2021-06-21 16:08:22”} |
结语
不出意外,到这里你已经完成了 doris 的集群搭建了,至此本教程的使命也完成了。关于如何使用还需要查阅官方文档。
常见问题
1. wait catalog to be ready
fe启动后日志不断输出如下内容
2021-06-24 14:14:56,907 INFO (UNKNOWN 172.26.0.6_9010_1624243783898(-1)|1) [Catalog.waitForReady():785] wait catalog to be ready. FE type: UNKNOWN. is ready: false
2021-06-24 14:14:58,908 INFO (UNKNOWN 172.26.0.6_9010_1624243783898(-1)|1) [Catalog.waitForReady():785] wait catalog to be ready. FE type: UNKNOWN. is ready: false
2021-06-24 14:15:00,909 INFO (UNKNOWN 172.26.0.6_9010_1624243783898(-1)|1) [Catalog.waitForReady():785] wait catalog to be ready. FE type: UNKNOWN. is ready: false
2021-06-24 14:15:02,910 INFO (UNKNOWN 172.26.0.6_9010_1624243783898(-1)|1) [Catalog.waitForReady():785] wait catalog to be ready. FE type: UNKNOWN. is ready: false
2021-06-24 14:15:04,911 INFO (UNKNOWN 172.26.0.6_9010_1624243783898(-1)|1) [Catalog.waitForReady():785] wait catalog to be ready. FE type: UNKNOWN. is ready: false
解决方法
或者参考 github#5292 的解决方法
- 清除非
Master
节点的元数据 - 在
Master
节点的FE
的配置文件fe.conf
文件添加如下内容并重启所有FE
metadata_failure_recovery = true
- 等待各节点都正常后启动并通过
SHOW PROC '/frontends';
确保每个节点的Join
和Alive
都为true
后,注释掉第二步的设置,避免出现不必要的问题
2. Key columns should be a ordered prefix of the schema
建表时输出如下异常
Key columns should be a ordered prefix of the schema
建表语句如下
CREATE TABLE Location
(
CREATE TABLE `Location` (`Id` varchar(36) NOT NULL COMMENT "主键",`Latitude` int(11) NOT NULL COMMENT "纬度信息,以度为单位的纬度值乘以 10 的 6 次方,精确到百万分之一度",`Longitude` int(11) NOT NULL COMMENT "经度信息,以度为单位的经度值乘以 10 的 6 次方,精确到百万分之一度",`Altitude` smallint(6) NOT NULL COMMENT "高程(海拔高度),海拔高度,单位为米(m)",`Speed` smallint(6) NOT NULL COMMENT "速度,1/10km/h",`Direction` smallint(6) NOT NULL COMMENT "方向,0-359,正北为 0,顺时针",`DateTime` datetime NOT NULL COMMENT "终端上报时间",`SimNumber` varchar(15) NULL COMMENT "sim卡号",`IsBatch` boolean NOT NULL COMMENT "是否为补传消息",`CreateDateTime` datetime NOT NULL COMMENT "创建时间"
) ENGINE=OLAP
UNIQUE KEY(`Id`, `SimNumber`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`SimNumber`) BUCKETS 10
PROPERTIES (
"replication_num" = "1",
"in_memory" = "false",
"storage_format" = "V2"
);
解决方法
只需要修改语句中列的顺序即可
将
KEY
中的属性移至到前面,如本例中将SimNumber` varchar(15) NULL COMMENT "sim卡号",`移至
Idvarchar(36) NOT NULL COMMENT "主键",
后面即可
CREATE TABLE `Location` (`Id` varchar(36) NOT NULL COMMENT "主键",`SimNumber` varchar(15) NULL COMMENT "sim卡号",`Latitude` int(11) NOT NULL COMMENT "纬度信息,以度为单位的纬度值乘以 10 的 6 次方,精确到百万分之一度",`Longitude` int(11) NOT NULL COMMENT "经度信息,以度为单位的经度值乘以 10 的 6 次方,精确到百万分之一度",`Altitude` smallint(6) NOT NULL COMMENT "高程(海拔高度),海拔高度,单位为米(m)",`Speed` smallint(6) NOT NULL COMMENT "速度,1/10km/h",`Direction` smallint(6) NOT NULL COMMENT "方向,0-359,正北为 0,顺时针",`DateTime` datetime NOT NULL COMMENT "终端上报时间",`IsBatch` boolean NOT NULL COMMENT "是否为补传消息",`CreateDateTime` datetime NOT NULL COMMENT "创建时间"
) ENGINE=OLAP
UNIQUE KEY(`Id`, `SimNumber`)
COMMENT "OLAP"
DISTRIBUTED BY HASH(`SimNumber`) BUCKETS 10
PROPERTIES (
"replication_num" = "1",
"in_memory" = "false",
"storage_format" = "V2"
);
注意事项
- 容器最好使用静态IP方式,因为这玩意比较依赖IP
- 使用
Stream load
方式导入数据时请确保数据中没有包含'
,否则会报value is null while columns is not nullable
错误
docker集群部署doris相关推荐
- docker集群部署:第3部分:服务
docker集群部署:第3部分:服务 介绍 在第3部分中,我们将扩展应用程序并实现负载平衡. 关于服务 在分布式应用程序中,应用程序的不同部分被称为"服务".例如,一个视频共享站点 ...
- docker集群部署
docker集群部署 docker-compse.yml文件规则 docker-swarm. yaml文件在集群中的使用 docker服务中的认证与安全 k8s云原生时代 docker-compse. ...
- 【云原生】Docker集群部署MinIO
MinIO 是全球领先的对象存储先锋,目前在全世界有数百万的用户. 在标准硬件上,读/写速度上高达183 GB / 秒 和 171 GB / 秒. 对象存储可以充当主存储层,以处理Spark.Pres ...
- Docker 进阶,Docker 集群部署
Docker 集群 Docker Compose 简介 DockerFile build run 手动操作,单个容器! 如果是微服务,100个微服务!各种依赖关系 Docker Compose 可以轻 ...
- Docker集群部署管理
1.什么是Kubernetes? Kubernetes是Google开源的容器集群管理系统,是目前比较火的集群式部署管理系统:Kubernetes(简称k8s),它是基于Docker技术的nat网络模 ...
- Docker集群部署DockerCompose
为什么要有DockerCompose? 有了Docker,我们可以实现redis,mysql等中间件.容器的镜像部署.也可以实现自定义项目的的构建和部署. 但是这些操作(部署)都是我们手动一步一步来完 ...
- 使用docker集群部署web应用
1.环境准备 准备两个及以上的linux系统,先关闭防火墙与selinux安全策略 systemctl stop firewalld systemctl disable firewalld seten ...
- Apache Doris 单节点(可多节点)Docker集群制作教程
集群制作Author:苏奕嘉 脚本研发Author:种益 调研测试Author:杨春东 前言 Apache Doris是当下非常火热和流行的MPP架构OLAP数据库,很多同学想自学/测试Doris的使 ...
- 博文推荐|Apache Doris 单节点 Docker 集群制作教程
前言 Apache Doris 是当下非常流行的 MPP 架构 OLAP 数据库,很多同学想自学/测试 Doris 的使用和能力,但是又苦于没有环境或者畏惧冗长的编译+搭建过程,整个过程极大的劝退了很 ...
- docker集群_使用Docker,Chef和Amazon OpsWorks进行集群范围的Java / Scala应用程序部署...
docker集群 Docker非常适合在单个节点上运行隔离的容器. 但是,大多数软件系统都在多个节点上运行,因此,除了Docker之外,我们还需要某种方法来指定哪些容器应在哪些节点上运行. 我要解决的 ...
最新文章
- 架构演进之「微服务架构」
- 在PaddlePaddle中的Notebook代码片段
- 【Android】Eclipse自动编译NDK/JNI的三种方法
- python打印mysql版本信息
- python quirk
- c语言send方法,高效编写代码的方法(九):了解objc_msgSend
- 双机通信c语言程序,双机通信(C语言、主机和从机共用程序)
- C#可以对系统服务 检查增加删除启动停止重启(转)
- c++ 常用字符串封装函数
- 使用实体框架核心和C#创建具有Dotnet核心的自定义Web爬虫程序
- QT中信号与槽的常见使用
- java subset_Java中的TreeSet的subSet()方法 Java.util.TreeSet.subSet() - Break易站
- 我的CSS笔记(一)
- python content函数_python函数内容
- 设计网站如何提高版式的设计水平?
- ES 数据导出和数据导入
- python面向对象编程实例:烤地瓜
- ssdt函数索引号_技术分享 - 32位系统上获取SSDT表地址以及从中获取指定SSDT函数的地址...
- 主机名 域名 网站名 URL
- PSP游戏开放环境的建立