文章目录


使用 Docker 开发镜像编译

下载镜像

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

截止目前(2021年9月3日09:58:12)最新的release版本是doris 0.14.0 ,doris 0.14.0 版本仍然使用apache/incubator-doris:build-env-1.2 编译。

在本地下载源码(非容器内)

$ mkdir -p /data/software/doris/src
$ cd /data/software/doris/src
$ git clone https://github.com/apache/incubator-doris.git

或者下载清华大学的国内镜像(很快,但是要指定版本路径):
https://mirrors.tuna.tsinghua.edu.cn/apache/incubator/doris/0.14.0-incubating/apache-doris-0.14.0-incubating-src.tar.gz


如果这个下载过程出现错误,那就多试几次:
Apache Doris 0.14.0 编译部署安装过程记录_docker


进入docker容器

这里将我自己的maven环境和下载的Doris源码挂载到宿主机目录,以防止每次启动镜像编译时,重复下载 maven 的依赖库,这也是官网推荐的:

docker run -it -v /data/software/apache-maven-3.6.3/conf:/root/.m2 \
-v /data/software/doris/src/apache-doris/:/root/incubator-doris-DORIS-0.14.0-release/ \
-v /data/software/apache-maven-3.6.3/repo:/data/software/apache-maven-3.6.3/repo \
apache/incubator-doris:build-env-1.2

注意:


  1. 我的settings.xml在/data/software/apache-maven-3.6.3/conf下
  2. 我的本地maven仓库地址是/data/software/apache-maven-3.6.3/repo
  3. 所以将以上两个目录都映射到容器内。


官网是这样写的

$ docker run -it -v /your/local/.m2:/root/.m2 \ -v /your/local/incubator-doris-DORIS-x.x.x-release/:/root/incubator-doris-DORIS-x.x.x-release/ \ apache/incubator-doris:build-env-1.3.1

这里只需将settings.xml所在的目录映射过去即可。


然后就进入了容器内。


退出容器: exit
再次进入该容器:
docker exec -it 容器ID /bin/bash


编译

cd incubator-doris-DORIS-0.14.0-release
sh build.sh

编译过程很漫长,下载依赖取决于网速,我的测试环境,编译了大概有一个多小时吧。

Apache Doris 0.14.0 编译部署安装过程记录_.net_02

直到这里就算编译结束了:

Successfully build Doris

Apache Doris 0.14.0 编译部署安装过程记录_maven_03

编译完成后,产出文件在 output/ 目录中。

安装部署

部署前提(摘自官网)

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

Linux 操作系统版本需求

Linux 系统

版本

CentOS

7.1 及以上

Ubuntu

16.04 及以上

软件需求

软件

版本

Java

1.8 及以上

GCC

4.8.2 及以上

开发测试环境

模块

CPU

内存

磁盘

网络

实例数量

Frontend

8核+

8GB+

SSD 或 SATA,10GB+ *

千兆网卡

1

Backend

8核+

16GB+

SSD 或 SATA,50GB+ *

千兆网卡

1-3 *

生产环境

模块

CPU

内存

磁盘

网络

实例数量(最低要求)

Frontend

16核+

64GB+

SSD 或 RAID 卡,100GB+ *

万兆网卡

1-5 *

Backend

16核+

64GB+

SSD 或 SATA,100G+ *

万兆网卡

10-100 *


注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。



注2:FE 节点的数量


  1. FE 角色分为 Follower 和 Observer,(Leader 为 Follower 组中选举出来的一种角色,以下统称 Follower,具体含义见 ​​元数据设计文档​​)。
  2. FE 节点数据至少为1(1 个 Follower)。当部署 1 个 Follower 和 1 个 Observer 时,可以实现读高可用。当部署 3 个 Follower 时,可以实现读写高可用(HA)。
  3. Follower 的数量必须为奇数,Observer 数量随意。
  4. 根据以往经验,当集群可用性要求很高是(比如提供在线业务),可以部署 3 个 Follower 和 1-3 个 Observer。如果是离线业务,建议部署 1 个 Follower 和 1-3 个 Observer。


Broker 部署

