一、概要
Apache Doris是一款现代 MPP (Massively Parallel Processing大规模并行处理)的分布式 SQL 分析数据库,所谓分析数据库就是将其数据集分布在许多机器或节点上,以处理大量数据,采用 Apache 2.0认证授权。它的前身是原百度 Palo,由百度在2017年开源,2018年进入 Apache 孵化器。Apache Doris它可以提供亚秒级查询和高效的实时数据分析。凭借其分布式架构,将支持高达 10PB 级别的数据集,并且易于操作。它可以满足各种数据分析场景,比如:历史数据报告、实时数据分析、交互式数据分析、探索性数据分析等。
关于MPP (Massively Parallel Processing),即大规模并行处理,它是将任务并行的分散到多个服务器和节点上,在每个节点上计算完成后,将各自部分的结果汇总在一起得到最终的结果(与Hadoop相似)。每台数据节点通过专用网络或者商业通用网络互相连接,彼此协同计算,作为整体提供数据库服务。整个集群称为非共享数据库集群,非共享数据库集群有完全的可伸缩性、高可用、高性能、优秀的性价比、资源共享等优势。故MPP数据库作为一款 Shared Nothing架构的分布式并行结构化数据库集群,它的高性能、高可用及高扩展特性,可以为超大规模数据管理提供高性价比的通用计算平台,并广泛地用于支撑各类数据仓库系统、BI 系统和决策支持系统。
MPP 采用完全并行的MPP + Shared Nothing 的分布式扁平架构,这种架构中的每一个节点(node)都是独立的、自给的、节点之间对等,而且整个系统中不存在单点瓶颈,具有非常强的扩展性。
MPP数据库适合存储高密度价值数据,并且是长期存储和频繁使用(读/消费),MPP并行数据库会花大量的精力在Load阶段,把数据处理成适合分析的中间格式。带来的优点就是从查询速度快,通常在秒级甚至毫秒级以内就可以返回查询结果。缺点是不支持细粒度的容错。MPP 具备以下技术特征:
1、相对低的硬件成本:完全兼容 x86 架构的 PC Server,无需昂贵的 Unix 服务器和磁盘阵列;
2、集群架构与部署:完全并行的 MPP + Shared Nothing 的分布式架构,采用 Non-Master 部署,节点对等的扁平结构;
3、海量数据分布压缩存储:可处理 PB 级别以上的结构化数据,采用 hash分布、random 存储策略进行数据存储;同时采用先进的压缩算法,减少存储数据所需的空间,可以将所用空间减少 1~20 倍,并相应地提高 I/O 性能;
4、 数据加载高效性:基于策略的数据加载模式,集群整体加载速度可达2TB/h;
5、高扩展、高可靠:支持集群节点的扩容和缩容,支持全量、增量的备份/恢复;但当节点数达到100左右时,MPP会遇到SQScalability的问题,速度变慢,或者不稳定。增加或者删除节点时,需要的维护工作比较大,集群会遇到数据迁移和重新平衡的问题;
6、 高可用、易维护:数据通过副本提供冗余保护,自动故障探测和管理,自动同步元数据和业务数据。提供图形化工具,以简化管理员对数据库的管理工作;
7、高并发:读写不互斥,支持数据的边加载边查询,单个节点并发能力大于 300 用户;
8、行列混合存储:提供行列混合存储方案,从而提高了列存数据库特殊查询场景的查询响应耗时;MPP数据库一般是列式的,即MPP数据库通常将每一列存储为一个对象,而不是将表中的每一行存储为一个对象(事务数据库的功能)。这种体系结构使复杂的分析查询可以更快,更有效地处理。
9、标准化:支持SQL92 标准,支持 C API、ODBC、JDBC、ADO.NET 等接口规范。
我们这里顺带回顾下OLTP与OLAP区别:
OLTP(OnLine Transaction Processing ,联机事务处理)系统:如mysql,这种关系型数据库擅长事务处理,在数据操作中保持着很强的一致性和原子性 ,能够很好的支持频繁的数据插入和修改 ,但是,一旦数据量过大,OLTP便力不从心了。
OLAP(On-Line Analytical Processing,联机分析处理)系统:例如Greenplum。并不特别关心对数据进行输入、修改等事务性处理,它更关心对已有的大量数据进行多维度的、复杂的分析的一类数据系统。
与Hadoop的区别:
1、.底层数据库不同:MPP跑的是SQL,而Hadoop底层处理的是MapReduce程序。SQL on Hadoop是利用Hadoop平台存储数据,在其之上实现SQL查询引擎。最大的特点是Scalability非常好,可以支持超过1000个节点的集群。但是由于Hadoop的特点,很多查询还是需要做大量的数据扫描操作,因此查询速度往往比MPP要慢,而且支持的并发查询数一般也比较低。
2、扩展能力不同:MPP虽然是宣称可以横向扩展Scale OUT,但是这种扩展一般是扩展到100左右,而Hadoop一般可以扩展1000+。
3、应用场景不同:Hadoop更适合处理非结构化和半结构化数据,尤其适合海量数据批处理等应用要求,多用于海量数据存储查询、批量数据ETL、非机构化数据分析(日志分析、文本分析)等;而MPP适合替代现有关系数据进行现有条件下的大数据处理,且具有较高的效率,适合多维度数据自助分析、数据集市等。如何场景中数据都是结构化的数据,且习惯使用传统的RDBMS,可以考虑MPP,例如Greenplum/Gbase/elasticsearch/doris/MemSQL/Teradata等;但是如有很多非结构化数据,或者数据量巨大,有需要扩展到成百上千个数据节点需求的,这个时候Hadoop是更好的选择,如Hive/Spark等。
与传统数据库的对比:
Doris 主要集成了 Google Mesa 和 Apache Impala 的技术,基于列式存储引擎,可以通过 MySQL 客户端进行通信。Doris 的定位是面向在线报表和分析的数据仓库系统,可以对标于商业的MPP 数据仓库系统,比如Greenplum、Vertica、Teradata 等。Doris 的目标:
Doris优势:
完全兼容MySQL协议;
采用列式存储、对数据以高压缩比进行压缩存储、向量化执行等先进技术,因此获得了极高的查询效率;
支持多种存储模型:同时支持类似于Mesa将列分为Key和Value的存储模型,同时支持Unique Key和Dup Key的存储模型。用户可以根据自己的业务场景,选用不同的存储模型;
支持两层分区;
支持多种数据导入方式;
安全资源隔离扩容缩容;
备份和恢复;
支持web监控和管理;
相关知识参考:
1、Apache Doris : 一个开源 MPP 数据库的架构与实践
2、Doris 建表、数据导入与删除
3、Doris 数据模型、ROLLUP 及前缀索引
4、Doris官网; 官方中文文档;
二、产品架构及原理
整体架构如下图:
如上图所示,Doris 的整体架构分为了两层。多个 FE 组成第一层,提供 FE 的横向扩展和高可用。多个 BE 组成第二层,负责数据存储于管理。Doris 的整体架构和 TiDB 类似,借助 MySQL 协议,用户使用任意 MySQL 的 ODBC/JDBC以及MySQL 的客户端,都可以直接访问 Doris。Doris 中的模块包括 FE 和 BE 两类:FE 主要负责元数据的管理、存储,以及查询的解析等;一个用户请求经过 FE 解析、规划后,具体的执行计划会发送给 BE,BE 则会完成查询的具体执行。BE 节点主要负责数据的存储、以及查询计划的执行。目前平台的 FE 部分主要使用 Java,BE 部分主要使用 C++。
2.1、组件及原理
FE(Frontend):,Doris的前端节点。它主要负责接收和返回客户端请求、元数据、集群管理和查询计划生成。各个 FE 之间,通过 bdbje(BerkeleyDB Java Edition,在 Doris 中,使用 bdbje 完成元数据操作日志的持久化、FE 高可用等功能)协议进行 leader 选举,数据同步等工作。FE角色分为追随者Follower和观察者 Observer,其中Leader是Follower组中选举产生的;其中一个 follower 成为 leader 节点,负责元数据的写入操作。当 leader 节点宕机后,其他 follower 节点会重新选举出一个 leader,保证服务的高可用。observer 节点仅从 leader 节点进行元数据同步,不参与选举。可以横向扩展以提供元数据的读服务的扩展性。
BE(Backend): Doris的后端节点。主要负责数据存储与管理、查询计划执行等工作。
Broker:Broker是一个无状态的进程。主要是让 Doris 在类 Unix 的文件系统接口中可以访问如 HDFS 上的数据那样的外部数据源,从而可以用于数据导入或数据导出操作。
Tablet:Tablet是一张表的实际物理存储单元。在由BE组成的分布式存储层中,经过分区和分桶后,以Tablet为单位存储一张表。每个 Tablet 包括元信息和几个连续的 RowSet。 .
Rowset:Rowset是tablet中某次数据变化的数据集合,数据变化包括:数据的导入、删除、更新。Rowset按版本信息记录。每次更改都会生成一个版本。
Version:由Start和End两个属性组成,维护数据变化的记录信息。通常用来表示 Rowset 的版本范围,新导入后会生成一个 Start 和 End 相等的 Rowset,在 Compaction 之后生成一个有范围的 Rowset 版本。
Segment:表示Rowset中的数据段。多个 Segment 形成一个 Rowset。
Compaction:合并连续版本的Rowset的过程称为Compaction,合并过程中数据会被压缩。
1)Doris 各节点认证机制
除了 Master FE 以外,其余角色节点(Follower FE,Observer FE,Backend),都需要通过 ALTER SYSTEM ADD 语句先注册到集群,然后才能加入集群。
Master FE 在第一次启动时,会在 doris-meta/image/VERSION 文件中生成一个 cluster_id。
FE 在第一次加入集群时,会首先从 Master FE 获取这个文件。之后每次 FE 之间的重新连接(FE 重启),都会校验自身 cluster id 是否与已存在的其它 FE 的 cluster id 相同。如果不同,则该 FE 会自动退出。
BE 在第一次接收到 Master FE 的心跳时,会从心跳中获取到 cluster id,并记录到数据目录的 cluster_id 文件中。之后的每次心跳都会比对 FE 发来的 cluster id。如果 cluster id 不相等,则 BE 会拒绝响应 FE 的心跳。
心跳中同时会包含 Master FE 的 ip。当 FE 切主时,新的 Master FE 会携带自身的 ip 发送心跳给 BE,BE 会更新自身保存的 Master FE 的 ip。
2)BE 进程文件句柄数:
BE进程文件句柄数,受min_file_descriptor_number/max_file_descriptor_number两个参数控制。
如果不在[min_file_descriptor_number, max_file_descriptor_number]区间内,BE进程启动会出错,可以使用ulimit进行设置。
min_file_descriptor_number的默认值为65536。
max_file_descriptor_number的默认值为131072.
ulimit -n 65536; 表示将文件句柄设成65536。
启动BE进程之后,可以通过 cat /proc/$pid/limits 查看进程实际生效的句柄数;如果使用了supervisord,遇到句柄数错误,可以通过修改supervisord的minfds参数解决。
vim /etc/supervisord.conf //修改如下
minfds=65535;(min. avail startup file descriptors;default 1024)
2.2、Doris 数据分布
如果从表的角度来看数据结构,用户的一张 Table 会拆成多个 Tablet,Tablet 写入/存储到Doris会存成多副本,存储在不同的 BE 中,从而保证数据的高可用和高可靠。类似于kafka的分区存储多副本。
2.3、Doris 数据模型
1)Doris 数据模型特点
1、键值对存储形式:类似于字典搜索查询的键值对格式,Doris 中所有数据分成两列:Key 列和 Value 列。如下图所示,Time、Id、Country 列共同组成 Key 列,Clicks、Cost 列为 Value 列。Key 列有序可进行快速查找,Value 列可以按照具体聚合类型内部完成数据聚合。
2、Key 列全局有序排列,查询时方便快速定位查找。Doris 数据模型的一个显著特点是 Key 列全局唯一,因此存在相同 Key 值的不同 Value,则后面的数据与前面的数据自动做 ( SUM,MIN,MAX,REPLACE ) 等聚合处理。例如,下图中绿色方框中的两行,相同的 Key 值对应不同的 Value;因此,新的 Value 到达后,就会与先前的中间数据作 SUM 处理,得到最新的数据,不仅提升效率,还可提高数据处理的准确性。
2)按列存储
在 Doris 中,数据以表(Table)的形式进行逻辑上的描述。Column 可以分为两大类:Key 和 Value。从业务角度看,Key 和 Value 可以分别对应维度列和指标列。
1、Doris 的数据是按列存储的,每一列单独存放。
2、查询时,只访问查询涉及的列,大量降低 I/O。
3、数据类型一致,方便压缩。
4、数据包建索引,数据即索引。
5、利用原始过滤条件以及 min、max 和 sum 等智能索引技术,将数据集查询范围尽可能地缩小,大大减少 I/O,提升查询效率。
3)物化视图
物化视图是提取某些维度的组合建立对用户透明的却有真实数据的视图表格。Doris 的物化视图可以保证用户在更新时,直接更新原始表,Doris 会保证原表、物化视图原子生效。在查询的时候用户也只需指定原始表,Doris 会根据查询的具体条件,选择适合的物化视图完成查询。通常用户可以通过物化视图功能完成以下两种功能:
1、更换索引列进行重排列
2、针对指定列做聚合查询
示例如下:
2.4、Doris 关键技术
1)数据可靠性
1、元数据使用 Memory+Checkpoint+Journal ,使用 BTBJE ( 类似于 Raft ) 协议实现高可用性和高可靠性。
2、Doris 内部自行管理数据的多副本和自动修复。保证数据的高可用、高可靠。在服务器宕机的情况下,服务依然可用,数据也不会丢失。
2)易运维
1、部署方便:Doris 部署无外部依赖,只需要部署 BE 和 IBE 即可搭建起一个集群。
2、操作方便:它支持 Online Schema Change(在线更改表模式( 加减列,创建 Rollup )) ,不会影响当前服务,不会阻塞读、写等操作;这种执行是异步的 ( 用户不需要一直盯在那里 );
3、副本自动均衡:传统数据库的扩(缩)容比较麻烦,有时甚至需要重做数据;而 Doris 数据库只需要一条 SQL ( 无须额外操作 ) 即可实现扩(缩)容。
4、内置监控:使用 Prometheus、Grafana 将监控项指标列出。
数据库同步操作和异步操作却别:
同步,是所有的操作都做完,才返回给用户结果;即写完数据库之后,再响应用户,用户体验不好;
异步,不用等所有操作等做完,就相应用户请求;即先相应用户请求,然后慢慢去写数据库,用户体验较好。缓存机制(也就是消息队列),就是异步操作的一个典型应用。
3)MySQL 兼容性
MySQL 的兼容性主要体现在以下两方面:
1、兼容 MySQL 的网络协议 ( MySQL Network Protocol )
2、兼容 MySQL 语法,使用 MySQL 语法可对 Doris 数据库进行查询;比如:MySQL 的调度服务器 Proxy,可以直接用作 Doris 的 Proxy。
3、Doris 的前端展示,可以使用 MySQL 专属展示器 Tableu。
4、Doris 与 R 语言可以实现无缝对接,用 R 语言可直接操作 Doris 数据库,进行数据分析、数据挖掘等工作。
4)支持 MPP
MPP 即 Massively Parallel Processing,大规模并行处理,即海量数据并发查询。比如下面的语句:
SELECT k1,SUM(v1) FROM A,B WHERE A.k2=B.k2 GROUP BY k1 ORDER BY SUM(v1)
上述语句包含了合并、聚合计算、排序等多种操作;在执行时,MPP 会将其拆分成多份,分布到每台机器执行,最后再将结果汇总。假如有10台机器,在大数据量下,这种查询执行方式可以使得查询性能达到10倍的提升。如下图所示:
三、部署配置
3.1、最低环境要求
CPU:2C(最低)8C(推荐)
内存:4G(最低)48G(推荐)
硬盘:100G(最低)400G(推荐),推荐使用 ext4 文件系统;FE的磁盘空间主要用于存储元数据,包括日志和图像。通常它的范围从几百 MB 到几 GB。而BE的磁盘空间主要用于存储用户数据。总磁盘空间按用户总数据*3(3份)计算。然后额外预留 40% 的空间用于后台压缩和一些中间数据存储。
平台:MacOS(Intel)、LinuxOS、Windows虚拟机
系统:CentOS(7.1及以上)、Ubuntu(16.04及以上)
软件:JDK(1.8及以上)、GCC(4.8.2及以上)
下表是官网推荐的生产环境配置:
环境网络要求:
其他注意事项及部署规划参考:
1、单台机器可以部署多个BE实例,但只能部署一个FE。如果需要三份数据,则每台机器至少需要一个 BE 实例(而不是每台机器三个 BE 实例)。多个FE服务器时钟必须一致(允许最大5秒时钟偏差);
2、测试环境也可以只用一个 BE 进行测试。在实际生产环境中,BE实例的数量直接决定了整体的查询延迟。
所有部署节点都关闭 Swap。
3、FE 节点数据至少为 1(1 个 Follower)。当部署一个 Follower 和一个 Observer 时,可以实现高读取可用性。当部署三个 Follower 时,可以实现读写高可用性(HA)。Followers 的数量必须是奇数,Observers 的数量是任意的。
4、当集群可用性要求较高时(例如提供在线服务),可以部署三个 Follower 和一到三个 Observer。对于线下业务,建议部署1个Follower和1-3个Observer。
5、通常我们推荐大约10到100台机器来充分发挥Doris的性能(其中3台部署FE(HA),其余部署BE);当然,Doris 的性能与节点的数量和配置呈正相关。最少四台机器(一台 FE,三台 BE,一台 BE 混合一台 Observer FE 提供元数据备份)和较低的配置,Doris 仍然可以流畅运行。部署多个 FE 实例时,请确保 FE 的 http 端口配置相同。
6、如果 FE 和 BE 混用,要注意资源竞争,保证元数据目录和数据目录分配到不同的磁盘上。
7、Broker 是访问外部数据源的进程,例如 hdfs。通常,每台机器上都会部署一个代理实例;
8、在多网卡/docker环境下,因目前 Doris 不会自动识别可用 IP。所以我们必须通过FE和BE的priority_networks配置项强制指定正确的IP。配置项需要写在fe.conf和be.conf中。该配置项用于告诉进程在FE或BE启动时应该绑定哪个IP。如:priority_networks=10.1.3.0/24;注意:当配置了优先网络并启动了FE或BE时,只能保证FE或BE的IP绑定正确。在 ADD BACKEND 或 ADD FRONTEND 语句中,还需要指定 IP 匹配优先级网络配置,否则无法建立集群。如果之前已经绑定过,可DROP移除添加错误的 BE,并重新使用正确的 IP 来执行 ALTER SYSTEM ADD BACKEND “10.1.3.2:9050”;目前, Broker 的服务默认绑定到 0.0.0.0。只需使用 ADD BROKER 时配置正确的可访问代理 IP即可。
9、默认情况下,doris 区分大小写。如果需要不区分大小写的表名,则需要在集群初始化之前进行设置。集群初始化完成后无法更改表名区分大小写。配置参看Variable。
10、FE配置文件fe.conf中的JAVA_OPTS默认为java最大堆内存为4GB,建议生产环境调整为8G以上。尤其集群方式部署时。
3.2、环境部署
1)部署前准备
vi /etc/security/limits.conf //修改系统可打开/操作最大文件数
* soft nofile 65536
* hard nofile 65536
//配置Doris需要的环境变量
vim /etc/profile.d/doris.sh
exportDORIS_HOME=/opt/app
exportJAVA_HOME=/usr/lib/jdk/jdk1.8.0_202
exportCLASSPATH=.:$JAVA_HOME/lib
exportPATH=$PATH:$DORIS_HOME/fe/bin:$DORIS_HOME/be/bin:$JAVA_HOME/bin:$PATH# save and sourcesource /etc/profile.d/doris.sh
//jdk安装
https://www.oracle.com/webapps/redirect/signon?nexturl=https://download.oracle.com/otn/java/jdk/8u202-b08/1961070e4c9b4e26a04e7f5a083f551e/jdk-8u202-linux-x64.rpm
#源码
https://www.oracle.com/webapps/redirect/signon?nexturl=https://download.oracle.com/otn/java/jdk/8u202-b08/1961070e4c9b4e26a04e7f5a083f551e/jdk-8u202-linux-x64.tar.gz
tar -xzf jdk-8u301-linux-x64.tar.gz -C /opt/app/
java -version
alternatives --list
//Doris的元数据要求时间精度小于5000ms,所以集群内所有机器需要同步时钟,避免时钟问题导致元数据不一致导致服务异常;配置NTP服务;chrony 是网络时间协议(NTP)的通用实现。chrony 包含两个程序:chronyd 是一个可以在启动时启动的守护程序。chronyc 是一个命令行界面程序,用于监视 chronyd 的性能并在运行时更改各种操作参数。
yum -y install chrony
systemctl enable chronyd
systemctl start chronyd
vim /etc/chrony.conf
# 使用 pool.ntp.org 项目中的公共服务器。以server开,理论上想添加多少时间服务器都可以。# Use public servers from the pool.ntp.org project.# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
server s1a.time.edu.cn iburst
server ntp.aliyun.com iburst
# 根据实际时间计算出服务器增减时间的比率,然后记录到一个文件中,在系统重启后为系统做出最佳时间补偿调整。# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift
# 如果系统时钟的偏移量大于1秒,则允许系统时钟在前三次更新中步进。# Allow the system clock to be stepped in the first three updates if its offset is larger than 1 second.
makestep 1.03# 启用实时时钟(RTC)的内核同步。# Enable kernel synchronization of the real-time clock (RTC).
rtcsync
# 通过使用 hwtimestamp 指令启用硬件时间戳# Enable hardware timestamping on all interfaces that support it.#hwtimestamp *# Increase the minimum number of selectable sources required to adjust the system clock.#minsources 2# 指定 NTP 客户端地址,以允许或拒绝连接到扮演时钟服务器的机器# Allow NTP client access from local network.
allow 172.168.18.0/24
# Serve time even if not synchronized to a time source.#local stratum 10# 指定包含 NTP 身份验证密钥的文件。# Specify file containing keys for NTP authentication.#keyfile /etc/chrony.keys# 指定日志文件的目录。# Specify directory for log files.
logdir /var/log/chrony
# 选择日志文件要记录的信息。# Select which information is logged.#log measurements statistics tracking# 查看时间同步状态
timedatectl status
# 开启网络时间同步
timedatectl set-ntp true#客户端配置,chrony.conf 修改两处
server 192.168.8.5 iburst
allow 192.168.8.5
systemctl enable chronyd
systemctl restart chronyd
# 查看时间同步状态
timedatectl status
# 开启网络时间同步
timedatectl set-ntp true# 查看 ntp_servers
chronyc sources -v
# 查看 ntp_servers 状态
chronyc sourcestats -v
# 查看 ntp_servers 是否在线
chronyc activity -v
# 查看 ntp 详细信息
chronyc tracking -v
# 查看日期时间、时区及 NTP 状态
timedatectl
# 查看时区列表
timedatectl list-timezones
timedatectl list-timezones |grep -E "Asia/S.*"# 修改时区
timedatectl set-timezone Asia/Shanghai
# 修改日期时间(可以只修改其中一个)
timedatectl set-time "2019-09-19 15:50:20"# 开启 NTP
timedatectl set-ntp true/flase
//Linux swap分区会对Doris造成严重的性能问题,安装前需要禁用swap分区
sudo swapoff -a //立刻生效
# 启用命令sudoswapon -a
#永久生效sudomount -n -o remount,rw /
vi /etc/fstab //在swap分区这行前加 # 禁用掉reboot
注意:对于JDK,2019年4月16日当天,Oracle发布了Oracle JDK的8u211和8u212两个版本(属于JDK8系列),并从这两个版本开始将JDK的授权许可从BCL换成了OTN!也就是从这两个版本开始商用收费了!
2)软件下载安装
软件下载地址:https://doris.apache.org/zh-CN/downloads/downloads.html,目前最新版为1.0.0;
1》单机部署:
wget https://dist.apache.org/repos/dist/release/incubator/doris/1.0/1.0.0-incubating/apache-doris-1.0.0-incubating-bin.tar.gz
tar -zxvf apache-doris-1.0.0-incubating-bin.tar.gz
mv apache-doris-1.0.0-incubating-bin /opt/doris
cd /opt/doris
## 编辑配置前端配置文件,即 FE-Configvi fe/conf/fe.conf
# Uncomment priority_networks and modify parameters
priority_networks =127.0.0.0/24
# save and exit## 配置后端,即BEvi be/conf/be.conf
# Uncomment priority_networks and modify parameters
priority_networks =127.0.0.0/24
# save and exit#启动
start_fe.sh --daemon
start_be.sh --daemon
2》集群部署:
节点名称ip地址角色/功能Hadoop-master172.16.18.2FE-Leader+BE+broke+FEHadoop-slave1172.16.18.3BE+FE-Flower+brokeHadoop-slave2172.16.18.4FE-Observer+broke
注意: FE 节点数据至少为1(1 个 Follower)。当部署 1 个 Follower 和 1 个 Observer 时,可以实现读高可用。当部署 3 个 Follower 时,可以实现读写高可用(HA)。Follower 的数量必须为奇数,Observer 数量随意。一个机器上只能部署一个 FE ,因为所有 FE 节点的 http_port 需要相同,可以部署多个 BE 或者 FE + BE 。
FE 集群从 Follower 中自动选出 Master 节点,所有更改状态操作都由 Master 节点执行, 从 FE 的 Master 节点可以读到最新的状态。更改操作可以从非 Master 节点发起,继而转发给 Master 节点执行, 非 Master 节点记录最近一次更改操作在复制日志中的 LSN ,读操作可以直接在非 Master 节点上执行,但需要等待非 Master 节点的状态已经同步到最近一次更改操作的 LSN,因此读写非 Master 节点满足顺序一致性。
Observer 节点能够增加FE集群的读负载能力,时效性要求放宽的非紧要用户可以读 Observer 节点。FE 节点之间的时钟相差不能超过5s, 使用 NTP 协议校准时间。Broker的节点上提前装置JDK环境,版本最低值1.8 及以上。
生产环境可使用3台FE+7台BE组成,3台FE组成HA,用户可以在多个 FE 之上部署负载均衡层来实现 Doris 的高可用。而BE计算能力不足时,随时扩展BE即可。下表是一个网络示例:
1> FE前端部署
下载源码包,解压,将源码编译生成的 output下的fe文件夹拷贝到 FE的节点指定部署路径下并进入该目录其中,meta_dir目录是Metadata存储目录;默认值为 ${DORIS_HOME}/doris-meta。该目录需要手动创建。生产环境强烈建议单独指定目录,不要放在Doris安装目录下,最好是单独的磁盘下。
#源码包下载,需要编译wget https://www.apache.org/dyn/closer.cgi/incubator/doris/1.0/1.0.0-incubating/apache-doris-1.0.0-incubating-src.tar.gz
#sudo yum groupinstall 'Development Tools' && sudo yum install maven cmake byacc flex automake libtool bison binutils-devel zip unzip ncurses-devel curl git wget python2 glibc-static libstdc++-static java-1.8.0-openjdksudo yum install centos-release-scl
sudo yum install devtoolset-10
scl enable devtoolset-10 bash#如果当前仓库没有提供devtoolset-10 可以添加如下repo 使用oracle 提供 package[ol7_software_collections]name=Software Collection packages for Oracle Linux 7($basearch)baseurl=http://yum.oracle.com/repo/OracleLinux/OL7/SoftwareCollections/$basearch/
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
gpgcheck=1enabled=1cat /proc/cpuinfo |grep avx2 //编译之前先检查是否支持avx2指令,如不支持需要加 USE_AVX2=0#编译,编译完成后,产出文件在 output/ 目录中sh build.sh
USE_AVX2=0sh build.sh
#二进制包,362M大小wget https://www.apache.org/dyn/closer.cgi/incubator/doris/1.0/1.0.0-incubating/apache-doris-1.0.0-incubating-bin.tar.gz
tar -zxvf apache-doris-1.0.0-incubating-bin.tar.gz -C /opt/app/
mkdir /opt/app/doris-meta
vim conf/fe.conf //修改如下
meta_dir = /opt/app/doris-meta
#或者grep -vE "^$|^#" /opt/app/apache-doris-1.0.0/fe/conf/fe.conf > /opt/app/apache-doris-1.0.0/fe/conf/fe.conf //修改配置如下
LOG_DIR =${DORIS_HOME}/log
meta_dir = /opt/app/doris-meta
DATE =`date +%Y%m%d-%H%M%S`JAVA_OPTS="-Xmx4096m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:$DORIS_HOME/log/fe.gc.log.$DATE"JAVA_OPTS_FOR_JDK_9="-Xmx4096m -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xlog:gc*:$DORIS_HOME/log/fe.gc.log.$DATE:time"
sys_log_level = INFO
enable_http_server_v2 =true
http_port =8030
rpc_port =9020
query_port =9030
edit_log_port =9010
mysql_service_nio_enabled =true
priority_networks =172.16.18.0/24 //是 FE 和 BE 都有一个配置,其主要目的是在多网卡的情况下,协助 FE 或 BE 识别自身 ip 地址。priority_network 采用 CIDR 表示法
#完成后,启动FE,FE后台执行sh bin/start_fe.sh --daemon
#修改第一台fe节点为helper节点
bin/start_fe.sh --helper 172.16.18.2:9010 --daemon //FE集群实例首次启动,必需使用--helper参数,不然后续加入集群不成功
#扩容FE节点,可以将新节点添加为follower
mysql -h 127.0.0.1 -P 9030 -uroot -p
> ALTER SYSTEM ADD FOLLOWER "172.16.18.3:9010";> ALTER SYSTEM ADD OBSERVER "172.16.18.4:9010";> SHOW FRONTENDS;
将上述配置好的FE配置文件,复制到其他FE实例的主机上,分别启动FE。FE 进程启动后,会首先加载元数据,根据 FE 角色的不同,在日志中会看到 transfer from UNKNOWN to MASTER/FOLLOWER/OBSERVER。最终会看到 thrift server started 日志,并且可以通过 mysql 客户端连接到 FE,则表示 FE 启动成功。FE 节点首次启动时,需要指定现有集群中的一个节点作为 helper 节点,从该节点获得集群的所有 FE 节点的配置信息,才能建立通信连接,因此首次启动需要指定 --helper 参数。
3》部署BE:
BE配置文件中,主要是配置项 storage_root_path:数据存放目录。默认在be/storage下,需要手动创建该目录。多个路径之间使用英文状态的分号 ; 分隔(最后一个目录后不要加 ;)。可以通过路径区别存储目录的介质,HDD或SSD。可以添加容量限制在每个路径的末尾,通过英文状态逗号,隔开。示例:
配置1: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配置2:不论HDD磁盘目录还是SSD磁盘目录,都无需添加后缀,而用storage_root_path参数里指定medium
storage_root_path=/home/disk1/doris,medium:hdd,capacity:50;/home/disk2/doris,medium:ssd,capacity:50说明:
/home/disk1/doris,medium:hdd,capacity:10,表示存储限制为10GB, HDD;
/home/disk2/doris,medium:ssd,capacity:50,表示存储限制为50GB, SSD;
wget https://www.apache.org/dyn/closer.cgi/incubator/doris/1.0/1.0.0-incubating/apache-doris-1.0.0-incubating-bin.tar.gz
python -m SimpleHTTPServer 12345#如果默认python为python2
python -m http.server 12345#如果默认python为python3#那么其他节点就可从wget http://172.16.18.2:12345/apache-dorios-0.15.1-new.tar.gz #其它节点获取包grep -vE "^$|^#" /opt/app/apache-doris-1.0.0/be/conf/be.conf >/opt/app/apache-doris-1.0.0/be/conf/be.conf //修改为
storage_root_path = /opt/app/doris-meta/storage
PPROF_TMPDIR="$DORIS_HOME/log/"
sys_log_level = INFO
be_port =9060 //如果 be 部署在 hadoop 集群中,注意调整 be.conf 中的 webserver_port =8040 ,以免造成端口冲突
webserver_port =8040
heartbeat_service_port =9050
brpc_port =8060#启动,启动后进入后台执行sh bin/start_be.sh --daemon
#扩容BE节点
mysql -h 127.0.0.1 -P 9030 -uroot -p
> ALTER SYSTEM ADD BACKEND "172.16.18.3:9050";> ALTER SYSTEM ADD BACKEND "172.16.18.4:9050";> SHOW BACKENDS; //查看当前集群的BE节点
注: BE 的第一次启动,或者该 BE 尚未加入任何集群,则 BE 日志会定期滚动 waiting to receive first heartbeat from frontend 字样。表示 BE 还未通过 FE 的心跳收到 Master 的地址,正在被动等待。这种错误日志,在 FE 中 ADD BACKEND 并发送心跳后,就会消失。如果在接到心跳后,又重复出现 master client, get client from cache failed.host: , port: 0, code: 7 字样,说明 FE 成功连接了 BE,但 BE 无法主动连接 FE。可能需要检查 BE 到 FE 的 rpc_port 的连通性。当BE 已经被加入集群,日志中应该每隔 5 秒滚动来自 FE 的心跳日志:get heartbeat, host: xx.xx.xx.xx, port: 9020, cluster id: xxxxxx,表示心跳正常。其次,日志中应该每隔 10 秒滚动 finish report task success. return code: 0 的字样,表示 BE 向 FE 的通信正常。同时,如果有数据查询,应该能看到不停滚动的日志,并且有 execute time is xxx 日志,表示 BE 启动成功,并且查询正常。
4》FS_Broker 部署
Broker 以插件的形式,独立于 Doris 部署。如果需要从第三方存储系统导入数据,需要部署相应的 Broker,默认提供了读取 HDFS ;fs_broker 是无状态的,建议每一个 FE 和 BE 节点都部署一个 Broker。
1、在相应 broker/conf/ 目录下对应的配置文件中,可以修改相应配置;
2、启动:bin/start_broker.sh --daemon
3、添加 Broker:要让 Doris 的 FE 和 BE 知道 Broker 在哪些节点上,通过 sql 命令添加 Broker 节点列表
4、mysql -h 127.0.0.1 -P 9030 -uroot //连接FE,其中broker_ipc_port 在 Broker 配置文件中conf/apache_hdfs_broker.conf配置的
ALTER SYSTEM ADD BROKER broker_name “broker_host1:broker_ipc_port1”,“broker_host2:broker_ipc_port2”,…;
SHOW PROC “/brokers”; //查看 Broker 状态
#扩容BE节点
mysql -h 127.0.0.1 -P 9030 -uroot -p
> ALTER SYSTEM ADD BROKER MY_BROKER "172.16.18.3:8000";> ALTER SYSTEM ADD BROKER MY_BROKER "172.16.18.4:8000";> SHOW BROKER; //查看当前集群的BROKER节点
示例:使用 load broker 从 hdfs 导入数据至 doris(网络示例)
> create database example_db;> CREATE TABLE example_db.table_hash
(
k1 BOOLEAN,
k2 TINYINT,
k3 DECIMAL(10, 2) DEFAULT "10.5",
v1 CHAR(10) REPLACE,
v2 INT SUM
)ENGINE=olap
AGGREGATE KEY(k1, k2, k3)
COMMENT "my first doris table"
DISTRIBUTED BY HASH(k1) BUCKETS 32;#在hdfs上创建一个txt文件cat hytest.txt
0,100,9,xxx
1,200,8,sss
0,300,7,bbb
hdfs dfs -put hytest.txt hdfs://172.16.18.201:8020/tmp/hy/
#使用load broker导入数据> LOAD LABEL example_db.label_filter
(
DATA INFILE("hdfs://10.202.77.201:8020/hive/warehouse/sfbdp/TMP/tmp_test_etl/emp_dept")
INTO TABLE `table_hash`COLUMNS TERMINATED BY ","(k1,k2,v1,v2))
with broker 'my_broker'("username"="root",
"password"="");#查看导入情况> SHOW LOAD FROM example_db order by createtime desc limit 1\G;
3)验证
FE:浏览器输入http://fe_host:fe_http_port/api/bootstrap //返回 {“status”:“OK”,“msg”:“Success”}即表启动成功
BE:浏览器输入http://be_host:be_http_port/api/health //返回:{“status”: “OK”,“msg”: “To Be added”},则表示启动成功
Doris Web UI:http://FE_IP:FE_HTTP_PORT(默认8030),账号root,密码为空
配置FE的参数,打开web端页面:
验证:http://doris_fe:8030/rest/v1/system?path=//backends
4)使用mysql-client注册BE到FE
Doris 使用 MySQL 协议进行通信,用户可以通过 MySQL Client 或 MySQL JDBC 连接到 Doris 集群。选择 MySQL 客户端版本时,建议使用 5.1 之后的版本,因为 5.1 之前不支持超过 16 个字符的用户名。Doris SQL 语法基本遵循 MySQL 语法。BE 节点需要先在 FE 中添加,才可加入集群。注册执行以下命令:
yum install -y mysql
#./mysql-client -h fe_host -P query_port -uroot
mysql -h 127.0.0.1 -P 9030 -uroot
> SHOW FRONTENDS; //查看当前集群的FE节点
# Register BE 添加BE节点,执行:ALTER SYSTEM ADD BACKEND "be_host:heartbeat-service_port";> ALTER SYSTEM ADD BACKEND "127.0.0.1:9050";>#添加Broker节点 ALTER SYSTEM ADD BROKER broker_name "host:port";>> ALTER SYSTEM ADD BROKER my_broker "127.0.0.1:8000";#访问FE
mysql -h FE-host -P 9030 -u username -p password
>setenable_profile=true; //启用FE report功能
> SHOW PROC '/backends'; //查看 BE 运行情况
> SHOW BACKENDS; //查看当前集群的BE节点
> SHOW BROKER; //查看当前集群的Broker节点
更多sql使用参看:查询执行统计;
注意:BE注册成功FE后,如果心跳正常,BE 的日志中会显示 get heartbeat, host: xx.xx.xx.xx, port: 9020, cluster id: xxxxxx。如果心跳失败,在 FE 的日志中会出现 backend[10001] got Exception: org.apache.thrift.transport.TTransportException 类似的字样,或者其他 thrift 通信异常日志,表示 FE 向 10001 这个 BE 的心跳失败。这里需要检查 FE 向 BE host 的心跳端口的连通性。如果 BE 向 FE 的通信正常,则 BE 日志中会显示 finish report task success. return code: 0 的字样。否则会出现 master client, get client from cache failed 的字样。这种情况下,需要检查 BE 向 FE 的 rpc_port 的连通性。
5)FE负载均衡
1>
2>ProxySQL负载部署
四、配置文件说明
五、应用案例借鉴
5.1、Doris 在 Elasticsearch 的应用
我们知道,在处理大量数据时,全文查找会用到ES,然ES 的优点是索引,可支持多列索引,甚至可支持全文语义索引(如 term,match,fuzzy 等);然而其缺点是没有分布式计算引擎,不支持 join 等操作;对此,Palo 提供了丰富的 SQL 计算能力,以及分布式查询能力;然而其索引性能较低,不支持全文索引。而Doris 可分别借鉴 ES 和 Palo 的长处,支持 Elasticsearch 多表 Join 操作,同时引入 Elasticsearch 的语义搜索功能,扩充了 Doris 的查询能力。
示例:
1)建立一张 ES 的外部表。
2)在 ES 外部表中导入一些数据
3)使用和 ES 一样的搜索语句,进行全文检索查询;类似于下图这样的搜索语句,在 SQL 中比较难以表达,但是在 ES 中较容易实现。
5.2、与Kafka 消息队列配合使用
1)Doris 内部支持订阅 Kafka 数据流,实现直接对接 Kafka,创建如下sql:
2)用户数据源经 Kafka 消息队列收集后,可以依次进入到 Doris 中,通过 Doris 做报表展示和决策分析等工作。
3)方案优点
无需额外组件,用户可直接通过命令实现 Kafka 消息订阅。
精确传输,秒级延迟。
Doris 可自动感知 Kafka 中 partition 变化,合理调度并发导入。
在数据导入这一过程中,支持对 Kafka 原始数据做二次处理(如转换,过滤等)。
六、FAQ
6.1、FE启动报错:java.lang.IllegalArgumentException: type mismatch
-Xmx8192m -XX:+UseMembar -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=7 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:-CMSParallelRemarkEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:SoftRefLRUPolicyMSPerMB=0 -Xloggc:/home/doris/fe/log/fe.gc.log.20220623-184807
Thu Jun 2318:48:07 CST 2022
java.lang.IllegalArgumentException: type mismatch
at org.apache.doris.common.ConfigBase.isBoolean(ConfigBase.java:289)
at org.apache.doris.common.ConfigBase.setConfigField(ConfigBase.java:233)
at org.apache.doris.common.ConfigBase.setFields(ConfigBase.java:201)
at org.apache.doris.common.ConfigBase.initConf(ConfigBase.java:116)
at org.apache.doris.common.ConfigBase.init(ConfigBase.java:94)
at org.apache.doris.PaloFe.start(PaloFe.java:88)
at org.apache.doris.PaloFe.main(PaloFe.java:63)
启动脚本如下所示:
curdir=$(dirname"$0")#获取当前启动脚本的路径curdir=$(cd"$curdir"pwd)OPTS=$(getopt \
-n $0 \
-o ''\
-l 'daemon'\
-l 'helper:'\
-- "$@")evalset -- "$OPTS"RUN_DAEMON=0HELPER=whiletrue;docase"$1"in
--daemon)RUN_DAEMON=1shift;;
--helper)HELPER=$2shift2;;
--)shiftbreak;;
*)
ehco "Internal error"exit1;;esacdoneexportDORIS_HOME=$(cd"$curdir/.."pwd)# export env variables from fe.conf## JAVA_OPTS# LOG_DIR# PID_DIRexportJAVA_OPTS="-Xmx1024m"exportLOG_DIR="$DORIS_HOME/log"exportPID_DIR=$(cd"$curdir"pwd)whileread line;doenvline=$(echo $line |sed's/[[:blank:]]*=[[:blank:]]*/=/g'|sed's/^[[:blank:]]*//g'|egrep"^[[:upper:]]([[:upper:]]|_|[[:digit:]])*=")envline=$(eval"echo $envline")if[[$envline== *"="* ]];theneval'export "$envline"'fidone<$DORIS_HOME/conf/fe.conf
if[ -e $DORIS_HOME/bin/palo_env.sh ];thensource$DORIS_HOME/bin/palo_env.sh
fiif[ -z "$JAVA_HOME"];thenJAVA=$(which java)elseJAVA="$JAVA_HOME/bin/java"fiif[! -x "$JAVA"];thenecho"The JAVA_HOME environment variable is not defined correctly"echo"This environment variable is needed to run this program"echo"NB: JAVA_HOME should point to a JDK not a JRE"exit1fi# get jdk version, return version as an Integer.# 1.8 => 8, 13.0 => 13jdk_version(){local result
localIFS=$'\n'# remove \r for Cygwinlocallines=$("$JAVA" -Xms32M -Xmx32M -version 2>&1|tr'\r''\n')forlinein$lines;doif[[(-z $result)&&($line= *"version \""*)]];thenlocalver=$(echo $line |sed -e 's/.*version "\(.*\)"\(.*\)/\1/; 1q')# on macOS, sed doesn't support '?'if[[$ver="1."* ]];thenresult=$(echo $ver |sed -e 's/1\.\([0-9]*\)\(.*\)/\1/; 1q')elseresult=$(echo $ver |sed -e 's/\([0-9]*\)\(.*\)/\1/; 1q')fifidoneecho"$result"}# need check and create if the log directory existed before outing message to the log file.if[! -d $LOG_DIR];thenmkdir -p $LOG_DIRfi# check java version and choose correct JAVA_OPTSjava_version=$(jdk_version)final_java_opt=$JAVA_OPTSif[$java_version -gt 8];thenif[ -z "$JAVA_OPTS_FOR_JDK_9"];thenecho"JAVA_OPTS_FOR_JDK_9 is not set in fe.conf">>$LOG_DIR/fe.out
exit1fifinal_java_opt=$JAVA_OPTS_FOR_JDK_9fiecho"using java version $java_version">>$LOG_DIR/fe.out
echo$final_java_opt>>$LOG_DIR/fe.out
# add libs to CLASSPATHforfin$DORIS_HOME/lib/*.jar;doCLASSPATH=$f:${CLASSPATH}doneexportCLASSPATH=${CLASSPATH}:${DORIS_HOME}/lib
pidfile=$PID_DIR/fe.pid
if[ -f $pidfile];thenifkill -0 $(cat $pidfile)> /dev/null 2>&1;thenecho Frontend running as process $(cat $pidfile). Stop it first.
exit1fifiif[! -f /bin/limit ];thenLIMIT=elseLIMIT=/bin/limit
fiecho$(date)>>$LOG_DIR/fe.out
if[ x"$HELPER"!= x""];then# change it to '-helper' to be compatible with code in FrontendHELPER="-helper $HELPER"fiif[${RUN_DAEMON} -eq 1];thennohup$LIMIT$JAVA$final_java_opt org.apache.doris.PaloFe ${HELPER}"$@">>$LOG_DIR/fe.out 2>&1< /dev/null &else$LIMIT$JAVA$final_java_opt org.apache.doris.PaloFe ${HELPER}"$@"< /dev/null
fiecho$!>$pidfile
调试如下:
从上图看,问题出现在脚本的166-167行,如下所示:
…………………………
153if[! -f /bin/limit ];then154LIMIT=155else156LIMIT=/bin/limit
157fi158159echo$(date)>>$LOG_DIR/fe.out
160161if[ x"$HELPER"!= x""];then162# change it to '-helper' to be compatible with code in Frontend163HELPER="-helper $HELPER"164fi165166if[${RUN_DAEMON} -eq 1];then167nohup$LIMIT$JAVA$final_java_opt org.apache.doris.PaloFe ${HELPER}"$@">>$LOG_DIR/fe.out 2>&1< /dev/null &168else169$LIMIT$JAVA$final_java_opt org.apache.doris.PaloFe ${HELPER}"$@"< /dev/null
170fi171172echo$!>$pidfile
发现之前调试,未加–daemon参数,重新调试:
查看:tail -200f /home/doris/fe/log/fe.gc.log.20220623-192315
ava HotSpot(TM)64-Bit Server VM (25.333-b02)for linux-amd64 JRE (1.8.0_333-b02), built on Apr 262022 05:49:04 by "java_re" with gcc 7.3.0
Memory: 4k page, physical 65807148k(25585204k free), swap 0k(0k free)
CommandLine flags: -XX:+CMSClassUnloadingEnabled -XX:CMSInitiatingOccupancyFraction=80 -XX:-CMSParallelRemarkEnabled -XX:InitialHeapSize=1052914368 -XX:MaxHeapSize=8589934592 -XX:MaxNewSize=1134141440 -XX:MaxTenuringThreshold=7 -XX:OldPLABSize=16 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:+UseMembar -XX:+UseParNewGC
Heap
par new generation total 309056K, used 126388K [0x00000005c0000000, 0x00000005d4f50000, 0x0000000603990000)
eden space 274752K, 46% used [0x00000005c0000000, 0x00000005c7b6d188, 0x00000005d0c50000)
from space 34304K, 0% used [0x00000005d0c50000, 0x00000005d0c50000, 0x00000005d2dd0000)
to space 34304K, 0% used [0x00000005d2dd0000, 0x00000005d2dd0000, 0x00000005d4f50000)
concurrent mark-sweep generation total 686784K, used 0K [0x0000000603990000, 0x000000062d840000, 0x00000007c0000000)
Metaspace used 11394K, capacity 11616K, committed 11776K, reserved 1058816K
class space used 1376K, capacity 1476K, committed 1536K, reserved 1048576K
gcc --version //验证gcc版本,输出如下
gcc (GCC) 10.2.0
可能原因: Doris会检查编译和运行的Java版本是否兼容,如果不兼容,会抛出Java版本不匹配异常信息并终止启动。
java -version //默认的java版本
java version "1.8.0_333"
Java(TM) SE Runtime Environment (build 1.8.0_333-b02)
Java HotSpot(TM)64-Bit Server VM (build 25.333-b02, mixed mode)
经最后最小化调试发现,是配置文件dynamic_partition_enable = ture导致的上述错误。应该是true,修正dynamic_partition_enable = true(写入永久生效)后程序启动正常。查询官网,该配置项为FE master独有,且默认是true,即开启状态,而是FE启动后通过 ADMIN SHOW FRONTEND CONFIG;来查看当前值。然后可以连接任意FE,执行如下命令修改配置:
ADMIN SET FRONTEND CONFIG ("dynamic_partition_enable"="true");#验证set forward_to_master =true;
ADMIN SHOW FRONTEND CONFIG;#重新启动FE,注意helper后的ip不能是本机sh ./bin/start_fe.sh --helper 172.18.1.74:9010 --daemon
#启动验证
jps
16608 PaloFe
17694 Jps
netstat -antp|grep9030
tcp6 00 :::9030 :::* LISTEN 16608/java
/usr/local/mysql/bin/mysql -h 172.18.1.38 -P 9030 -uroot -p
Enter password:
版权归原作者 羌俊恩 所有, 如有侵权,请联系我们删除。