大数据平台搭建 Hadoop 3.1.3 部署高可用
环境:
- ubuntu 22.04 下载
- hadoop 3.1.3 下载
- zookeeper 3.5.7 下载
- java 1.8 下载
- hive 3.1.2 下载
- hudi 0.12.0 下载
- clickhouse 21.9.4 下载
- flume 1.9.0 下载
- kafka 2.4.1 下载
- spark 3.1.1 下载
- flink 1.14.0 下载
- redis 6.2.6 下载
- hbase 2.2.3 下载
- mysql 5.7 下载
- ClickHouse 21.9.4 下载
本篇文章较长,以下是各个组件的单个文章
zookeeper为高可用基础
hadoop 3.1.3 高可用部署
hive 3.1.2 高可用部署
flink 1.14.0 高可用部署
1.前置条件
1.1 配置 IP 地址与主机名映射
三台主机都需要修改主机名映射

1.2 配置 ssh 免密
1 2 3 4
| ssh-keygen ssh-copy-id master ssh-copy-id slave1 ssh-copy-id slave2
|
1.3 解压相关包到要求的位置
xxx 代表你的相关位置
解压
1
| tar -zxvf /xxx/XXX.tar.gz -C /xxx/xxx/xxx
|
名称改短一点
1.4 配置 java 1.8
解压并添加环境变量
2.部署 zookeeper
2.1 准备好相关的压缩包并解压
xxx 代表你的相关位置
1
| tar -zxvf /xxx/XXX.tar.gz -C /xxx/xxx/xxx
|
2.2 设置环境变量
将我的路径改为你自己的
1 2 3
| export ZOOKEEPER_HOME=/opt/module/zookeeper357 export PATH=$ZOOKEEPER_HOME/bin:$PATH
|
记得分发和更新
2.3 配置文件
cd 到你解压的 zookeeper 的目录下
1
| cd /xxx/xxx/zookeeper357
|
2.3.1 编辑 zoo.cfg
先把 conf 中的 zoo_sample.xml 复制为 zoo.cfg
1
| cp conf/zoo_sample.xml conf/zoo.cfg
|
查找并编辑
1
| dataDir = /opt/module/zookeeper357/data
|
1
| dataLogDir = /opt/module/zookeeper357/logs
|
1 2 3
| server.1=master:2888:3888 server.2=slave1:2888:3888 server.3=slave2:2888:3888
|
2.3.2 编辑 myid
在上面的 dataDir 中创建 myid 并修改
在 zookeeper 的根目录创建 data
先创建 data
修改为 1,其他位置位置依次增加,如 slave1 中改为 2,slave2 改为 3
启动 zookeeper
查看 zookeeper 状态
停止 zookeeper
3.部署 hadoop 的高可用(HA)(须分发)
3.1.解压相关包到要求的位置
xxx 代表你的相关位置
1
| tar -zxvf /xxx/XXX.tar.gz -C /xxx/xxx/xxx
|
3.2 设置环境变量(须分发)
复制到 profile 的最底部
1 2 3 4 5 6 7 8
| #JAVA_HOME export JAVA_HOME=/opt/module/jdk18 export PATH=$PATH:$JAVA_HOME/bin
#HADOOP_HOME export HADOOP_HOME=/opt/module/hadoop313 export PATH=$PATH:$HADOOP_HOME/bin export PATH=$PATH:$HADOOP_HOME/sbin
|