Broker 是用于访问外部数据源(如 hdfs)的进程。通常,在每台机器上部署一个 broker 实例即可。

网络需求

Doris 各个实例直接通过网络进行通讯。以下表格展示了所有需要的端口

实例名称

端口名称

默认端口

通讯方向

说明

BE

be_port

9060

FE --> BE

BE 上 thrift server 的端口,用于接收来自 FE 的请求

BE

webserver_port

8040

BE <–> BE

BE 上的 http server 的端口

BE

heartbeat_service_port

9050

FE --> BE

BE 上心跳服务端口(thrift),用于接收来自 FE 的心跳

BE

brpc_port*

8060

FE<–>BE, BE <–> BE

BE 上的 brpc 端口,用于 BE 之间通讯

FE

http_port *

8030

FE <–> FE,用户

FE 上的 http server 端口

FE

rpc_port

9020

BE --> FE, FE <–> FE

FE 上的 thrift server 端口,每个fe的配置需要保持一致

FE

query_port

9030

用户

FE 上的 mysql server 端口

FE

edit_log_port

9010

FE <–> FE

FE 上的 bdbje 之间通信用的端口

Broker

broker_ipc_port

8000

FE --> Broker, BE --> Broker

Broker 上的 thrift server,用于接收请求


注:


  1. 当部署多个 FE 实例时,要保证 FE 的 http_port 配置相同。
  2. 部署前请确保各个端口在应有方向上的访问权限。


部署分配

目前部署cdh05~cdh07服务器上:

因为是测试环境,所以我们部署1个FE,3个BE。

cdh05

cdh06

cdh07

FE、BE

BE

BE

FE部署

在cdh05上创建文件夹:

mkdir /data/software/doris

将编译完的​​output/​​​ 下的​​fe​目录拷贝至该目录下。

配置 FE


  1. 配置文件为 conf/fe.conf。其中注意:​​meta_dir​​:元数据存放位置。默认在 fe/doris-meta/ 下。需手动创建该目录
    注意:生产环境强烈建议单独指定目录不要放在Doris安装目录下,最好是单独的磁盘(如果有SSD最好),测试开发环境可以使用默认配置
  2. ​fe.conf​​ 中 ​​JAVA_OPTS​​ 默认 ​​java​​ 最大堆内存为 4GB,建议生产环境调整至 8G 以上。

cd /data/software/doris/fe
mkdir doris-meta

启动FE

sh bin/start_fe.sh --daemon

FE进程启动进入后台执行。日志默认存放在 fe/log/ 目录下。如启动失败,可以通过查看 fe/log/fe.log 或者 fe/log/fe.out 查看错误信息。

2021-09-03 16:12:54,732 INFO (UNKNOWN 172.21.64.6_9010_1630656761884(-1)|1) [QeService.start():60] QE service start.
2021-09-03 16:12:54,819 ERROR (FE Http Server|97) [HttpServer$HttpServerThread.run():240] Fail to start FE query http server[port: 8030]
java.net.BindException: 地址已在使用
at sun.nio.ch.Net.bind0(Native Method) ~[?:1.8.0_212]
at sun.nio.ch.Net.bind(Net.java:433) ~[?:1.8.0_212]
at sun.nio.ch.Net.bind(Net.java:425) ~[?:1.8.0_212]
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223) ~[?:1.8.0_212]
at io.netty.channel.socket.nio.NioServerSocketChannel.doBind(NioServerSocketChannel.java:132) ~[netty-transport-4.1.42.Final.jar:4.1.42.Final]
at io.netty.channel.AbstractChannel$AbstractUnsafe.bind(AbstractChannel.java:551) ~[netty-transport-4.1.42.Final.jar:4.1.42.Final]
at io.netty.channel.DefaultChannelPipeline$HeadContext.bind(DefaultChannelPipeline.java:1346) ~[netty-transport-4.1.42.Final.jar:4.1.42.Final]
at io.netty.channel.AbstractChannelHandlerContext.invokeBind(AbstractChannelHandlerContext.java:503) ~[netty-transport-4.1.42.Final.jar:4.1.42.Final]
at io.netty.channel.AbstractChannelHandlerContext.bind(AbstractChannelHandlerContext.java:488) ~[netty-transport-4.1.42.Final.jar:4.1.42.Final]
at io.netty.channel.DefaultChannelPipeline.bind(DefaultChannelPipeline.java:985) ~[netty-transport-4.1.42.Final.jar:4.1.42.Final]
at io.netty.channel.AbstractChannel.bind(AbstractChannel.java:247) ~[netty-transport-4.1.42.Final.jar:4.1.42.Final]
at io.netty.bootstrap.AbstractBootstrap$2.run(AbstractBootstrap.java:344) ~[netty-transport-4.1.42.Final.jar:4.1.42.Final]
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) ~[netty-common-4.1.42.Final.jar:4.1.42.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:510) ~[netty-common-4.1.42.Final.jar:4.1.42.Final]
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:518) ~[netty-transport-4.1.42.Final.jar:4.1.42.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1044) ~[netty-common-4.1.42.Final.jar:4.1.42.Final]
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.42.Final.jar:4.1.42.Final]
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.42.Final.jar:4.1.42.Final]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_212]

