Doris集群搭建
1、虚拟机创建
创建三台centos7虚拟机,分别命名为hadoop102(192.168.10.102)、hadoop103(192.168.10.103)、hadoop104(192.168.10.104)。
2、虚拟机设置
2.1 关闭防火墙
查看状态
firewall-cmd --state
刷新
firewall-cmd --reload
启动/停止
systemctl start firewalld.service
systemctl stop firewalld.service
启用/禁止 开机启动
systemctl enable firewalld.service
systemctl disable firewalld.service
2.2 新建一个普通用户
新建用户
adduser doris
设置密码
passwd doris
sudo
权限
方式1
usermod -aG wheel doris
方式2
修改/etc/sudoers文件,在%wheel这行下面添加一行
doris ALL=(ALL) NOPASSWD:ALL
2.3 时钟同步
使用ntpdate
使用如下命令检查是否安装,没有安装运行安装命令安装即可
rpm -q ntpdate
同步系统时间
公共NTP服务器
pool.ntp.org
time.google.com
time.windows.com
使用ntpdate
命令同步系统时间
sudo ntpdate pool.ntp.org
也可以选择阿里云时钟服务器
sudo ntpdate ntp.aliyun.com
硬件时间同步
将系统时间写入硬件时钟,以确保重启后时间仍然准确
sudo hwclock -w
设置时间同步定时任务
# 设置时间同步定时任务,每小时执行一次
(crontab -l 2>/dev/null; echo "0 * * * * /usr/sbin/ntpdate pool.ntp.org; /sbin/hwclock -w") | crontab -
2.4 免密登录
在每台机器上生成SSH密钥对
ssh-keygen -t rsa
将公钥复制到其他机器
以103为例
ssh-copy-id hadoop103
登录测试
ssh hadoop103
2.5 关闭SELinux
查看 SElinux 状态
getenforce
Enforcing表示开启,Permissive表示临时关闭,disabled表示永久关闭
临时关闭 SElinux
sudo setenforce 0
重启后失效
永久关闭 SElinux
sudo vi /etc/sysconfig/selinux
将SELINUX设置为disabled,重新启动。
2.6 关闭swap分区
临时关闭
sudo swapoff -a
2.7 调整文件句柄数和进程数限制
修改配置文件
sudo vi /etc/security/limits.conf
添加如下内容
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
覆盖特定的配置文件
sudo vi /etc/security/limits.d/20-nproc.conf
添加如下内容
* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
检查生效
ulimit -a
2.8 虚拟内存区域限制
临时修改
sudo sysctl -w vm.max_map_count=2000000
重启失效
永久修改
sudo vi /etc/sysctl.conf
添加
vm.max_map_count=2000000
执行如下命令生效
sudo sysctl -p
检查是否生效
sysctl vm.max_map_count
2.9 临时禁用透明大页
echo never > /sys/kernel/mm/transparent_hugepage/enabled
分发、查看进程脚本和安装JDK,均参考尚硅谷即可。
3、Doris
3.1 下载安装
访问官网:Apache Doris - Download | Easily deploy Doris anywhere - Apache Doris
也可以点击Copy link复制下载链接,执行如下命令下载:
wget https://apache-doris-releases.oss-accelerate.aliyuncs.com/apache-doris-2.1.6-bin-x64.tar.gz
tar -zxvf apache-doris-2.1.6-bin-x64.tar.gz -C /opt/module/
mv apache-doris-2.1.6-bin-x64/ apache-doris
解压到了/opt/module目录下,改名为apache-doris,通过xsync脚本分发给hadoop103和hadoop104,并且都配置了环境变量。
vim /etc/profile.d/my_env.sh
里面有JDK的环境变量
#JAVA_HOME
export JAVA_HOME=/opt/module/jdk-1.8.0
export PATH=$PATH:$JAVA_HOME/bin
# DORIS_HOME
export DORIS_HOME=/opt/module/apache-doris
export PATH=$PATH:$DORIS_HOME/be/bin
export PATH=$PATH:$DORIS_HOME/fe/bin
3.2 部署FE(Frontend)节点
3.2.1 hadoop102(Master FE)
创建元数据目录
mkdir -p /opt/module/data/doris-meta
把该目录分发给hadoop103和hadoop104
配置fe.conf
文件
cd /opt/module/apache-doris/fe/conf
vim fe.conf
端口选择了默认的端口 ,添加如下即可
meta_dir = /opt/module/data/doris-meta
priority_networks = 192.168.10.0/24
启动
/opt/module/apache-doris/fe/bin/start_fe.sh --daemon
3.2.2 hadoop103和hadoop104(Follower FE)
将hadoop102的fe分发给hadoop103和hadoop104即可,首次启动,需要使用--helper
参数指向Master FE。
/opt/module/apache-doris/fe/bin/start_fe.sh --helper 192.168.10.102:9010 --daemon
之后使用如下命令启动即可
/opt/module/apache-doris/fe/bin/start_fe.sh --daemon
3.2.3 在Master FE上添加Follower
我的MySQL是安装在本地的,打开命令提示符,无密登录
mysql -h hadoop102 -P 9030 -u root
或者通过navicat连接
执行如下语句
ALTER SYSTEM ADD FOLLOWER "192.168.10.103:9010";
ALTER SYSTEM ADD FOLLOWER "192.168.10.104:9010";
3.2.4 访问FE的UI界面
http://192.168.10.102:8030
3.3 部署BE(Backend)节点
3.3.1 hadoop102、hadoop103 和 hadoop104 上的 BE 配置
目录创建
每台机器的 /opt/module/data/
目录下创建了对应的 be_data102(103、104)
子目录,BE节点使用这些目录来存储数据
配置be.conf
文件
对于每台机器,需要编辑 be.conf
文件以指定storage_root_path
。
对于 hadoop102:
cd /opt/module/apache-doris/be/conf
vim be.conf
storage_root_path=/opt/module/data/be_data102
对于 hadoop103:
cd /opt/module/apache-doris/be/conf
vim be.conf
storage_root_path=/opt/module/data/be_data103
对于 hadoop104:
cd /opt/module/apache-doris/be/conf
vim be.conf
storage_root_path=/opt/module/data/be_data104
确保每台机器的 priority_networks
配置项保持不变
priority_networks = 192.168.10.0/24
3.3.2 配置权限
确保 Doris 运行的用户(通常是 doris
或者部署 Doris 的用户)有权限读写这些新目录。
chown -R doris:doris /opt/module/data/be_data102
chown -R doris:doris /opt/module/data/be_data103
chown -R doris:doris /opt/module/data/be_data104
3.3.3 每台启动BE
/opt/module/apache-doris/be/bin/start_be.sh --daemon
验证配置
可以通过访问 BE 的 Web 界面 http://<BE_IP>:8040/varz
来查看当前配置项,确保 storage_root_path
已经正确设置为对应的 be_data
目录
3.3.4 在 Master FE 上添加 BE 节点
确保在 Master FE 上添加了所有 BE 节点
ALTER SYSTEM ADD BACKEND "192.168.10.102:9050";
ALTER SYSTEM ADD BACKEND "192.168.10.103:9050";
ALTER SYSTEM ADD BACKEND "192.168.10.104:9050";
3.3.5 访问BE的UI界面
http://192.168.10.102:8040
4、验证集群状态
SHOW FRONTENDS;
SHOW BACKENDS;
5、seatunnel导入本地MySQL数据到Doris中
5.1 下载按照seatunnel
进入seatunnel的官方网站:Apache SeaTunnel,我这里下载的是2.3.6版本。
下载后上传到虚拟机,并且解压到对应目录,改名为seatunnel-2.3.6。
5.2 下载对应的Connector 插件
进入seatunnel的config目录
cd /opt/module/seatunnel-2.3.6/config
修改plugin_config,这里只需要两个即可。
vim plugin_config
--connectors-v2--
connector-jdbc
connector-doris
--end--
~
保存退出后执行
sh bin/install-plugin.sh
进入seatunnel目录下的connectors/目录下即可看见刚才下载的jar包
5.3 MySQL驱动jar包
进入MySQL官网下载对应版本的驱动jar,上传到seatunnel的lib目录下
5.4 单表导入
如果在本地数据库中有一张表的数据需要导入到Doris中,那么需要提前在下游Doris中提前创建一张一样的表。(我在Doris中创建了一样的数据库news_data)
编写配置文件,这里放在config目录下,内容如下:
env {
parallelism = 2
job.mode = "BATCH"
}
source {
Jdbc {
url = "jdbc:mysql://192.168.10.1:3306/news_data"
driver = "com.mysql.cj.jdbc.Driver"
connection_check_timeout_sec = 100
user = "debezium"
password = "123456"
table_path = ""
query = "select * from user_information"
}
}
sink {
Doris {
fenodes = "192.168.10.102:8030"
username = "root"
password = ""
database = "news_data"
table = "user_information"
sink.enable-2pc = "true"
sink.label-prefix = "test"
doris.config = {
format = "json"
read_json_by_line="true"
}
}
}
本地的数据库的连接的用户要开启对应的权限,可以参考之前的seatunnel全量数据导入HDFS时候给debezium用户开启的权限过程,最好不要直接用root用户,我的Doris是还没有设置密码,所以没有填写密码。
来到bin目录下执行如下命令:
./seatunnel.sh --config /opt/module/seatunnel-2.3.6/config/mysql_doris.conf -m local
浏览器输入hadoop102:8030,登录进去即可看见对应的数据库、表及其数据
5.5 多表导入
一定要提前在下游创建对应的表
这里通过写脚本的形式来运行,脚本(mysql_to_doris)如下:
#!/bin/bash
# MySQL数据库信息
MYSQL_HOST="192.168.10.1"
MYSQL_PORT="3306"
MYSQL_USER="debezium"
MYSQL_PASS="123456"
MYSQL_DB="shop_data"
# Doris数据库信息
DORIS_HOST="192.168.10.102"
DORIS_PORT="8030"
DORIS_USER="root"
DORIS_PASS=""
DORIS_DB="shop_data"
# SeaTunnel配置文件目录
SEATUNNEL_CONF_DIR="/opt/module/seatunnel-2.3.6/config"
# 生成配置文件并执行SeaTunnel
tables=$(mysql -h${MYSQL_HOST} -P${MYSQL_PORT} -u${MYSQL_USER} -p${MYSQL_PASS} -D${MYSQL_DB} -e "SHOW TABLES;" | awk '{ print $1 }' | grep -v 'Tables_in_')
for table in $tables; do
# 生成配置文件名
conf_file="${SEATUNNEL_CONF_DIR}/${table}_doris.conf"
# 写入配置文件内容
cat > ${conf_file} << EOF
env {
parallelism = 2
job.mode = "BATCH"
}
source {
Jdbc {
url = "jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${MYSQL_DB}"
driver = "com.mysql.cj.jdbc.Driver"
connection_check_timeout_sec = 100
user = "${MYSQL_USER}"
password = "${MYSQL_PASS}"
table_path = ""
query = "select * from ${table}"
}
}
sink {
Doris {
fenodes = "${DORIS_HOST}:${DORIS_PORT}"
username = "${DORIS_USER}"
password = "${DORIS_PASS}"
database = "${DORIS_DB}"
table = "${table}"
sink.enable-2pc = "true"
sink.label-prefix = "test"
doris.config = {
format = "json"
read_json_by_line="true"
}
}
}
EOF
# 执行SeaTunnel任务
/opt/module/seatunnel-2.3.6/bin/seatunnel.sh --config ${conf_file} -m local
# 删除配置文件
rm -f ${conf_file}
done
给脚本赋予权限
chmod 777 mysql_to_doris
执行脚本
./mysql_to_doris
获取数据库表名并循环处理
tables=$(mysql -h${MYSQL_HOST} -P${MYSQL_PORT} -u${MYSQL_USER} -p${MYSQL_PASS} -D${MYSQL_DB} -e "SHOW TABLES;" | awk '{ print $1 }' | grep -v 'Tables_in_')
for table in $tables; do
这一部分是获取MySQL数据库中所有表名的关键步骤:
mysql
命令用于连接到MySQL数据库并执行SQL命令。-h${MYSQL_HOST}
指定数据库主机。-P${MYSQL_PORT}
指定数据库端口。-u${MYSQL_USER}
指定数据库用户。-p${MYSQL_PASS}
指定数据库密码。-D${MYSQL_DB}
指定数据库名。-e "SHOW TABLES;"
执行SQL命令来显示所有表。
awk '{ print $1 }'
通过awk
命令提取SHOW TABLES;
命令输出的第一列,即表名。grep -v 'Tables_in_'
用于过滤掉SHOW TABLES;
命令输出中的第一行,它通常包含Tables_in_${MYSQL_DB}
这样的文本,这不是表名。
通过管道组合这些命令,最终得到一个包含所有表名的字符串tables
。