3.3 配置 hadoop
cd 到你解压的 Hadoop 的目录下
3.3.1 编辑 core-site.xml
1
| vim etc/hadoop/core-site.xml
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <property> <name>hadoop.tmp.dir</name> <value>/opt/module/hadoop313/tmp</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>master:2181,slave1:2181,slave2:2181</value> </property> </configuration>
|
3.3.2 编辑 hdfs-site.xml
1
| vim etc/Hadoop hdfs-site.xml
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| <configuration> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>master:8020</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>slave2:8020</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>master:9870</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>slave2:9870</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://master:8485;slave1:8485;slave2:8485/mycluster</value> </property> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/root/.ssh/id_rsa</value> </property> <property> <name>dfs.namenode.name.dir</name> <value>file://${hadoop.tmp.dir}/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file://${hadoop.tmp.dir}/data</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>${hadoop.tmp.dir}/jn</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> </configuration>
|
3.3.3 编辑 mapreduce-site.xml
1
| vim etc/hadoop/mapreduce-site.xml
|
1 2 3 4 5 6
| <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> </configuration>
|
3.3.4 编辑 yarn-site.xml
1
| vim etc/hadoop/yarn-site.xml
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| <configuration> <property> <name>yarn.resourcemanager.ha.enabled</name> <value>true</value> </property>
<property> <name>yarn.resourcemanager.cluster-id</name> <value>clusterl</value> </property>
<property> <name>yarn.resourcemanager.ha.rm-ids</name> <value>rml,rm2</value> </property>
<property> <name>yarn.resourcemanager.hostname.rm1</name> <value>slave1</value> </property>
<property> <name>yarn.resourcemanager.hostname.rm2</name> <value>slavel</value> </property>
<property> <name>yarn.resourcemanager.webapp.address.rml</name> <value>master:8088</value> </property>
<property> <name>yarn.resourcemanager.webapp.address.rm2</name> <value>slave1:8088</value> </property>
<property> <name>hadoop.zk.address</name> <value>master:2181,slave1:2181,slave2:2181</value> </property> </configuration>
|
3.3.5 编辑 workers
和之前的 hosts 一致
3.3.6 编辑hadoop-env.sh
在末尾添加
1 2 3 4 5 6 7
| export JAVA_HOME=$JAVA_HOME
export HDFS_NAMENODE_USER=root export HDFS_DATANODE_USER=root export HDFS_SECONDARYNAMENODE_USER=root export YARN_RESOURCEMANAGER_USER=root export YARN_NODEMANAGER_USER=root
|
5.2 初始化 hadoop
(1)启动 各个节点 zookeeper
(2)启动 各个节点 journalnode
1
| hdfs --daemon start journalnode
|
(3)格式化 主节点 hadoop
1
| hdfs namenode -format (主)
|
(4)启动 主节点 namenode
1
| hdfs --daemon start namenode
|
(5)#测试 namenode 的热备机 即在 slave2 中启动 bootstrapStandby
1
| hdfs namenode -bootstrapStandby
|
(6) 在 slave2 启动 备用 namenode
1
| hdfs --daemon start namenode
|
如果执行完没有报错 那么 hadoop(HA)就搭建成功了
4.部署 hive
4.1 准备好相关的压缩包并解压
xxx 代表你的相关位置
1
| tar -zxvf /xxx/XXX.tar.gz -C /xxx/xxx/xxx
|
4.2 设置环境变量
将我的路径改为你自己的
1 2 3
| export HIVE_HOME=/opt/module/hive312 export PATH=$HIVE_HOME/bin:$PATH
|
4.3 部署 单机 hive
4.3.1 配置 hive-env.sh
cd 到你解压的 hive 的目录下
1
| cd /xxx/xxx/hive312/conf
|
复制 hive-env.sh.template 为 hive-env.sh
1
| cp hive-env.sh.template hive-env.sh
|
编辑 hive-env.sh 在最下面找到并修改
1 2 3 4 5
| HADOOP_HOME=/opt/module/hadoop313
export HIVE_CONF_DIR=/opt/module/hive313/conf
export HIVE_AUX_JARS_PATH=/opt/module/hive313/lib
|
4.3.2 编辑 hive-site.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>root</value> </property>
<property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property> <property> <name>datanucleus.autoCreateSchema</name> <value>true</value> </property> <property> <name>hive.metastore.schema.verification</name> <value>false</value> </property> </configuration>
|
4.3.3 MySQL JDBC驱动程序复制到Hive的lib目录:
1
| wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.32.tar.gz
|
1
| tar -xzf mysql-connector-java-8.0.32.tar.gz
|
1
| cp mysql-connector-java-8.0.32/mysql-connector-java-8.0.32.jar /usr/local/hive/lib/
|
初始化Hive Metastore数据库:
1
| schematool -initSchema -dbType mysql
|
4.3.5 启动和验证
启动Hive Metastore
在各个Metastore实例上启动Hive Metastore服务:
1
| hive --service metastore &
|
启动HiveServer2
在各个HiveServer2实例上启动HiveServer2服务:
1
| hive --service hiveserver2 &
|
使用 jps -m 查看是否有相关进程
4.3.6 验证Hive安装
使用beeline连接到HiveServer2:
1
| beeline -u jdbc:hive2://localhost:10000
|
在beeline中执行一些Hive命令来验证安装:
1 2 3 4
| SHOW DATABASES; CREATE TABLE test (id INT, name STRING); SHOW TABLES;
|
4.4 搭建 hive HiveServer2的高可用性 (需要分发)
4.4.1 配置文件
高可用需要确保更改conf下的配置文件中以下的配置
确保ZooKeeper集群已经正确配置并运行,以下配置项将ZooKeeper用于Hive的服务发现:
1 2 3 4 5 6 7 8 9 10 11 12 13
| <configuration> <property> <name>hive.zookeeper.quorum</name> <value>master,slave1,slave2</value> </property>
<property> <name>hive.zookeeper.client.port</name> <value>2181</value> </property> </configuration>
|
Hive Metastore高可用性需要配置多个Metastore实例,使用共享的数据库和ZooKeeper协调。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>root</value> </property>
<property> <name>hive.metastore.schema.verification</name> <value>false</value> </property>
<property> <name>hive.metastore.uris</name> <value>thrift://master:9083,thrift://slave1:9083,thrift://slave2:9083</value> </property>
<property> <name>hive.metastore.event.db.notification.api.auth</name> <value>false</value> </property> </configuration>
|
配置HiveServer2使用ZooKeeper进行服务发现和负载均衡:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| <configuration> <property> <name>hive.server2.support.dynamic.service.discovery</name> <value>true</value> </property>
<property> <name>hive.server2.zookeeper.namespace</name> <value>hiveserver2_zk</value> </property>
<property> <name>hive.server2.thrift.port</name> <value>10000</value> </property>
<property> <name>hive.server2.thrift.bind.host</name> <value>slave1</value> </property>
<property> <name>hive.server2.authentication</name> <value>NONE</value> </property>
<property> <name>hive.server2.webui.host</name> <value>slave1</value> </property>
<property> <name>hive.server2.webui.port</name> <value>10002</value> </property>
<property> <name>hive.zookeeper.quorum</name> <value>master,slave1,slave2</value> </property>
<property> <name>hive.zookeeper.client.port</name> <value>2181</value> </property> </configuration>
|
下面是示例配置文件
4.4.2 编辑 master 主机 的 hive-site.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
| <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value> </property> <property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property> <property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property> <property> <name>javax.jdo.option.ConnectionPassword</name> <value>root</value> </property>
<property> <name>datanucleus.autoCreateSchema</name> <value>true</value> </property>
<property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property>
<property> <name>hive.server2.thrift.port</name> <value>10000</value> </property>
<property> <name>hive.server2.thrift.bind.host</name> <value>master</value> </property>
<property> <name>hive.server2.authentication</name> <value>NONE</value> </property>
<property> <name>hive.server2.webui.host</name> <value>master</value> </property>
<property> <name>hive.server2.webui.port</name> <value>10002</value> </property>
<property> <name>hive.metastore.schema.verification</name> <value>false</value> </property>
<property> <name>hive.metastore.uris</name> <value>thrift://master:9083</value> </property>
<property> <name>hive.metastore.event.db.notification.api.auth</name> <value>false</value> </property>
<property> <name>hive.cli.print.header</name> <value>true</value> </property>
<property> <name>hive.cli.print.current.db</name> <value>true</value> </property>
<property> <name>hive.server2.support.dynamic.service.discovery</name> <value>true</value> </property>
<property> <name>hive.server2.zookeeper.namespace</name> <value>hiveserver2_zk</value> </property>
<property> <name>hive.zookeeper.quorum</name> <value>master,slave1,slave2</value> </property>
<property> <name>hive.zookeeper.client.port</name> <value>2181</value> </property> </configuration>
|
4.2.1.2 编辑 slave1 主机 的 hive-site.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
| <configuration> <property> <name>javax.jdo.option.ConnectionURL</name> <value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&useSSL=false</value> </property>
<property> <name>javax.jdo.option.ConnectionDriverName</name> <value>com.mysql.jdbc.Driver</value> </property>
<property> <name>javax.jdo.option.ConnectionUserName</name> <value>root</value> </property>
<property> <name>javax.jdo.option.ConnectionPassword</name> <value>root</value> </property>
<property> <name>datanucleus.autoCreateSchema</name> <value>true</value> </property>
<property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property>
<property> <name>hive.server2.thrift.port</name> <value>10000</value> </property>
<property> <name>hive.server2.thrift.bind.host</name> <value>slave1</value> </property>
<property> <name>hive.server2.authentication</name> <value>NONE</value> </property>
<property> <name>hive.server2.webui.host</name> <value>slave1</value> </property>
<property> <name>hive.server2.webui.port</name> <value>10002</value> </property>
<property> <name>hive.metastore.schema.verification</name> <value>false</value> </property>
<property> <name>hive.metastore.uris</name> <value>thrift://master:9083</value> </property>
<property> <name>hive.metastore.event.db.notification.api.auth</name> <value>false</value> </property>
<property> <name>hive.cli.print.header</name> <value>true</value> </property>
<property> <name>hive.cli.print.current.db</name> <value>true</value> </property>
<property> <name>hive.server2.support.dynamic.service.discovery</name> <value>true</value> </property>
<property> <name>hive.server2.zookeeper.namespace</name> <value>hiveserver2_zk</value> </property>
<property> <name>hive.zookeeper.quorum</name> <value>master,slave1,slave2</value> </property>
<property> <name>hive.zookeeper.client.port</name> <value>2181</value> </property> </configuration>
|
4.5 启动和验证
启动Hive Metastore
在各个Metastore实例上启动Hive Metastore服务:
1
| hive --service metastore &
|
启动HiveServer2
在各个HiveServer2实例上启动HiveServer2服务:
1
| hive --service hiveserver2 &
|
使用 jps -m 查看是否有相关进程
4.6 验证高可用性
通过beeline或hive CLI客户端连接到HiveServer2,使用ZooKeeper的连接字符串进行连接:
1
| beeline -u "jdbc:hive2://master:2181,slave1:2181,slave2:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_zk"
|
我只配了2台机器上的hive 所以地址只写了 master 和slave1
1
| !connect jdbc:hive2://master,slave1/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_zk along root
|
5.部署 flink 高可用 (standalone模式)
5.1 设置环境变量
将我的路径改为你自己的
1 2 3
| export FLINK_HOME=/opt/module/flink114 export PATH=$FLINK_HOME/bin:$PATH
|
记得分发和更新
5.2 配置文件
cd 到你解压的 flink114 的目录下
1
| cd /xxx/xxx/flink114/conf
|
5.2.1 编辑 flink-conf.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| high-availability: zookeeper high-availability.storageDir: hdfs://mycluster/flink/ha high-availability.zookeeper.quorum: master:2181,slave1:2181,slav2:2181 high-availability.cluster-id: /flink_cluster high-availability.jobmanager.port: 6123
jobmanager.rpc.address: master jobmanager.rpc.port: 6123
jobmanager.heap.size: 1024m taskmanager.heap.size: 1024m
taskmanager.numberOfTaskSlots: 2
state.backend: filesystem state.checkpoints.dir: hdfs://mycluster/flink/checkpoints state.savepoints.dir: hdfs://mycluster/flink/savepoints
rest.port: 8081
|
5.2.2 编辑 zoo.cfg
在下方修改并添加
1 2 3
| server.1=master:2888:3888 server.2=slave1:2888:3888 server.3=slave2:2888:3888
|
5.2.3 编辑 master
添加你的主机和从节点的hosts和他们的flink端口号
(主节点和失效后的备用节点)
5.2.4 编辑 workers
添加你的主机和从节点的hosts
(工作作业的节点)
5.3 启动Flink集群
启动JobManager
在JobManager节点上启动Flink的JobManager:
1
| bin/jobmanager.sh start cluster
|
确保在多个节点上启动JobManager,以实现高可用性。例如,在jobmanager2节点上也启动JobManager:
1
| bin/jobmanager.sh start cluster
|
启动TaskManager
在所有TaskManager节点上启动Flink的TaskManager:
1
| bin/taskmanager.sh start
|
一键启动
5.3.3 验证高可用性配置
可以通过Flink的Web UI(默认地址为http://jobmanager1:8081)来查看集群的状态。如果JobManager节点发生故障,ZooKeeper会协调新的JobManager节点接管任务,从而实现高可用性。

5.3.4 运行示例作业
可以通过Flink CLI提交一个示例作业来验证集群的正常运行:
1
| bin/flink run examples/streaming/WordCount.jar
|
6 kafka 高可用搭建
需要zookeeper服务运行
6.1 修改配置文件 server.properties
找到以下字段并修改为
1 2 3 4 5 6
| broker.id=1
listerners=PLAINTEXT://master:9002
advertisd.listerners=PLAINTEXT://master:9002
|
其他机器也相应进行更改
1 2 3 4 5 6
| broker.id=2
listerners=PLAINTEXT://slave1:9002
advertisd.listerners=PLAINTEXT://slave2:9002
|
6.2
7 spark on yarn
7.1
8 redis 搭建
8.1 解压并进入文件夹内
8.2 下载编译相关依赖
1 2
| sudo apt install build-essential pkg-config sudo apt install tcl
|
8.3 编译安装
8.4 创建并复制 redis.conf
1 2
| sudo mkdir /etc/redis sudo cp redis.conf /etc/redis/redis.conf
|
8.5 编辑 redis.conf
绑定地址
内存管理(非必须)
1 2 3
| maxmemory 256mb maxmemory-policy allkeys-lru
|
持久化(非必须)
1 2 3 4
| save 900 1 save 300 10 save 60 10000 appendonly yes
|
8.6 启动redis
1 2
| redis-server /etc/redis/redis.conf
|
设置Redis为系统服务
创建一个Systemd服务单元文件,例如/etc/systemd/system/redis.service:
1
| vim /etc/systemd/system/redis.service
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| [Unit] Description=Redis In-Memory Data Store After=network.target
[Service] User=redis Group=redis ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf ExecStop=/usr/local/bin/redis-cli shutdown Restart=always
[Install] WantedBy=multi-user.target
|
重新加载Systemd服务配置
1
| sudo systemctl daemon-reload
|
8.7 测试redis
连接到Redis服务器
测试基本命令
1 2 3
| set testkey "Hello, Redis!" get testkey
|