报错信息显示​​8030​​端口被占用了:

$ netstat -tunlp | grep 8030
tcp 0 0 172.21.64.6:8030 0.0.0.0:* LISTEN 14040/java

$ ps -ef | grep 14040
yarn 14025 30773 0 8月26 ? 00:00:00 /usr/bin/python2 /opt/cloudera/cm-agent/bin/cm proc_watcher 14040
yarn 14040 14025 7 8月26 ? 19:29:46 /usr/java/default/bin/java xxx org.apache.hadoop.yarn.server.resourcemanager.ResourceManager

原来是ResourceManager在用。

$ vim conf/fe.conf

修改端口后,启动正常:

Apache Doris 0.14.0 编译部署安装过程记录_docker_04

BE部署

拷贝 BE 部署文件到所有要部署 BE 的节点

将源码编译生成的 output 下的 be 文件夹拷贝到 BE 的节点的指定部署路径下。

注:
以下操作要在cdh05 cdh06 cdh07 三台主机上分别执行一遍,文档中只以cdh05为例

修改所有 BE 的配置

修改 ​​be/conf/be.conf​​。主要是配置 ​​storage_root_path​​:数据存放目录。默认在​​be/storage​​下,需要手动创建该目录。多个路径之间使用英文状态的分号 ​​;​​ 分隔(最后一个目录后不要加 ;)。可以通过路径区别存储目录的介质,HDD或SSD。可以添加容量限制在每个路径的末尾,通过英文状态逗号,隔开。

注意:如果是SSD磁盘要在目录后面加上.SSD,HDD磁盘在目录后面加.HDD


示例如下:

​storage_root_path=/home/disk1/doris.HDD,50;/home/disk2/doris.SSD,10;/home/disk2/doris​

示例说明:


  1. /home/disk1/doris.HDD, 50,表示存储限制为50GB, HDD;
  2. /home/disk2/doris.SSD 10,存储限制为10GB,SSD;
  3. /home/disk2/doris,存储限制为磁盘最大容量,默认为HDD


  • BE webserver_port端口配置
    如果 be 部署在 hadoop 集群中,注意调整 be.conf 中的 ​​​webserver_port = 8040​​ ,以免造成端口冲突

Apache Doris 0.14.0 编译部署安装过程记录_java_05

在 FE 中添加所有 BE 节点

BE 节点需要先在 FE 中添加,才可加入集群。可以使用 mysql-client 连接到 FE:

$ mysql -h cdh05 -P 9030 -uroot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 0
Server version: 5.1.0

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>


:命令为:​​mysql-client -h host -P port -uroot​​ 其中 host 为 FE 所在节点 ip;port 为 ​​fe/conf/fe.conf 中​​的 ​​query_port​​;默认使用 root 账户,无密码登录。


登录后,执行以下命令来添加每一个 BE:

mysql> ALTER SYSTEM ADD BACKEND "cdh05:9050";
Query OK, 0 rows affected (0.02 sec)


添加BE的命令为:
​ALTER SYSTEM ADD BACKEND "host:port";​​ 其中 host 为 BE 所在节点 ip;port 为 be/conf/be.conf 中的 ​​heartbeat_service_port​​。


