大数据平台搭建 Hadoop 3.1.3 部署高可用

环境:

本篇文章较长,以下是各个组件的单个文章

zookeeper为高可用基础

hadoop 3.1.3 高可用部署
hive 3.1.2 高可用部署
flink 1.14.0 高可用部署

1.前置条件

1.1 配置 IP 地址与主机名映射

三台主机都需要修改主机名映射

1
vim /etc/hosts

配置host

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
mv 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
Vim	/etc/profile

将我的路径改为你自己的

1
2
3
#zookeeper
export ZOOKEEPER_HOME=/opt/module/zookeeper357
export PATH=$ZOOKEEPER_HOME/bin:$PATH

记得分发和更新

1
source /etc/profile

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
clientPort=2181
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
mkdir data
1
vim data/myid

修改为 1,其他位置位置依次增加,如 slave1 中改为 2,slave2 改为 3

1
1

启动 zookeeper

1
zkServer.sh start

查看 zookeeper 状态

1
zkServer.sh status

停止 zookeeper

1
zkServer.sh stop

3.部署 hadoop 的高可用(HA)(须分发)

3.1.解压相关包到要求的位置

xxx 代表你的相关位置

1
tar -zxvf /xxx/XXX.tar.gz -C /xxx/xxx/xxx

3.2 设置环境变量(须分发)

1
Vim	/etc/profile

复制到 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

配置profile

3.3 配置 hadoop

cd 到你解压的 Hadoop 的目录下

1
cd /xxx/xxx/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>
<!-- 配置默认的文件系统为HDFS,并指定HDFS集群的名称为"mycluster" -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>

<!-- 指定Hadoop的临时目录位置 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/module/hadoop313/tmp</value>
</property>

<!-- 配置ZooKeeper的Quorum,用于Hadoop高可用性设置,包含三个ZooKeeper节点 -->
<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>
<!-- 配置HDFS的名称服务,该集群名称为"mycluster" -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>

<!-- 配置HDFS高可用性(HA)集群中NameNode的名称 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>

<!-- 配置NameNode nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>master:8020</value>
</property>

<!-- 配置NameNode nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>slave2:8020</value>
</property>

<!-- 配置NameNode nn1的HTTP通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>master:9870</value>
</property>

<!-- 配置NameNode nn2的HTTP通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>slave2:9870</value>
</property>

<!-- 配置共享编辑日志目录,用于JournalNode集群的Quorum Journal Manager (QJM) -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slave1:8485;slave2:8485/mycluster</value>
</property>

<!-- 配置HDFS客户端的故障转移代理提供者 -->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>

<!-- 配置高可用性NameNode的隔离方法,这里使用sshfence -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>

<!-- 配置用于SSH隔离的私钥文件路径 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>

<!-- 配置NameNode的数据存储目录 -->
<property>
<name>dfs.namenode.name.dir</name>
<value>file://${hadoop.tmp.dir}/name</value>
</property>

<!-- 配置DataNode的数据存储目录 -->
<property>
<name>dfs.datanode.data.dir</name>
<value>file://${hadoop.tmp.dir}/data</value>
</property>

<!-- 配置JournalNode的编辑日志目录 -->
<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>
<!-- 启用YARN ResourceManager的高可用性(HA) -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>

<!-- 配置YARN ResourceManager集群的ID -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>clusterl</value>
</property>

<!-- 列出所有的ResourceManager实例ID -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rml,rm2</value>
</property>

<!-- 配置ResourceManager实例rm1的主机名 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>slave1</value>
</property>

<!-- 配置ResourceManager实例rm2的主机名 -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>slavel</value>
</property>

<!-- 配置ResourceManager实例rml的Web应用地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rml</name>
<value>master:8088</value>
</property>

<!-- 配置ResourceManager实例rm2的Web应用地址 -->
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>slave1:8088</value>
</property>

<!-- 配置ZooKeeper的地址,用于协调YARN ResourceManager的高可用性 -->
<property>
<name>hadoop.zk.address</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
</configuration>

3.3.5 编辑 workers

1
vim etc/hadoop/workers

和之前的 hosts 一致

1
2
3
master
slave1
slave2

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

1
zkSever.sh start

