Apache Doris
是一款现代 MPP
(Massively Parallel Processing大规模并行处理) 的分布式 SQL 分析数据库,所谓分析数据库就是将其数据集分布在许多机器或节点上,以处理大量数据,采用 Apache 2.0
认证授权。它的前身是原百度 Palo
,由百度在2017年开源,2018年进入 Apache 孵化器。Apache Doris
它可以提供亚秒级查询和高效的实时数据分析。凭借其分布式架构,将支持高达 10PB 级别的数据集,并且易于操作。它可以满足各种数据分析场景,比如:历史数据报告、实时数据分析、交互式数据分析、探索性数据分析等。
Doris
主要集成了 Google Mesa
和 Apache Impala
的技术,基于列式存储引擎,可以通过 MySQL
客户端进行通信。Doris
的定位是面向在线报表和分析的数据仓库系统,可以对标于商业的 MPP
数据仓库系统,比如 Greenplum
、Vertica
、Teradata
等。
安装前需要有 JDK
环境,Doris
安装包下载路径:apache-doris-1.0.0-incubating-bin.tar.gz
[hadoop@node01 ~]$ tar -zxvf apache-doris-1.0.0-incubating-bin.tar.gz
[hadoop@node01 ~]$ mv apache-doris-1.0.0-incubating-bin doris-1.0.0
[hadoop@node01 ~]$ cd doris-1.0.0
[hadoop@node01 doris-1.0.0]$ vim fe/conf/fe.conf
# 添加 priority_networks 参数
priority_networks = 192.168.91.145/24
[hadoop@node01 doris-1.0.0]$ vim be/conf/be.conf
# 添加 priority_networks 参数
priority_networks = 192.168.91.145/24
[hadoop@node01 ~]$ ./doris-1.0.0/fe/bin/start_fe.sh --daemon (--daemon在后台启动)
[hadoop@node01 ~]$ ./doris-1.0.0/be/bin/start_be.sh --daemon
报错:
解决:在 be.conf 文件中修改 webserver_port
的端口号为:
# 原端口号为8040
webserver_port = 8041
如果是 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
的连通性。
mysql -uroot -P9030 -h192.168.91.145
mysql> ALTER SYSTEM ADD BACKEND "192.168.91.145:9050";
# 如不小心填错了,可用这个删除:alter system decommission backend "192.168.91.145:9050";
# 执行下面的命令查看 FE 运行状态
mysql> SHOW PROC '/frontends'\G
*************************** 1. row ***************************
Name: 192.168.91.145_9010_1666082925048
IP: 192.168.91.145
HostName: node01
EditLogPort: 9010
HttpPort: 8030
QueryPort: 9030
RpcPort: 9020
Role: FOLLOWER
IsMaster: true
ClusterId: 757519444
Join: true
Alive: true
ReplayedJournalId: 205
LastHeartbeat: 2022-10-18 01:59:53
IsHelper: true
ErrMsg:
Version: 1.0.0-rc03-Unknown
CurrentConnected: Yes
# 执行下面的命令查看 BE 运行状态
mysql> SHOW PROC '/backends'\G
*************************** 1. row ***************************
BackendId: 10003
Cluster: default_cluster
IP: 192.168.91.145
HostName: node01
HeartbeatPort: 9050
BePort: 9060
HttpPort: 8041
BrpcPort: 8060
LastStartTime: 2022-10-18 01:53:05
LastHeartbeat: 2022-10-18 01:59:58
Alive: true
SystemDecommissioned: false
ClusterDecommissioned: false
TabletNum: 0
DataUsedCapacity: 0.000
AvailCapacity: 27.579 GB
TotalCapacity: 36.687 GB
UsedPct: 24.83 %
MaxDiskUsedPct: 24.83 %
Tag: {"location" : "default"}
ErrMsg:
Version: 1.0.0-rc03-Unknown
Status: {"lastSuccessReportTabletsTime":"2022-10-18 01:59:31","lastStreamLoadTime":-1,"isQueryDisabled":false,"isLoadDisabled":false}
# 创建表
create database demo;
use demo;
CREATE TABLE IF NOT EXISTS demo.expamle_tbl
(
`user_id` LARGEINT NOT NULL COMMENT "用户id",
`date` DATE 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 "用户最小停留时间"
)
AGGREGATE KEY(`user_id`, `date`, `city`, `age`, `sex`)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);
# 导入数据
[hadoop@node03 ~]$ vim test.csv
10000,2017-10-01,北京,20,0,2017-10-01 06:00:00,20,10,10
10000,2017-10-01,北京,20,0,2017-10-01 07:00:00,15,2,2
10001,2017-10-01,北京,30,1,2017-10-01 17:05:45,2,22,22
10002,2017-10-02,上海,20,1,2017-10-02 12:59:12,200,5,5
10003,2017-10-02,广州,32,0,2017-10-02 11:20:00,30,11,11
10004,2017-10-01,深圳,35,0,2017-10-01 10:00:15,100,3,3
10004,2017-10-03,深圳,35,0,2017-10-03 10:20:22,11,6,6
curl --location-trusted -u root: -T test.csv -H "column_separator:," http://127.0.0.1:8030/api/demo/expamle_tbl/_stream_load
# -T test.csv : 这里是我们刚才保存的数据文件,如果路径不一样,请指定完整路径
# -u root : 这里是用户名密码,我们使用默认用户root,密码是空
# 127.0.0.1:8030 : 分别是 fe 的 ip 和 http_port
# 执行成功之后我们可以看到下面的返回信息:
{
"TxnId": 1,
"Label": "1e457682-d8f6-46c5-a996-f06ebaa70cd9",
"TwoPhaseCommit": "false",
"Status": "Success",
"Message": "OK",
"NumberTotalRows": 7,
"NumberLoadedRows": 7,
"NumberFilteredRows": 0,
"NumberUnselectedRows": 0,
"LoadBytes": 399,
"LoadTimeMs": 663,
"BeginTxnTimeMs": 59,
"StreamLoadPutTimeMs": 212,
"ReadDataTimeMs": 0,
"WriteDataTimeMs": 134,
"CommitAndPublishTimeMs": 249
}
# NumberLoadedRows: 表示已经导入的数据记录数
# NumberTotalRows: 表示要导入的总数据量
# Status :Success 表示导入成功
# 其他建表语句示例
CREATE TABLE test_log
(
`timestamp` DATETIME NOT NULL COMMENT "日志时间",
`type` INT NOT NULL COMMENT "日志类型",
`error_code` INT COMMENT "错误码",
`op_id` BIGINT COMMENT "负责人id"
)
DUPLICATE KEY(`timestamp`, `type`)
DISTRIBUTED BY HASH(`timestamp`) BUCKETS 10
PROPERTIES
(
"replication_num" = "1"
);
有一次去客户那里的阿里云上安装 Doris,出现了报 CPU 不支持 AVX 的错误导致无法部署成功。后来查看官网是有这方面说明的。后来修改了阿里云上虚拟机的 CPU 配置后解决了该问题。
后面又出现了报没有 HDD 介质导致建表不成功的问题,errCode = 2, detailMessage = Failed to find enough host with storage medium and tag(HDD/{"location" : "default"}) in all backends. need: 1
,后来按网上的方法(Doris0.15版本建表报错Failed to find enough host with storage medium and tag)并没有解决,可能是虚拟机配置的有问题,等有时间再研究吧。
参考:
https://doris.apache.org/zh-CN/docs/get-starting/
apache doris在蜀海供应链数仓建设中的实践
大数据之实时数据分析之Apache Doris数据库
大数据Hadoop之——DorisDB介绍与环境部署(StarRocks)
铸剑14年,Apache Doris终毕业!百度PALO助力顶级项目持续精进
Apache Doris 单节点(可多节点)Docker集群制作教程
DorisSQL与MySQL函数与语法对照差异篇