文章目录
使用 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
如果这个下载过程出现错误,那就多试几次:
进入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
注意:
- 我的settings.xml在/data/software/apache-maven-3.6.3/conf下
- 我的本地maven仓库地址是/data/software/apache-maven-3.6.3/repo
- 所以将以上两个目录都映射到容器内。
官网是这样写的
$ 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
编译过程很漫长,下载依赖取决于网速,我的测试环境,编译了大概有一个多小时吧。
直到这里就算编译结束了:
Successfully build Doris
编译完成后,产出文件在 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:
- FE 的磁盘空间主要用于存储元数据,包括日志和 image。通常从几百 MB 到几个 GB 不等。
- BE 的磁盘空间主要用于存放用户数据,总磁盘空间按用户总数据量 * 3(3副本)计算,然后再预留额外 40% 的空间用作后台 compaction 以及一些中间数据的存放。
- 一台机器上可以部署多个 BE 实例,但是只能部署一个 FE。如果需要 3 副本数据,那么至少需要 3 台机器各部署一个 BE 实例(而不是1台机器部署3个BE实例)。多个FE所在服务器的时钟必须保持一致(允许最多5秒的时钟偏差
)- 测试环境也可以仅适用一个 BE 进行测试。实际生产环境,BE 实例数量直接决定了整体查询延迟。
- 所有部署节点关闭 Swap。
注2:FE 节点的数量
- FE 角色分为 Follower 和 Observer,(Leader 为 Follower 组中选举出来的一种角色,以下统称 Follower,具体含义见 元数据设计文档)。
- FE 节点数据至少为1(1 个 Follower)。当部署 1 个 Follower 和 1 个 Observer 时,可以实现读高可用。当部署 3 个 Follower 时,可以实现读写高可用(HA)。
- Follower 的数量必须为奇数,Observer 数量随意。
- 根据以往经验,当集群可用性要求很高是(比如提供在线业务),可以部署 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,用于接收请求 |
注:
- 当部署多个 FE 实例时,要保证 FE 的 http_port 配置相同。
- 部署前请确保各个端口在应有方向上的访问权限。
部署分配
目前部署cdh05~cdh07服务器上:
因为是测试环境,所以我们部署1个FE,3个BE。
cdh05 | cdh06 | cdh07 |
FE、BE | BE | BE |
FE部署
在cdh05上创建文件夹:
mkdir /data/software/doris
将编译完的output/
下的fe
目录拷贝至该目录下。
配置 FE
- 配置文件为 conf/fe.conf。其中注意:
meta_dir
:元数据存放位置。默认在 fe/doris-meta/ 下。需手动创建该目录。
注意:生产环境强烈建议单独指定目录不要放在Doris安装目录下,最好是单独的磁盘(如果有SSD最好),测试开发环境可以使用默认配置 -
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
修改端口后,启动正常:
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
示例说明:
- /home/disk1/doris.HDD, 50,表示存储限制为50GB, HDD;
- /home/disk2/doris.SSD 10,存储限制为10GB,SSD;
- /home/disk2/doris,存储限制为磁盘最大容量,默认为HDD
- BE webserver_port端口配置
如果 be 部署在 hadoop 集群中,注意调整 be.conf 中的 webserver_port = 8040
,以免造成端口冲突
在 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)