(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
vim	/etc/profile

将我的路径改为你自己的

1
2
3
#HIVE
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>
<!-- 配置JDBC连接URL,用于连接Hive元数据存储的MySQL数据库 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&amp;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/

4.3.4 初始化 Hive Metastore

初始化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 查看是否有相关进程

1
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>
<!-- 配置ZooKeeper的Quorum,用于HiveServer2高可用性设置 -->
<property>
<name>hive.zookeeper.quorum</name>
<value>master,slave1,slave2</value>
</property>

<!-- 配置ZooKeeper的客户端端口 -->
<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>
<!-- 配置JDBC -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&amp;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>

<!-- 配置Hive元数据服务的Thrift URI,多个Metastore实例可以共用相同的URI -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://master:9083,thrift://slave1:9083,thrift://slave2:9083</value>
</property>

<!-- 禁用Hive元数据事件通知的API认证 -->
<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>
<!-- 启用HiveServer2支持动态服务发现 -->
<property>
<name>hive.server2.support.dynamic.service.discovery</name>
<value>true</value>
</property>

<!-- 配置HiveServer2在ZooKeeper中的命名空间 -->
<property>
<name>hive.server2.zookeeper.namespace</name>
<value>hiveserver2_zk</value>
</property>

<!-- 配置HiveServer2的Thrift服务端口 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>

<!-- 配置HiveServer2绑定的主机,高可用需要更改为该机器的hosts名字 -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>slave1</value>
</property>

<!-- 配置HiveServer2的认证方式,这里设置为NONE表示不需要认证 -->
<property>
<name>hive.server2.authentication</name>
<value>NONE</value>
</property>

<!-- 配置HiveServer2 Web UI的主机 -->
<property>
<name>hive.server2.webui.host</name>
<value>slave1</value>
</property>

<!-- 配置HiveServer2 Web UI的端口 -->
<property>
<name>hive.server2.webui.port</name>
<value>10002</value>
</property>

<!-- 配置ZooKeeper的Quorum,用于HiveServer2高可用性设置 -->
<property>
<name>hive.zookeeper.quorum</name>
<value>master,slave1,slave2</value>
</property>

<!-- 配置ZooKeeper的客户端端口 -->
<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>
<!-- 配置JDBC -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&amp;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>

<!-- 配置Hive数据仓库目录 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>

<!-- 配置HiveServer2的Thrift服务端口 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>

<!-- 配置HiveServer2绑定的主机 -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>master</value>
</property>

<!-- 配置HiveServer2的认证方式,这里设置为NONE表示不需要认证 -->
<property>
<name>hive.server2.authentication</name>
<value>NONE</value>
</property>

<!-- 配置HiveServer2 Web UI的主机 -->
<property>
<name>hive.server2.webui.host</name>
<value>master</value>
</property>

<!-- 配置HiveServer2 Web UI的端口 -->
<property>
<name>hive.server2.webui.port</name>
<value>10002</value>
</property>

<!-- 禁用元数据模式验证 -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>

<!-- 配置Hive元数据服务的Thrift URI -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://master:9083</value>
</property>

<!-- 禁用Hive元数据事件通知的API认证 -->
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>

<!-- 配置Hive CLI打印表头 -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>

<!-- 配置Hive CLI打印当前数据库名称 -->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>

<!-- 启用HiveServer2支持动态服务发现 -->
<property>
<name>hive.server2.support.dynamic.service.discovery</name>
<value>true</value>
</property>

<!-- 配置HiveServer2在ZooKeeper中的命名空间 -->
<property>
<name>hive.server2.zookeeper.namespace</name>
<value>hiveserver2_zk</value>
</property>

<!-- 配置ZooKeeper的Quorum,用于HiveServer2高可用性设置 -->
<property>
<name>hive.zookeeper.quorum</name>
<value>master,slave1,slave2</value>
</property>

<!-- 配置ZooKeeper的客户端端口 -->
<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>
<!-- 配置JDBC连接URL,用于连接Hive元数据存储的MySQL数据库 -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://master:3306/hive?createDatabaseIfNotExist=true&amp;useSSL=false</value>
</property>

<!-- 配置JDBC驱动程序类名,用于MySQL连接 -->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>

<!-- 配置连接MySQL数据库的用户名 -->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>

<!-- 配置连接MySQL数据库的密码 -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>

<!-- 启用自动创建数据库模式 -->
<property>
<name>datanucleus.autoCreateSchema</name>
<value>true</value>
</property>




<!-- 配置Hive数据仓库目录 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>

<!-- 配置HiveServer2的Thrift服务端口 -->
<property>
<name>hive.server2.thrift.port</name>
<value>10000</value>
</property>

<!-- 配置HiveServer2绑定的主机 -->
<property>
<name>hive.server2.thrift.bind.host</name>
<value>slave1</value>
</property>

<!-- 配置HiveServer2的认证方式,这里设置为NONE表示不需要认证 -->
<property>
<name>hive.server2.authentication</name>
<value>NONE</value>
</property>

<!-- 配置HiveServer2 Web UI的主机 -->
<property>
<name>hive.server2.webui.host</name>
<value>slave1</value>
</property>

<!-- 配置HiveServer2 Web UI的端口 -->
<property>
<name>hive.server2.webui.port</name>
<value>10002</value>
</property>

<!-- 禁用元数据模式验证 -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>

<!-- 配置Hive元数据服务的Thrift URI -->
<property>
<name>hive.metastore.uris</name>
<value>thrift://master:9083</value>
</property>

<!-- 禁用Hive元数据事件通知的API认证 -->
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>

<!-- 配置Hive CLI打印表头 -->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>

<!-- 配置Hive CLI打印当前数据库名称 -->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>

<!-- 启用HiveServer2支持动态服务发现 -->
<property>
<name>hive.server2.support.dynamic.service.discovery</name>
<value>true</value>
</property>

<!-- 配置HiveServer2在ZooKeeper中的命名空间 -->
<property>
<name>hive.server2.zookeeper.namespace</name>
<value>hiveserver2_zk</value>
</property>

<!-- 配置ZooKeeper的Quorum,用于HiveServer2高可用性设置 -->
<property>
<name>hive.zookeeper.quorum</name>
<value>master,slave1,slave2</value>
</property>

<!-- 配置ZooKeeper的客户端端口 -->
<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 查看是否有相关进程

1
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.1 设置环境变量

1
Vim	/etc/profile

将我的路径改为你自己的

1
2
3
#flink114
export FLINK_HOME=/opt/module/flink114
export PATH=$FLINK_HOME/bin:$PATH

记得分发和更新

1
source /etc/profile

5.2 配置文件

cd 到你解压的 flink114 的目录下

1
cd /xxx/xxx/flink114/conf
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端口号

(主节点和失效后的备用节点)

1
2
master:8081
slave1:8081

5.2.4 编辑 workers

添加你的主机和从节点的hosts

(工作作业的节点)

1
2
slave1
slave2

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

一键启动

1
bin/start-cluster.sh

5.3.3 验证高可用性配置

可以通过Flink的Web UI(默认地址为http://jobmanager1:8081)来查看集群的状态。如果JobManager节点发生故障,ZooKeeper会协调新的JobManager节点接管任务,从而实现高可用性。

flink高可用web截图

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
#修改为本机的hosts
listerners=PLAINTEXT://master:9002

advertisd.listerners=PLAINTEXT://master:9002

其他机器也相应进行更改

1
2
3
4
5
6
#修改为唯一的标识符
broker.id=2
#修改为本机的hosts
listerners=PLAINTEXT://slave1:9002

advertisd.listerners=PLAINTEXT://slave2:9002

6.2

7 spark on yarn

7.1

8 redis 搭建

8.1 解压并进入文件夹内

1

8.2 下载编译相关依赖

1
2
sudo apt install build-essential pkg-config
sudo apt install tcl

8.3 编译安装

1
2
make
make install

8.4 创建并复制 redis.conf

1
2
sudo mkdir /etc/redis
sudo cp redis.conf /etc/redis/redis.conf

8.5 编辑 redis.conf

绑定地址

1
2
bind 0.0.0.0 

内存管理(非必须)

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
redis-cli

测试基本命令

1
2
3
set testkey "Hello, Redis!"
get testkey