本地安装了Docker和VMware后,无法同时启动。
因为Docker和VMware都相当于Hypervisor,并且基于虚拟机属性需要获取对CPU等硬件的掌控权,因为在同一台机器上无法同时运行。
使用”添加或删除Windows组件“图形界面程序,在里面取消勾选Hyper-V。
取消之后要重启电脑,否则不生效。
注意
其他环境的高可用集群前提是Zookeeper的集群
本文所有的大数据软件都放在了下面的文件夹中
/data/tools/bigdata
服务器准备至少3台
192.168.160.101(hadoop01)
192.168.160.102(hadoop02)
192.168.160.103(hadoop03)
Taier
文档:https://dtstack.github.io/Taier/docs/guides/introduction/
视频:https://www.bilibili.com/video/BV13L4y1L71w/
源码:https://github.com/DTStack/Taier
官方下载JDK 网址
或者 链接:https://pan.baidu.com/s/1JdPCMMEq178hXV5V4Ild3Q 密码:03l1
比如下载的文件为jdk-8u221-linux-x64.rpm
更改文件权限
chmod 755 jdk-8u221-linux-x64.rpm
安装
rpm -ivh jdk-8u221-linux-x64.rpm
安装后的路径为/usr/java/jdk1.8.0_221-amd64
删除文件
rm -rf jdk-8u221-linux-x64.rpm
查询Java版本
java -version
查看JAVA_HOME
echo $JAVA_HOME
添加环境变量
cd /etc/profile.d/
创建配置文件
vi /etc/profile.d/jdk.sh
加入:
export JAVA_HOME=/usr/java/jdk1.8.0_221-amd64
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
配置立即生效
source /etc/profile
查询java版本
java -version
查看java-home
echo $JAVA_HOME
集群最少为3个。
kafka依赖zookeeper,安装包内已内置 使用内置的可以跳过该步骤
也可自己单独下载
https://zookeeper.apache.org/releases.html#download
我这里下载的是apache-zookeeper-3.7.1-bin.tar.gz
解压
tar -zxvf apache-zookeeper-3.7.1-bin.tar.gz -C /data/tools/bigdata/
cd /data/tools/bigdata/apache-zookeeper-3.7.1-bin
添加环境变量
cd /etc/profile.d/
创建配置文件
vi /etc/profile.d/zk.sh
加入:
export ZK_HOME=/data/tools/bigdata/apache-zookeeper-3.7.1-bin
export PATH=$ZK_HOME/bin:$PATH
配置立即生效
source /etc/profile
查看ZK_HOME
echo $ZK_HOME
conf配置目录下的zoo_sample.cfg
修改为zoo.cfg
修改
dataDir=/data/tools/bigdata/zdata/zk_data
dataLogDir=/data/tools/bigdata/zdata/zk_logs
添加
# server.1 这个1是服务器的标识,可以是任意有效数字,标识这是第几个服务器节点,这个标识要写到dataDir目录下面myid文件里
# 指名集群间通讯端口和选举端口
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888
创建目录
mkdir -p /data/tools/bigdata/zdata/zk_data
mkdir -p /data/tools/bigdata/zdata/zk_logs
另两台创建目录
ssh hadoop02 "mkdir -p /data/tools/bigdata/zdata/zk_data"
ssh hadoop02 "mkdir -p /data/tools/bigdata/zdata/zk_logs"
ssh hadoop03 "mkdir -p /data/tools/bigdata/zdata/zk_data"
ssh hadoop03 "mkdir -p /data/tools/bigdata/zdata/zk_logs"
分别在三台主机的 dataDir
目录下新建 myid
文件,并写入对应的节点标识。Zookeeper 集群通过 myid
文件识别集群节点,并通过上文配置的节点通信端口和选举端口来进行节点通信,选举出 Leader 节点。
创建并写入节点标识到 myid
文件:
ssh hadoop01 "echo 1 > /data/tools/bigdata/zdata/zk_data/myid"
ssh hadoop02 "echo 2 > /data/tools/bigdata/zdata/zk_data/myid"
ssh hadoop03 "echo 3 > /data/tools/bigdata/zdata/zk_data/myid"
distribution.sh $HADOOP_HOME
启动ZK
bash $ZK_HOME/bin/zkServer.sh start
查看状态
zkServer.sh status
或者
用自定义脚本
ha-zk.sh start
ha-zk.sh status
全部启动成功后我们可以看到
1个leader,2个follower,就说明集群配置成功了。
进入
bash $ZK_HOME/bin/zkCli.sh
输入命令
#查看zk的根目录kafka相关节点
ls /
#查看kafka节点
ls /brokers
ls /brokers/topics
create /zk "test"
set /zk "zkbak"
get /zk
搭建集群时配置文件zoo.cfg中会出现这样的配置
clientPort=2181
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888
其中
https://archive.apache.org/dist/hadoop/common/hadoop-2.7.7/
解压
tar -zxvf hadoop-2.7.7.tar.gz -C /data/tools/bigdata/
cd /data/tools/bigdata/hadoop-2.7.7
cd /etc/profile.d/
创建配置文件
vi /etc/profile.d/hadoop.sh
内容设置为
#HADOOP_HOME
export HADOOP_HOME=/data/tools/bigdata/hadoop-2.7.7
export PATH=$PATH:$HADOOP_HOME/bin
export PATH=$PATH:$HADOOP_HOME/sbin
配置生效
source /etc/profile
查看是否生效
echo $HADOOP_HOME
mkdir -p /data/tools/bigdata/zdata/hadoop/tmp
mkdir -p /data/tools/bigdata/zdata/hadoop/dfs/journalnode_data
mkdir -p /data/tools/bigdata/zdata/hadoop/dfs/edits
mkdir -p /data/tools/bigdata/zdata/hadoop/dfs/datanode_data
mkdir -p /data/tools/bigdata/zdata/hadoop/dfs/namenode_data
进入配置文件目录
cd $HADOOP_HOME/etc/hadoop
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<!--指定hadoop集群在zookeeper上注册的节点名-->
<name>fs.defaultFS</name>
<value>hdfs://hacluster</value>
</property>
<property>
<!--用来指定hadoop运行时产生文件的存放目录-->
<name>hadoop.tmp.dir</name>
<value>file:///data/tools/bigdata/zdata/hadoop/tmp</value>
</property>
<property>
<!--设置缓存大小,默认4kb-->
<name>io.file.buffer.size</name>
<value>4096</value>
</property>
<property>
<!--指定zookeeper的存放地址 -->
<name>ha.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
</configuration>
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<!--数据块默认大小128M-->
<name>dfs.block.size</name>
<value>134217728</value>
</property>
<property>
<!--副本数量,不配置的话默认为3-->
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<!--namenode节点数据(元数据)的存放位置-->
<name>dfs.name.dir</name>
<value>file:///data/tools/bigdata/zdata/hadoop/dfs/namenode_data</value>
</property>
<property>
<!--datanode节点数据(元数据)的存放位置-->
<name>dfs.data.dir</name>
<value>file:///data/tools/bigdata/zdata/hadoop/dfs/datanode_data</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.datanode.max.transfer.threads</name>
<value>4096</value>
</property>
<property>
<!--指定hadoop集群在zookeeper上注册的节点名-->
<name>dfs.nameservices</name>
<value>hacluster</value>
</property>
<property>
<!-- hacluster集群下有两个namenode,分别为nn1,nn2 -->
<name>dfs.ha.namenodes.hacluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的rpc、servicepc和http通信 -->
<property>
<name>dfs.namenode.rpc-address.hacluster.nn1</name>
<value>hadoop01:9000</value>
</property>
<property>
<name>dfs.namenode.servicepc-address.hacluster.nn1</name>
<value>hadoop01:53310</value>
</property>
<property>
<name>dfs.namenode.http-address.hacluster.nn1</name>
<value>hadoop01:50070</value>
</property>
<!-- nn2的rpc、servicepc和http通信 -->
<property>
<name>dfs.namenode.rpc-address.hacluster.nn2</name>
<value>hadoop02:9000</value>
</property>
<property>
<name>dfs.namenode.servicepc-address.hacluster.nn2</name>
<value>hadoop02:53310</value>
</property>
<property>
<name>dfs.namenode.http-address.hacluster.nn2</name>
<value>hadoop02:50070</value>
</property>
<property>
<!-- 指定namenode的元数据在JournalNode上存放的位置 -->
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/hacluster</value>
</property>
<property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<name>dfs.journalnode.edits.dir</name>
<value>/data/tools/bigdata/zdata/hadoop/dfs/journalnode_data</value>
</property>
<property>
<!-- namenode操作日志的存放位置 -->
<name>dfs.namenode.edits.dir</name>
<value>/data/tools/bigdata/zdata/hadoop/dfs/edits</value>
</property>
<property>
<!-- 开启namenode故障转移自动切换 -->
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<!-- 配置失败自动切换实现方式 -->
<name>dfs.client.failover.proxy.provider.hacluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<!-- 配置隔离机制 -->
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<!-- 使用隔离机制需要SSH免密登录 -->
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<!--hdfs文件操作权限,false为不验证-->
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
mapred-site.xml.template 重命名为 mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<!--指定mapreduce运行在yarn上-->
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<!--配置任务历史服务器地址-->
<name>mapreduce.jobhistory.address</name>
<value>hadoop01:10020</value>
</property>
<property>
<!--配置任务历史服务器web-UI地址-->
<name>mapreduce.jobhistory.webapp.address</name>
<value>hadoop01:19888</value>
</property>
<property>
<!--开启uber模式-->
<name>mapreduce.job.ubertask.enable</name>
<value>true</value>
</property>
</configuration>
<?xml version="1.0"?>
<configuration>
<property>
<!-- 开启Yarn高可用 -->
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<!-- 指定Yarn集群在zookeeper上注册的节点名 -->
<name>yarn.resourcemanager.cluster-id</name>
<value>hayarn</value>
</property>
<property>
<!-- 指定两个ResourceManager的名称 -->
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<!-- 指定rm1的主机 -->
<name>yarn.resourcemanager.hostname.rm1</name>
<value>hadoop02</value>
</property>
<property>
<!-- 指定rm2的主机 -->
<name>yarn.resourcemanager.hostname.rm2</name>
<value>hadoop03</value>
</property>
<property>
<!-- 配置zookeeper的地址 -->
<name>yarn.resourcemanager.zk-address</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<property>
<!-- 开启Yarn恢复机制 -->
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<!-- 配置执行ResourceManager恢复机制实现类 -->
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
<property>
<!--指定主resourcemanager的地址-->
<name>yarn.resourcemanager.hostname</name>
<value>hadoop03</value>
</property>
<property>
<!--NodeManager获取数据的方式-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<!--开启日志聚集功能-->
<name>yarn.log-aggregation-enable</name>
<value>true</value>
</property>
<property>
<!--配置日志保留7天-->
<name>yarn.log-aggregation.retain-seconds</name>
<value>604800</value>
</property>
</configuration>
hadoop01
hadoop02
hadoop03
剔除警告(可选):
添加
log4j.logger.org.apache.hadoop.util.NativeCodeLoader=ERROR
distribution.sh $HADOOP_HOME
只用执行一次
(1). 启动3个Zookeeper
ssh hadoop01 "zkServer.sh start"
ssh hadoop02 "zkServer.sh start"
ssh hadoop03 "zkServer.sh start"
(2). 启动3个JournalNode
JournalNode的作用:NameNode之间共享数据
ssh hadoop01 "hadoop-daemon.sh start journalnode"
ssh hadoop02 "hadoop-daemon.sh start journalnode"
ssh hadoop03 "hadoop-daemon.sh start journalnode"
(3). 格式化NameNode
仅hadoop01
sudo chmod -R 755 $HADOOP_HOME
rm -rf $HADOOP_HOME/tmp
hdfs namenode -format
这个操作主要是创建fsimage和edits文件。
只要看到信息中有一句关键:
INFO common.Storage: Storage directory /data/tools/bigdata/zdata/dfs/name has been successfully formatted.
则格式化成功.
(4). 复制hadoop01上的NameNode的元数据到hadoop02
scp -r /data/tools/bigdata/zdata/hadoop/dfs/namenode_data/current root@hadoop02:/data/tools/bigdata/zdata/hadoop/dfs/namenode_data/
(5). 在NameNode节点(hadoop01或hadoop02)格式化zkfc
# 【二者选其一即可】
ssh hadoop01 "hdfs zkfc -formatZK"
# 或
ssh hadoop02 "hdfs zkfc -formatZK"
(6). 停止3个JournalNode
JournalNode的作用:NameNode之间共享数据
ssh hadoop01 "hadoop-daemon.sh stop journalnode"
ssh hadoop02 "hadoop-daemon.sh stop journalnode"
ssh hadoop03 "hadoop-daemon.sh stop journalnode"
(1). 在hadoop01上启动HDFS相关服务
ssh hadoop01 "start-dfs.sh"
对应日志
Starting namenodes on [hadoop01 hadoop02]
hadoop01: starting namenode, logging to /data/tools/bigdata/hadoop-2.7.7/logs/hadoop-root-namenode-hadoop01.out
hadoop02: starting namenode, logging to /data/tools/bigdata/hadoop-2.7.7/logs/hadoop-root-namenode-hadoop02.out
localhost: starting datanode, logging to /data/tools/bigdata/hadoop-2.7.7/logs/hadoop-root-datanode-hadoop01.out
Starting journal nodes [hadoop01 hadoop02 hadoop03]
hadoop03: starting journalnode, logging to /data/tools/bigdata/hadoop-2.7.7/logs/hadoop-root-journalnode-hadoop03.out
hadoop02: starting journalnode, logging to /data/tools/bigdata/hadoop-2.7.7/logs/hadoop-root-journalnode-hadoop02.out
hadoop01: starting journalnode, logging to /data/tools/bigdata/hadoop-2.7.7/logs/hadoop-root-journalnode-hadoop01.out
Starting ZK Failover Controllers on NN hosts [hadoop01 hadoop02]
hadoop02: starting zkfc, logging to /data/tools/bigdata/hadoop-2.7.7/logs/hadoop-root-zkfc-hadoop02.out
hadoop01: starting zkfc, logging to /data/tools/bigdata/hadoop-2.7.7/logs/hadoop-root-zkfc-hadoop01.out
(2). 在hadoop03上启动YARN相关服务
ssh hadoop03 "start-yarn.sh"
(3). 最后单独启动hadoop01的历史任务服务器和hadoop02的ResourceManager
ssh hadoop01 "mr-jobhistory-daemon.sh start historyserver"
ssh hadoop02 "yarn-daemon.sh start resourcemanager"
或者
用自定义脚本
ha-hadoop.sh start
ha-hadoop.sh status
ha-hadoop.sh stop
[root@hadoop01 ~]$ jps
8227 QuorumPeerMain
8916 DataNode
8663 JournalNode
8791 NameNode
9035 DFSZKFailoverController
11048 JobHistoryServer
9147 NodeManager
9260 Jps
[root@hadoop02 ~]$ jps
7538 QuorumPeerMain
8214 NodeManager
7802 JournalNode
8010 DataNode
8122 DFSZKFailoverController
8346 ResourceManager
8395 Jps
7916 NameNode
[root@hadoop03 ~]$ jps
8897 Jps
8343 DataNode
8472 ResourceManager
8249 JournalNode
7994 QuorumPeerMain
8575 NodeManager
【查看NameNode的状态】
[root@hadoop01 ~]$ hdfs haadmin -getServiceState nn1
active
[root@hadoop01 ~]$ hdfs haadmin -getServiceState nn2
standby
【查看ResourceManager的状态】
[root@hadoop03 ~]$ yarn rmadmin -getServiceState rm1
standby
[root@hadoop03 ~]$ yarn rmadmin -getServiceState rm2
active
我的服务器的IP为 192.168.160.101
HDFS监控页面查询:
查看文件可以访问这个地址
http://192.168.160.101:50070/explorer.html#/
Yarn监控页面查询:
http://192.168.160.102:8088/cluster
停止
bash $HADOOP_HOME/sbin/stop-all.sh
ssh: connect to host localhost port 22: Connection refused
解决方法: 确定安装ssh:
包含了SSH服务 sudo apt-get install openssh-server
和客户端 sudo apt-get install openssh-client
sudo apt-get install ssh
启动sshd:
sudo service ssh start
检验方法:
ssh hadoop01
又报错
Permission denied (publickey).
允许ssh密码登录权限
登录目标机器,打开
vi /etc/ssh/sshd_config
修改PasswordAuthentication no
为:PasswordAuthentication yes
。
允许root登录
PermitRootLogin yes
然后重启服务。
service ssh restart
默认情况下,每个 Flink 集群只有一个 JobManager,这将导致单点故障(SPOF),如果这个 JobManager 挂了,则不能提交新的任务,并且运行中的程序也会失败。使用JobManager HA,集群可以从 JobManager 故障中恢复,从而避免单点故障。
用户可以在Standalone 或 Flink on Yarn 集群模式下配置 Flink 集群 HA(高可用性)。 Flink 的HA需要Zookeeper和HDFS,因此首先要安装启动 zk、hdfs。
下载地址
https://archive.apache.org/dist/flink/
这里下载1.12.7版本
https://archive.apache.org/dist/flink/flink-1.12.7/
https://archive.apache.org/dist/flink/flink-1.12.7/flink-1.12.7-bin-scala_2.12.tgz
解压
tar zxvf flink-1.12.7-bin-scala_2.12.gz -C /data/tools/bigdata/
cd /etc/profile.d/
创建配置文件
vi /etc/profile.d/flink.sh
内容设置为
#FLINK_HOME
export FLINK_HOME=/data/tools/bigdata/flink-1.12.7
export PATH=$PATH:$FLINK_HOME/bin
配置生效
source /etc/profile
查看是否生效
echo $FLINK_HOME
修改flink/conf/
flink-conf.yaml
# 配置使用zookeeper来开启高可用模式
high-availability: zookeeper
# 配置zookeeper的地址,采用zookeeper集群时,可以使用逗号来分隔多个节点地址
high-availability.zookeeper.quorum: hadoop01:2181,hadoop02:2181,hadoop03:2181
# 在zookeeper上存储flink集群元信息的路径
high-availability.zookeeper.path.root: /ha-flink
# 持久化存储JobManager元数据的地址,zookeeper上存储的只是指向该元数据的指针信息
high-availability.storageDir: hdfs://hacluster:8020/flink/recovery
# 下面的可以不用配置
# 将已完成的作业上传到此目录中,让任务历史服务器进行监控
jobmanager.archive.fs.dir: hdfs://hacluster:8020/flink-jobhistory
historyserver.web.address: hadoop01
historyserver.web.port: 8082
# 任务历史服务器监控目录中已存档的作业
historyserver.archive.fs.dir: hdfs://hacluster:8020/flink-jobhistory
historyserver.web.refresh-interval: 10000
masters
hadoop01:8081
hadoop02:8081
workers
hadoop01
hadoop02
hadoop03
zoo.cfg,将内容修改为:
server.1=hadoop01:2888:3888
server.2=hadoop02:2888:3888
server.3=hadoop03:2888:3888
作业归档需要记录在hdfs上,但是当前版本的flink把hadoop的一些依赖删除了,需要手动将jar包放到lib目录下 ,这里我用的是
https://repo.maven.apache.org/maven2/org/apache/flink/flink-shaded-hadoop-2-uber/
下载地址
distribution.sh $FLINK_HOME
hadoop fs -mkdir /flink
hadoop fs -mkdir /flink-jobhistory
如果创建错误 删除
hadoop fs -rm -r /flink
hadoop fs -rm -r /flink-jobhistory
启动
bash $FLINK_HOME/bin/start-cluster.sh
bash $FLINK_HOME/bin/historyserver.sh start
停止
bash $FLINK_HOME/bin/stop-cluster.sh
bash $FLINK_HOME/bin/historyserver.sh stop
或者
用自定义脚本
ha-flink.sh start
ha-flink.sh status
ha-flink.sh stop
Flink有个UI界面,可以用于监控Flilnk的job运行状态 http://192.168.160.101:8081/
任务历史
jdbc:mysql://hadoop01:3306/ztest?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&rewriteBatchedStatements=true&allowMultiQueries=true
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'psvmc123' WITH GRANT OPTION;
FLUSH PRIVILEGES;
quit
ALTER USER 'root'@'%' PASSWORD EXPIRE NEVER;
flush privileges;