启动 BE

sh bin/start_be.sh --daemon

BE 进程将启动并进入后台执行。日志默认存放在 be/log/ 目录下。如启动失败,可以通过查看 be/log/be.log 或者 be/log/be.out 查看错误信息。

查看BE状态

使用 mysql-client 连接到 FE,并执行 ​​SHOW PROC '/backends';​​ 查看 BE 运行情况。如一切正常,isAlive 列应为 true。

mysql> SHOW PROC '/backends';
+-----------+-----------------+-------------+----------+---------------+--------+----------+----------+---------------------+---------------------+-------+----------------------+-----------------------+-----------+------------------+---------------+---------------+---------+----------------+--------+------------------------+--------------------------------------------------------+
| BackendId | Cluster | IP | HostName | HeartbeatPort | BePort | HttpPort | BrpcPort | LastStartTime | LastHeartbeat | Alive | SystemDecommissioned | ClusterDecommissioned | TabletNum | DataUsedCapacity | AvailCapacity | TotalCapacity | UsedPct | MaxDiskUsedPct | ErrMsg | Version | Status |
+-----------+-----------------+-------------+----------+---------------+--------+----------+----------+---------------------+---------------------+-------+----------------------+-----------------------+-----------+------------------+---------------+---------------+---------+----------------+--------+------------------------+--------------------------------------------------------+
| 11001 | default_cluster | 172.21.64.6 | cdh05 | 9050 | 9060 | 8043 | 8060 | 2021-09-06 15:53:14 | 2021-09-06 15:54:40 | true | false | false | 0 | .000 | 171.178 GB | 295.167 GB | 42.01 % | 42.01 % | | 0.14.0-release-Unknown | {"lastSuccessReportTabletsTime":"2021-09-06 15:54:15"} |
+-----------+-----------------+-------------+----------+---------------+--------+----------+----------+---------------------+---------------------+-------+----------------------+-----------------------+-----------+------------------+---------------+---------------+---------+----------------+--------+------------------------+--------------------------------------------------------+
1 row in set (0.01 sec)

当然,也可以这样:

mysql> SHOW PROC '/backends'\G;
*************************** 1. row ***************************
BackendId: 11001
Cluster: default_cluster
IP: 172.21.64.6
HostName: cdh05
HeartbeatPort: 9050
BePort: 9060
HttpPort: 8043
BrpcPort: 8060
LastStartTime: 2021-09-06 15:53:14
LastHeartbeat: 2021-09-06 15:54:55
Alive: true
SystemDecommissioned: false
ClusterDecommissioned: false
TabletNum: 0
DataUsedCapacity: .000
AvailCapacity: 171.178 GB
TotalCapacity: 295.167 GB
UsedPct: 42.01 %
MaxDiskUsedPct: 42.01 %
ErrMsg:
Version: 0.14.0-release-Unknown
Status: {"lastSuccessReportTabletsTime":"2021-09-06 15:54:15"}
1 row in set (0.00 sec)

查看FE状态

mysql> SHOW PROC '/frontends';
+--------------------------------+-------------+----------+-------------+----------+-----------+---------+----------+----------+-----------+------+-------+-------------------+---------------------+----------+--------+------------------------+
| Name | IP | HostName | EditLogPort | HttpPort | QueryPort | RpcPort | Role | IsMaster | ClusterId | Join | Alive | ReplayedJournalId | LastHeartbeat | IsHelper | ErrMsg | Version |
+--------------------------------+-------------+----------+-------------+----------+-----------+---------+----------+----------+-----------+------+-------+-------------------+---------------------+----------+--------+------------------------+
| 172.21.64.6_9010_1630656761884 | 172.21.64.6 | cdh05 | 9010 | 8034 | 9030 | 9020 | FOLLOWER | true | 298699367 | true | true | 919 | 2021-09-06 16:16:16 | true | | 0.14.0-release-Unknown |
+--------------------------------+-------------+----------+-------------+----------+-----------+---------+----------+----------+-----------+------+-------+-------------------+---------------------+----------+--------+------------------------+
1 row in set (0.06 sec)