大数据集群搭建2

大数据集群搭建

本文档将搭建以下集群

  • hadoop 集群
  • zookeeper 集群
  • hbase 集群
  • spark 集群
  • kafka 集群

一、准备

1.1 软件版本

  • ubuntu 18.04
  • jdk1.8.0_151
  • hadoop-3.1.3
  • apache-zookeeper-3.6.1-bin
  • hbase-2.2.5
  • spark-3.0.0-bin-without-hadoop
  • kafka_2.12-2.5.0
  • kafka-eagle-bin-1.4.8

1.2 网络规划

规划搭建3台机器组成集群模式,IP与计算机名如下:

192.168.100.100 master
192.168.100.110 slaver1
192.168.100.120 slaver2

1.3 软件包拷贝

可将上述软件包拷贝到master机器的/opt目录下

1.4 绑定IP和修改计算机名

1.4.1 设置静态IP

以下方法使用于20.04版本

1.4.1.1 通过 ifconfig 查看对应网卡名称
1.4.1.2 修改 /etc/netplan/01-netcfg.yaml 文件
# This is the network config written by 'subiquity'
network:
  ethernets:
    eno3:
      addresses: [192.168.100.200/24]
      dhcp4: no 
      optional: true
      gateway4: 192.168.100.1
      nameservers:
         addresses: [8.8.8.8,114.114.114.114]
  version: 2
  renderer: networkd

说明:

eno3: 配置的网卡的名称

addresses: 配置的静态ip地址和掩码

dhcp4: no表示关闭DHCP,如果需要打开DHCP则写yes

gateway4: 网关地址

nameservers: addresses: DNS服务器地址,多个DNS服务器地址需要用英文逗号分隔开

renderer: networkd 指定后端采用systemd-networkd或者Network Manager,可不填写则默认使用systemd-workd

注意:

  1. ip地址和DNS服务器地址需要用[]括起来,但是网关地址不需要
  2. 注意每个冒号后边都要先加一个空格
  3. 注意每一层前边的缩进,至少比上一层多两个空格
1.4.1.3 使配置的ip地址生效 sudo netplan apply

1.4.2 修改/etc/hosts,添加IP绑定

root@master:~# cat /etc/hosts
192.168.100.100 master
192.168.100.110 slaver1
192.168.100.120 slaver2

1.4.3 修改/etc/hostname,为绑定计算机名。(计算机名和上面hosts绑定名必须一致)

root@master:~# cat /etc/hostname 
master
root@slaver1:~# cat /etc/hostname 
slaver1
root@slaver2:~# cat /etc/hostname 
slaver2

修改完hostname之后好像需要重启才能生效

1.4.4 设置时区为东八区

sudo timedatectl set-timezone Asia/Shanghai

1.4.5 更改镜像源,方便更快的更新软件

1.4.5.1 备份旧的源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
1.4.5.2 修改 /etc/apt/sources.list, 用清华源替换
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse

1.4.5.3 更新
sudo apt-get update
sudo apt-get upgrade

1.5 SSH 设置

1.5.1 设置ssh可以通过root用户登陆

设置root用户密码

sudo passwd

设置允许ssh以root用户登陆

# 先安装ssh-server
sudo apt install openssh-server
# 修改sshd_config配置
sudo sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

重启ssh服务,使配置生效

sudo service ssh restart

1.5.2 SSH无密码登陆 (在master主机进行如下操作)

切换到root用户(注:之后所有操作均以root用户执行)

sudo su

用rsa生成密钥,一路回车。

ssh-keygen -t rsa

把公钥复制一份,并改名为authorized_keys

cd /root/.ssh
cp id_rsa.pub authorized_keys

将authorized_keys文件拷贝到slaver1,slaver2上

scp ./authorized_keys root@slaver1:/root/.ssh
scp ./authorized_keys root@slaver2:/root/.ssh

1.6 JDK安装(三台机器可同步进行)

解压

cd /opt
tar xavf ./jdk-8u151-linux-x64.tar.gz

建立软连接

cd /usr/local
ln -s /opt/jdk1.8.0_151 jdk

将JDK环境变量配置到/etc/profile中(注:如果不好使也可以配置到 /root/.bashrc中)

export JAVA_HOME=/usr/local/jdk
export PATH=$PATH:$JAVA_HOME/bin

检查JDK是否配置好

source /etc/profile
javac -version

提示 javac 1.8.0_151代表JDK安装完成

二、Hadoop集群搭建

2.1 Hadoop安装

解压 ,并在/home目录下创建tmp、dfs、dfs/name、dfs/node、dfs/data。然后在/usr/local目录下创建对应的软链接。

注意:需要将这些目录放到空间大的盘下(e.g. /home),避免应为硬盘空间不足引发错误

可通过 df -h 命令查看各分区大小

# 解压
cd /opt
tar xavf ./hadoop-3.1.3.tar.gz

# 创建对于目录
cd /home
mkdir hadoop
mkdir hadoop/tmp
mkdir hadoop/dfs
mkdir hadoop/dfs/name
mkdir hadoop/dfs/node
mkdir hadoop/dfs/data

# 创建软链接
cd /usr/local/
ln -s /opt/hadoop-3.1.3 hadoop

2.2 Hadoop配置

以下操作都在/usr/local/hadoop/etc/hadoop下进行

2.2.1 hadoop-env.sh

# 修改JAVA_HOME配置项为JDK安装目录
export JAVA_HOME=/usr/local/jdk

# 修改日志级别,避免长期跑日志文件太多问题
# 注意:测试发现只有这一个有用,别的都不好使
export HADOOP_DAEMON_ROOT_LOGGER=WARN,console

2.2.2 core-site.xml

fs.default.name : 这个属性用来指定namenode的hdfs协议的文件系统通信地址,可以指定一个主机+端口

hadoop.tmp.dir : hadoop集群在工作的时候存储的一些临时文件的目录

<configuration> 
  <property> 
    <name>hadoop.tmp.dir</name>  
    <value>/home/hadoop/tmp</value>  
    <description>Abase for other temporaty directories.</description> 
  </property>  
  <property> 
    <name>fs.default.name</name>  
    <value>hdfs://master:9000</value> 
  </property>  
  <property> 
    <name>io.file.buffer.size</name>  
    <value>131702</value> 
  </property> 
</configuration>

2.2.3 hdfs-site.xml

dfs.name.dir:namenode数据的存放地点。也就是namenode元数据存放的地方,记录了hdfs系统中文件的元数据。

dfs.data.dir: datanode数据的存放地点。也就是block块存放的目录了。

dfs.replication:hdfs的副本数设置。也就是上传一个文件,其分割为block块后,每个block的冗余副本个数,默认配置是3。

dfs.namenode.secondary.http-address:secondarynamenode 运行节点的信息,和 namenode 不同节点

<configuration>
  <property>
    <name>dfs.name.dir</name>
    <value>/home/hadoop/dfs/name</value>
    <description>Path on the local filesystem where the NameNode stores the namespace and transactions log persistently.</description>
  </property>
  <property>
    <name>dfs.data.dir</name>
    <value>/home/hadoop/dfs/data</value>
    <description>Comma separated list of on the local filesystem where the NameNode stores the namespace and transactions log persistently.</description>
  </property>
  <property>
    <name>dfs.replication</name>
    <value>2</value>
    <description>replication num.</description>
  </property>
  <property>
    <name>dfs.permissions</name>
    <value>false</value>
    <description>need not permissions.</description>
  </property>
  <property>
    <name>dfs.namenode.sencondary.http-address</name>
    <value>master:9001</value>
    <description>第二namenode地址.</description>
  </property>
  <property>
    <name>dfs.namenode.datanode.registration.ip-hostname-check</name>
    <value>false</value>
    <description>check.</description>
  </property>
  <property>
    <name>dfs.namenode.http-address</name>
    <value>master:50070</value>
  </property> 
</configuration>

2.2.4 mapred-site.xml

cp mapred-site.xml.template mapred-site.xml

mapreduce.framework.name:指定mr框架为yarn方式

<configuration> 
  <property> 
    <name>mapreduce.framework.name</name>  
    <value>yarn</value> 
  </property>  
  <property>   
    <name>mapreduce.map.memory.mb</name>    
    <value>1536</value> 
  </property>  
  <property>   
    <name>mapreduce.map.java.opts</name>    
    <value>-Xmx1024M</value> 
  </property>  
  <property>   
    <name>mapreduce.reduce.memory.mb</name>    
    <value>3072</value> 
  </property>  
  <property>   
    <name>mapreduce.reduce.java.opts</name>    
    <value>-Xmx2560M</value> 
  </property> 

  <!-- 用于开始历史服务器-->
  <property>
   <name>mapreduce.jobhistory.address</name>
   <value>master:10020</value>
 </property>
 <property>
  <name>mapreduce.jobhistory.webapp.address</name>
  <value>master:19888</value>
 </property>

</configuration>

2.2.5 yarn-site.xml

yarn.resourcemanager.scheduler.class:设置调度算法,默认FIFO

yarn.log-aggregation-enable:如果开启了日志聚合,那么容器日志将被复制到HDFS,并删除本地日志。而后这些日志可以在集群任何节点上用yarn logs命令查看 yarn logs -applicationId <app ID>

yarn.nodemanager.remote-app-log-dir:指定日志存在hdfs上的位置

yarn.nodemanager.resource.memory-mb:根据每台机器实际内存大小设置NM最大管理的内存

yarn.nodemanager.resource.cpu-vcores:根据每台机器实际CPU核数设置NM最大管理的CPU核数

yarn.resourcemanager.xxx.address 以下这些地址需要明确配出来,要不然可能导致集群上yarn app 起不来

<configuration> 
  <!--设置使用公平调度算法 --> 
  <property> 
    <name>yarn.resourcemanager.scheduler.class</name>  
   <value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value> 
  </property>  
  <!-- 使支持资源抢占,要不要还是会出现资源不够时,app出现等待大的情况 -->
  <property>
    <name>yarn.scheduler.fair.preemption</name>
    <value>true</value>
  </property>

  <!-- Shuffle service 需要加以设置的MapReduce的应用程序服务 -->  
  <!-- 增加spark_shuffle, 使能动态资源分配 -->  
  <property> 
    <name>yarn.nodemanager.aux-services</name>  
    <value>mapreduce_shuffle,spark_shuffle</value> 
  </property>  
  <property> 
    <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>  
    <value>org.apache.hadoop.mapred.ShuffleHandler</value> 
  </property>

  <!-- 客户端对ResourceManager主机通过 host:port 提交作业-->
  <property> 
    <name>yarn.resourcemanager.address</name>  
    <value>master:8032</value> 
  </property>
  <!-- 客户端对ResourceManager主机通过 host:port 提交作业-->
  <property> 
    <name>yarn.resourcemanager.scheduler.address</name>  
    <value>master:8030</value> 
  </property>
  <!-- NodeManagers通过ResourceManager主机访问host:port-->
  <property> 
    <name>yarn.resourcemanager.resource-tracker.address</name>  
    <value>master:8035</value> 
  </property>
  <!-- 管理命令通过ResourceManager主机访问host:port-->  
  <property> 
    <name>yarn.resourcemanager.admin.address</name>  
    <value>master:8033</value> 
  </property>
  <!-- ResourceManager web页面host:port.-->
  <property> 
    <name>yarn.resourcemanager.webapp.address</name>  
    <value>master:8088</value> 
  </property>  

  <!--开启了日志聚合-->  
  <property>
    <name>yarn.log-aggregation-enable</name>  
    <value>true</value> 
  </property>  
  <!--设置聚合日志放置的位置-->  
  <property> 
    <name>yarn.nodemanager.remote-app-log-dir</name>  
    <value>/tmp/logs</value> 
  </property>  
  <!--设置聚合日志存放的时间,单位为秒,会自动移除-->  
  <property> 
    <name>yarn.log-aggregation.retain-seconds</name>  
    <value>86400</value> 
  </property>
  <!-- 配置日志服务器的地址,work节点使用 -->
  <property>
   <name>yarn.log.server.url</name>
   <value>http://master:19888/jobhistory/logs</value>
  </property>

  <!-- 设置每个nodemanager占有内存为实际内存的一半,留一半给hbase用-->
  <property>
    <name>yarn.nodemanager.resource.memory-mb</name>
    <value>8192</value>
  </property>
  <property>
    <name>yarn.scheduler.maximum-allocation-mb</name>
    <value>8192</value>
  </property>

  <!-- 设置每个nodemanager的vCores为(逻辑CPU核数-1)的2-3倍 -->
  <property>
     <name>yarn.nodemanager.resource.cpu-vcores</name>
     <value>21</value>
  </property>
  <property>
     <name>yarn.scheduler.maximum-allocation-vcores</name>
     <value>21</value>
  </property>

  <!-- 关闭内存上限检查,避免程序启动时请求太多内存报错 -->
  <property>
    <name>yarn.nodemanager.pmem-check-enabled</name>
    <value>false</value>
  </property>
  <property>
    <name>yarn.nodemanager.vmem-check-enabled</name>
    <value>false</value>
  </property>

  <!-- spark动态资源分配相关参数-->
  <property>
    <name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
    <value>org.apache.spark.network.yarn.YarnShuffleService</value>
  </property>

  <!-- AM检查到APP Failed之后,自动重启次数-->
  <property>
    <name>yarn.resourcemanager.am.max-attempts</name>
    <value>10000</value>
  </property>
    
</configuration>

对yarn.resourcemanager.am.max-attempts的说明:

这是一个全局的appmaster重试次数的限制,yarn提交应用时,还可以为单独一个应用设置最大重试次数(--conf spark.yarn.maxAppAttempts=4), 如果两个都设置了,则去最小的那个。如果应用程序运行数天或数周,而不重新启动或重新部署在高度使用的群集上,则可能在几个小时内耗尽4次尝试。为了避免这种情况,尝试计数器应该在每个小时都重置(--conf spark.yarn.am.attemptFailuresValidityInterval=1h)。如果想让AM检测到程序失败后,一直能重启,可以把尝试次数设置的大一点。

2.2.6 fair-scheduler.xml

公平调度算法用到的配置文件

<?xml version="1.0"?>
<allocations>
  <queue name="medium">
    <minResources>4096 mb,8vcores</minResources>
    <weight>2.0</weight>
    <schedulingPolicy>fair</schedulingPolicy>
    <minSharePreemptionTimeout>60</minSharePreemptionTimeout>
  </queue>

  <queue name="high">
    <minResources>4096 mb,8vcores</minResources>
    <weight>3.0</weight>
    <schedulingPolicy>fair</schedulingPolicy>
    <minSharePreemptionTimeout>30</minSharePreemptionTimeout>
  </queue>

   <queuePlacementPolicy>
    <rule name="specified" create="false"/>
    <rule name="user" create="false"/>
    <rule name="default" create="true"/>
  </queuePlacementPolicy>
</allocations>

2.2.7 workers

集群中机器的主机名列表,会在下边每台机器上启动一个NodeManager

master
slaver1
slaver2

2.2.7 将配置好的hadoop分发到slaver1,slaver2上

cd /opt
scp -r hadoop-3.1.3 root@slaver1:/opt
scp -r hadoop-3.1.3 root@slaver2:/opt

注意:分发完成后,需要在各slaver节点上创建对于的目录和软链接

2.3 Hadoop启动

2.3.1 格式化一个新的文件系统

注意:第一次搭建的时候格式化一次就好!!不要重复format

cd /usr/local/hadoop/bin
./hadoop namenode -format

2.3.2 启动HDFS

cd /usr/local/hadoop/sbin
./start-dfs.sh
# stop-dfs.sh

通过jps检查是否启动成功,看看master上是否有NameNode和DataNode, slaver节点上是否有DataNode

root@master:/opt# jps
6306 SecondaryNameNode
6050 NameNode
4987 DataNode
6596 Jps

root@slaver1:~# jps
5307 Jps
4987 DataNode

root@slaver2:~# jps
3156 Jps
3003 DataNode

集群启动不成功,可能的原因是datanode的clusterID 和 namenode的clusterID 不匹配。解决的办法将之前创建的tmp、dfs目录下内容全清掉,然后再重新启动一遍。

2.3.3启动YARN

./start-yarn.sh
# stop-yarn.sh

通过jps检查是否启动成功,看看master上是否有ResourceManager,slaver上是否有NodeManager

root@master:~# jps
6353 NameNode
7747 Jps
7124 ResourceManager
7333 NodeManager
6855 SecondaryNameNode
6584 DataNode

root@slaver1:~# jps
5605 Jps
5416 NodeManager
4987 DataNode

root@slaver2:~# jps
3296 NodeManager
3480 Jps
3003 DataNode

Web UI:

http://master:8088 #查看Hadoop任务状态

http://master:50070 #查看hdfs相关信息

三、ZooKeeper集群搭建

3.1 ZooKeeper安装

解压,并创建data、datalog目录,在/usr/local下创建软链接

# 解压
cd /opt
tar xavf ./apache-zookeeper-3.6.1-bin.tar.gz

# 创建目录
cd apache-zookeeper-3.6.1-bin
mkdir data
mkdir datalog

# 创建软链接
cd /usr/local
ln -s /opt/apache-zookeeper-3.6.1-bin zookeeper

在data目录下创建myid文件,在文件第一行写上对应的 Server id。这个id必须在集群环境中服务器标识中是唯一的,且大小在1~255之间。

cd /usr/local/zookeeper/data
echo "1" > myid

3.2 ZooKeeper配置

3.2.1 zoo.cfg

cp zoo_sample.cfg zoo.cfg

修改如下:

dataDir:存放内存数据结构的snapshot,便于快速恢复,默认情况下,事务日志也会存储在这里。建议同时配置参数dataLogDir, 事务日志的写性能直接影响zk性能。

server.id=IP/Host : port1 : port2
id:用来配置ZK集群中的各节点,并建议id的值和myid保持一致。
IP/Host: 服务器的 IP 或者是与 IP 地址做了映射的主机名
port1:Leader和Follower或Observer交换数据使用
port2:用于Leader选举。

# 注意:需要每个节点都配策划嗯自己的地址
clientPortAddress=master

dataDir=/usr/local/zookeeper/data
dataLogDir=/usr/local/zookeeper/datalog

server.1=master:2888:3888
server.2=slaver1:2888:3888
server.3=slaver2:2888:3888

# 默认是开启的,为避免同步延迟问题,ZK接收到数据后会立刻去讲当前状态信息同步到磁盘日志文件中,同步完成后才会应答。将此项关闭后,客户端连接可以得到快速响应
# 关闭forceSync选项后,会存在潜在风险,虽然依旧会刷磁盘(log.flush()首先被执行),但因为操作系统为提高写磁盘效率,会先写缓存,当机器异常后,可能导致一些zk状态信息没有同步到磁盘,从而带来ZK前后信息不一样问题
#forceSync=no

# 客户端上报的期望timeout一定要在服务端设置的上下界之间,如果越过边界,则以边界为准。
# 即一味加大客户端掩饰是没有用的,需要把zookeeper的最大超时时间加大才行
# 通常用于解决跟hbase和kafka由于网络动荡超时导致断开连接的问题
maxSessionTimeout=180000

特别注意:千万不要在配置文件中数字后边多加空格,要不然启动的时候报莫名其妙的配置错误

3.2.2 zkServer.sh (可选)

修改bin/zkServer.sh, 使能JMX, 方便通过命令行查状态,非必要配置

# envi命令执行报错提示:envi is not executed because it is not in the whitelist.
# 解决办法 修改启动指令 zkServer.sh ,往里面添加 :ZOOMAIN="-Dzookeeper.4lw.commands.whitelist=* ${ZOOMAIN}"

else
# 注意先找到这个位置
    echo "JMX disabled by user request" >&2
    ZOOMAIN="org.apache.zookeeper.server.quorum.QuorumPeerMain" 
fi

# 添加如下信息,使能JMX
ZOOMAIN="-Dzookeeper.4lw.commands.whitelist=* ${ZOOMAIN}"

3.2.3 将配置好的zookeeper分发到slaver1,slaver2

cd /opt
scp -r apache-zookeeper-3.6.1-bin root@slaver1:/opt
scp -r apache-zookeeper-3.6.1-bin root@slaver2:/opt

分发完成之后,需要ssh到各slaver节点上,修改对应myid中的值。设置slaver1中myid为2,设置slaver2中myid为3, 修改对应的zoo.cfg。在个slaver节点上的/usr/local目录下创建软链接

3.3 ZooKeeper启动

分别在master,slaver1,slaver2执行如下命令

cd /usr/local/zookeeper/bin
./zkServer.sh start
# ./zkServer.sh stop

各节点启动后,通过jps检查启动状态,会出现QuorumPeerMain进程

root@master:# jps
6672 ResourceManager
6306 SecondaryNameNode
6050 NameNode
7434 QuorumPeerMain
7470 Jps

通过 zkServer.sh status查看各节点的运行模式

root@master:/usr/local/zookeeper/bin# ./zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/apache-zookeeper-3.5.6-bin/bin/../conf/zoo.cfg
Client port found: 2181. Client address: master.
Mode: follower

root@slaver1:~# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: slaver1.
Mode: leader

root@slaver2:~# zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: slaver2.
Mode: follower

3.4 ZooKeeper集群启动脚本

为避免跑到每台机器上去启动,可在master节点/usr/local/zookeeper/bin目录下添加脚本:

  1. 一键启动脚本:zk-cluster-start.sh
brokers="master slaver1 slaver2"
ZK_HOME="/usr/local/zookeeper"
ZK_NAME="zookeeper"

echo "INFO: Begin to start Zookeeper cluster ..."

# By default disable strict host key checking
if [ "$ZK_SSH_OPTS" = "" ]; then
  ZK_SSH_OPTS="-o StrictHostKeyChecking=no"
fi

for broker in $brokers
do
  echo "INFO:Start ${ZK_NAME} on ${broker} ..."
  ssh $ZK_SSH_OPTS ${broker} "${ZK_HOME}/bin/zkServer.sh start"
  if [[ $? -eq 0 ]]; then
    echo "INFO: start ${ZK_NAME} on ${broker}  is on !"
  fi
done
echo "INFO:Zookeeper cluster started !"
  1. 一键关闭脚本 zk-cluster-stop.sh
brokers="master slaver1 slaver2"
ZK_HOME="/usr/local/zookeeper"
ZK_NAME="zookeeper"

echo "INFO: Begin to stop Zookeeper cluster ..."

# By default disable strict host key checking
if [ "$ZK_SSH_OPTS" = "" ]; then
  ZK_SSH_OPTS="-o StrictHostKeyChecking=no"
fi

for broker in $brokers
do
  echo "INFO:Shut down ${ZK_NAME} on ${broker} ..."
  ssh $ZK_SSH_OPTS ${broker} "${ZK_HOME}/bin/zkServer.sh stop"
  if [[ $? -eq 0 ]]; then
    echo "INFO :Shut down ${ZK_NAME} on ${broker}  is down !"
  fi
done
echo "INFO:Zookeeper cluster shutdown completed !"

四、HBase集群搭建

4.1 HBase安装

解压,创建软链接

# 解压
cd /opt
tar xavf ./hbase-2.2.5-bin.tar.gz

# 创建软链接
cd /usr/local
ln -s /opt/hbase-2.2.5 hbase

4.2 HBase配置

以下配置文件在/usr/local/hbase/conf目录下

4.2.1 hbase-env.sh

#修改JAVA_HOME配置项为JDK安装目录
export JAVA_HOME=/usr/local/jdk

# 不使用hbase自带的zookeeper
export HBASE_MANAGES_ZK=false

# 共享 Hadoop 内置的压缩器
export HBASE_LIBRARY_PATH=/usr/local/hadoop/lib/native

# HMASTER 堆内存调整
# -Xms1g 最大堆内存1G
# -Xmx1g 初始堆内存设置与最大堆内存一样大。如果Xms设置得比较小,当遇到数据量较大时候,堆内存会迅速增长,当上升到最大又会回落,伸缩堆大小会带来压力
# -Xmn300m 新生代300M。新生代不能过小,否则新生代中的生存周期较长的数据会过早移到老生代,引起老生代产生大量内存碎片;新生代也不能过大,否则回收新生代也会造成太长的时间停顿,影响性能。
# -XX:+UseParNewGC 新生代采用 ParallelGC 回收器。ParallelGC 将停止运行Java 进程去清空新生代堆,因为新生代很小,所以停顿的时间也很短,需几百毫秒。
# -XX:+UseConcMarkSweepGC 老年代采用CMS回收器(Concurrent Mark-Sweep Collector) .  CMS 在不停止运行Java进程的情况下异步地完成垃圾回收,CMS会增加CPU的负载,但是可以避免重写老年代堆碎片时候的停顿。老年代回收不可使用 ParallelGC  回收                                                              机制,因为老生代的堆空间大,ParallelGC会造成Java进程长时间停顿,使得RegionServer与ZooKeeper的会话超时,该RegionServer会被误认为已经奔溃并会被抛弃。
# -XX:CMSInitiatingOccupancyFraction=60 指定在内存到60%时候, CMS 应该被开始垃圾回收
# -XX:+UseCMSInitiatingOccupancyOnly 如果没有 -XX:+UseCMSInitiatingOccupancyOnly 这个参数, 只有第一次会使用CMSInitiatingPermOccupancyFraction=60 这个值. 后面的情况会自动调整
#export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS $HBASE_JMX_BASE -Xmx1g -Xms1g -Xmn300m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=60 -XX:+UseCMSInitiatingOccupancyOnly"
# HREGIONSERVER 堆内存调整
# -Xmx5g 最大堆内存5G
# -Xmn1g 新生代1G
# -XX:+CMSParallelRemarkEnabled 为了减少第二次暂停的时间,开启并行remark: -XX:+CMSParallelRemarkEnabled。如果remark还是过长的话,可以开启-XX:+CMSScavengeBeforeRemark选项,强制remark之前开始一次minor gc,减少remark的暂停时间,但是在remark之后也将立即开始又一次minor gc
# -XX:+UseCMSCompactAtFullCollection CMS是不会整理堆碎片的,因此为了防止堆碎片引起full gc,通过会开启CMS阶段进行合并碎片选项:-XX:+UseCMSCompactAtFullCollection,开启这个选项一定程度上会影响性能
# -Xloggc:$HBASE_HOME/logs/gc-$(hostname)-hbase.log 写入日志
#export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS $HBASE_JMX_BASE -Xmx5g -Xms5g -Xmn1g -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=60 -XX:+UseCMSInitiatingOccupancyOnly -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintTenuringDistribution -Xloggc:$HBASE_HOME/logs/gc-$(hostname)-hbase.log"

# G1NewSizePercent :G1的Young区大小是通过算法来自适应确定的, 也就是根据之前Young区GC的耗时来确定之后的Young大小,如果耗时过长,则调小Young区,耗时过短,则调大Young区. 这个参数表示Young的最小百分比
# MaxTenuringThreshold: 当一个对象gc的代数超过这个值的时候, 会将对象从young区挪到old区.
# G1HeapRegionSize: 表示G1将每个Region切分成多大, 注意一定要写单位, 例如32m.
# G1MixedGCCountTarget: 当占用内存超过InitiatingHeapOccupancyPercent阀值时, 最多通过多少次Mixed GC来将内存控制在阀值之下
# InitiatingHeapOccupancyPercent: 当占用内存超过这个百分比的时候, G1开始执行多次Mixed GC来整理老年代内存碎片.
# UseStringDeduplication 字符串去重,提高性能
# ResizePLAB 减少gc线程间通信的东西,关闭动态提升本地buffer
# PerfDisableSharedMem 关掉统计信息的内存映射。开启在某些特殊场景下,会极大增加gc暂停时间
export HBASE_OPTS="$HBASE_OPTS \
                   -Xmx5g -Xms5g \
                   -XX:+UseG1GC \
                   -XX:MaxDirectMemorySize=5g \
                   -XX:MaxGCPauseMillis=90 \
                   -XX:+UnlockExperimentalVMOptions \
                   -XX:+ParallelRefProcEnabled  \
                   -XX:ConcGCThreads=4 \
                   -XX:ParallelGCThreads=16 \
                   -XX:G1NewSizePercent=2 \
                   -XX:G1MaxNewSizePercent=20 \
                   -XX:MaxTenuringThreshold=1 \
                   -XX:G1HeapRegionSize=32m \
                   -XX:G1MixedGCCountTarget=16 \
                   -XX:InitiatingHeapOccupancyPercent=60 \
                   -XX:G1OldCSetRegionThresholdPercent=5 \
                   -XX:SurvivorRatio=4 \
                   -XX:G1HeapWastePercent=10 \
                   -XX:+UseStringDeduplication \
                   -XX:-ResizePLAB \
                   -verbose:gc \
                   -XX:+PrintGCDetails \
                   -XX:+PrintGCDateStamps \
                   -XX:+PrintGCApplicationStoppedTime \
                   -XX:+PrintTenuringDistribution \
                   -Xloggc:$HBASE_HOME/logs/gc-$(hostname)-hbase.log"

通过命令查看Hadoop是否支持Snappy:

hadoop checknative -a

测试 hbase snappy:

hbase org.apache.hadoop.hbase.util.CompressionTest file:///home/asin/Temp/test.txt  snappy

打印SUCCESS即为成功

4.2.2 hbase-site.xml

hbase.rootdir: hbase存放数据目录

hbase.zookerper.quorum: zookooper 服务启动的节点,只能为奇数个

<configuration>
  <property>
    <name>hbase.tmp.dir</name>
    <value>./tmp</value>
  </property>
  <property>
    <name>hbase.unsafe.stream.capability.enforce</name>
    <value>false</value>
  </property>
  <!-- 指定hbase在HDFS上存储的路径 -->
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://master:9000/hbase</value>
  </property>
  <!-- 指定hbase是分布式的 -->
  <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
  </property>
  <!-- 指定zk的地址,多个用“,”分割 -->
  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>master:2181,slaver1:2181,slaver2:2181</value>
  </property>

  <!-- 尝试解决regionserver exception问题 -->
  <property>
    <name>hbase.thrift.maxWorkerThreads</name>
    <value>10000</value>
  </property>
  <property>
    <name>hbase.thrift.maxQueuedRequests</name>
    <value>10000</value>
  </property>
  <property>
    <name>hbase.regionserver.executor.openregion.threads</name>
    <value>10000</value>
  </property>

  <!-- 调优测试-->
  <property>
    <name>hbase.hregion.memstore.block.multiplier</name>
    <value>5</value>
  </property>
  <property>
    <name>hbase.hregion.memstore.flush.size</name>
    <value>268435456</value>
  </property>
  <property>
    <name>hbase.regionserver.global.memstore.size</name>
    <value>0.4</value>
  </property>
  <property>
    <name>hbase.regionserver.global.memstore.size.lower.limit</name>
    <value>0.625</value>
  </property>
  <property>
    <name>hbase.hregion.compacting.memstore.type</name>
    <value>BASIC</value>
  </property>
    
  <!-- 为保证正常测试,定时删数据, 临时用, 很耗资源, 真正生产环境可能要禁用这个功能-->
  <!-- 设置6小时触发一次HFile合并,触发的时候会删除过期数据, 即超过创建表时设置的TTL时长-->
  <!-- 单位 ms-->
  <!-- 设置为0禁用自动合并功能-->
  <property>
    <name>hbase.hregion.majorcompaction</name>
    <value>0</value>
  </property>



</configuration>

4.2.3 regionservers

master
slaver1
slaver2

4.2.4 backup-masters

用于配置高可用HMaster节点

slaver1

4.2.5 将配置好的hbase分发到slaver1,slaver2

cd /opt
scp -r hbase-2.2.5 root@slaver1:/opt
scp -r hbase-2.2.5 root@slaver2:/opt

注意:分发完成后,需要在个slaver节点的/usr/local下创建对应的软链接,要不然启动hbase的时候有可能某些节点起不来

4.3 HBase启动

注意:启动hbase之前,要首先启动hadoop和zookeeper

cd /usr/local/hbase/bin
./start-hbase.sh
# stop-hbase.sh

通过jps检查启动状态,会出现HMaster, HRegionServer进程

root@master:/usr/local/hbase/bin# jps
7969 QuorumPeerMain
6353 NameNode
8995 HRegionServer
7124 ResourceManager
7333 NodeManager
9285 Jps
6855 SecondaryNameNode
6584 DataNode
8747 HMaster

[root@slaver1 ~]# jps
25636 DataNode
27767 HRegionServer
28264 Jps
25802 NodeManager
26218 QuorumPeerMain
27932 HMaster

root@slaver2:~# jps
3776 QuorumPeerMain
3296 NodeManager
4489 Jps
3003 DataNode
4364 HRegionServer

启动问题:

  1. HMaster: Failed to become active master, 解决办法:把hbase.rootdir对应的目录删掉即可, e.g. hadoop fs -rm -r /hbase
  2. 通过登录 http://master:16010查看web ui

4.4 phoenix安装

将phoenix-5.0.0-HBase-2.0-server.jar和htrace-core-3.1.0-incubating.jar放入hbase/lib中,并重启hbase

phoenix-5.0.0-HBase-2.0-server.jar:自己编译

trace-core-3.1.0-incubating.jar :需要从网上下载

cp phoenix-5.0.0-HBase-2.0-server.jar htrace-core-3.1.0-incubating.jar /usr/local/hbase/lib

五、Spark集群搭建

5.1 Spark安装

解压,创建软链接

# 解压
cd /opt
tar xavf ./spark-3.0.0-bin-without-hadoop.tgz

# 创建软连接
cd /usr/local
ln -s /opt/spark-3.0.0-bin-without-hadoop spark

5.2 Spark配置

以下配置在/usr/local/spark/conf目录下

5.2.1 spark-env.sh

复制spark-env.sh.template成spark-env.sh, 添加如下信息:

export JAVA_HOME=/usr/local/jdk
export SPARK_MASTER_HOST=master
export SPARK_MASTER_PORT=7077
export SPARK_HOME=/usr/local/spark
export HADOOP_HOME=/usr/local/hadoop
export HADOOP_CONF_DIR=/usr/local/hadoop/etc/hadoop
# 因为我们下载是不带hadoop依赖jar的spark版本,所以需要在spark配置中指定hadoop的classpath
export SPARK_DIST_CLASSPATH=$(/usr/local/hadoop/bin/hadoop classpath)

5.2.2 slaves

复制slaves.template成slaves, 做如下修改

master
slaver1
slaver2

5.2.3 log4j.properties

拷贝log4j.properties.template生产log4j.properties, 然后将其中的INFO改为WARN, 目的是方式长时间跑导致hadoop下userlogs太大的问题

# Set everything to be logged to the console
#log4j.rootCategory=INFO, console
log4j.rootCategory=WARN, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n

# Set the default spark-shell log level to WARN. When running the spark-shell, the
# log level for this class is used to overwrite the root logger's log level, so that
# the user can have different defaults for the shell and regular Spark apps.
log4j.logger.org.apache.spark.repl.Main=WARN

# Settings to quiet third party logs that are too verbose
log4j.logger.org.sparkproject.jetty=WARN
log4j.logger.org.sparkproject.jetty.util.component.AbstractLifeCycle=ERROR
#log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=WARN
#log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=WARN
log4j.logger.org.apache.parquet=ERROR
log4j.logger.parquet=ERROR

# SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support
log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL
log4j.logger.org.apache.hadoop.hive.ql.exec.FunctionRegistry=ERROR

5.2.4 将配置好的spark分发到slaver1,slaver2

cd /opt
scp -r spark-3.0.0-bin-without-hadoop root@slaver1:/opt
scp -r spark-3.0.0-bin-without-hadoop root@slaver2:/opt

分发完成后,需要在个slaver节点的/usr/local下创建对应的软链接

5.3 Spark启动

cd /usr/local/spark/sbin
./start-all.sh
# stop-all.sh

通过jps查看状态,发现多了Master, Worker进程

root@master:/usr/local/spark/sbin# jps
1680 NameNode
1937 SecondaryNameNode
2097 QuorumPeerMain
10258 HMaster
12004 Jps
11879 Worker
11720 Master

可以通过登陆http://master:8080 查看状态

5.4 Spark提交任务示例

5.4.1 yarn-client模式

#!/bin/bash

if [ $# -ne 1 ];then
    echo "usage $0 configFile"
    exit
fi

spark-submit \
--class com.jdsy.BdatApp \
--master yarn \
--deploy-mode client \
--num-executors 9 \
--executor-cores 2  \
--executor-memory 1600M \
--conf spark.default.parallelism=50 \
--conf spark.sql.shuffle.partitions=9 \
--files ./mysql.json \
--packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.0.0 \
./bdat1.0-1.0-SNAPSHOT-jar-with-dependencies.jar \
$1

5.4.2 yarn-cluster模式

spark-submit \
--class com.jdsy.BdatApp \
--master yarn \
--deploy-mode cluster \
--driver-memory 600M \
--num-executors 9 \
--executor-cores 2  \
--executor-memory 1600M \
--conf spark.default.parallelism=50 \
--conf spark.sql.shuffle.partitions=9 \
--files ./mysql.json,$1#taskflow.xml \
--packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.0.0 \
./bdat1.0-1.0-SNAPSHOT-jar-with-dependencies.jar

说明:

  1. 上边$1表示要从外边把一个文件传到spark程序中
  2. 可通过 yarn logs -applicationId <app ID> 来查看自己打的日志信息以及崩溃信息等
  3. 通过yarn application -kill <app ID> 来杀掉这个程序

5.5 Spark On Yarn 动态资源分配

5.5.1 配置

5.5.1.1 修改配置文件spark-defaults.conf,添加如下内容

/usr/local/spark/conf/spark-defaults.conf

# 启用External shuffle Service服务
spark.shuffle.service.enabled true

# 开启动态资源分配
spark.dynamicAllocation.enabled true

#每个Application最小分配的executor数
spark.dynamicAllocation.minExecutors 1

#每个Application最大并发分配的executor数
spark.dynamicAllocation.maxExecutors 30

#初始给的executor个数
spark.dynamicAllocation.initialExecutors=3

#当有task挂起或等待schedulerBacklogTimeout(默认1s)时间的时候,会开始动态资源分配
spark.dynamicAllocation.schedulerBacklogTimeout 1s

#之后会每隔sustainedSchedulerBacklogTimeout(默认1s)时间申请一次,直到申请到足够的资源。每次申请的资源量是指数增长的,即1,2,4,8等
spark.dynamicAllocation.sustainedSchedulerBacklogTimeout 5s
5.5.1.2 将spark-xxx-yarn-shuffle.jar添加到NodeManager节点的classpath环境中
cp /usr/local/spark/yarn/spark-3.0.0-yarn-shuffle.jar /usr/local/hadoop/share/hadoop/yarn/lib/
5.5.1.3 修改配置文件yarn-site.xml,添加如下内容

/usr/local/hadoop/etc/hadoop/yarn-site.xml

  <!-- 增加spark_shuffle, 使能动态资源分配 -->
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle,spark_shuffle</value>
  </property>

  <!-- spark动态资源分配相关参数-->
  <property>
    <name>yarn.nodemanager.aux-services.spark_shuffle.class</name>
    <value>org.apache.spark.network.yarn.YarnShuffleService</value>
  </property>
5.5.1.4 将修改好的spark配置文件,hadoop配置文件分发到集群各节点

5.5.2 启动集群

注意:配置好动态资源分配后,一定要先启动spark集群,再启动hadoop集群,反过来会造成spark的一个端口被占用,导致spark起不来

5.5.3 Spark提交任务

以yarn-client模式为例,可以不用指定executor个数,以及每个executor的相关参数

#!/bin/bash

if [ $# -ne 1 ];then
    echo "usage $0 configFile"
    exit
fi

spark-submit \
--class com.jdsy.BdatApp \
--master yarn \
--deploy-mode client \
--conf spark.default.parallelism=50 \
--conf spark.sql.shuffle.partitions=9 \
--files ./mysql.json \
--packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.0.0 \
./bdat1.0-1.0-SNAPSHOT-jar-with-dependencies.jar \
$1

注意:以实时从kafka取数据为例,只有当kafka没有数据的时候才会释放资源

5.6 历史服务器

5.6.1配置修改

5.6.1.1 mapred-site.xml

修改/usr/local/hadoop/etc/hadoop/mapred-site.xml, 添加如下内容

 <property>
   <name>mapreduce.jobhistory.address</name>
   <value>master:10020</value>
 </property>
 <property>
  <name>mapreduce.jobhistory.webapp.address</name>
  <value>master:19888</value>
 </property>
5.6.1.2 yarn-site.xml

修改/usr/local/hadoop/etc/hadoop/yarn-site.xml, 添加如下内容

  <!--开启了日志聚合-->
  <property>
    <name>yarn.log-aggregation-enable</name>
    <value>true</value>
  </property>
  <!--设置聚合日志放置的位置-->
  <property>
    <name>yarn.nodemanager.remote-app-log-dir</name>
    <value>/tmp/logs</value>
  </property>
  <!--设置聚合日志存放的时间,单位为秒,会自动移除-->
  <property>
    <name>yarn.log-aggregation.retain-seconds</name>
    <value>86400</value>
  </property>
  <!-- 配置日志服务器的地址,work节点使用 -->
  <property>
   <name>yarn.log.server.url</name>
   <value>http://master:19888/jobhistory/logs</value>
  </property>
5.6.1.3 spark-defaults.conf

spark-defaults.conf中添加如下内容:

# 历史服务器相关配置
spark.yarn.historyServer.address=master:18080
spark.yarn.historyServer.allowTracking=true

spark.eventLog.enabled=true
# 使支持压缩,默认用lz4
spark.eventLog.compress=true
# 使支持滚动删除日志,避免日志问题太大,默认文件大小为128M
spark.eventLog.rolling.enabled=true

spark.eventLog.dir=hdfs://master:9000/spark/eventlogs
spark.history.fs.logDirectory=hdfs://master:9000/spark/eventlogs
5.6.1.4 将以上修改的配置拷贝到各slaver节点的对应目录下

5.6.2 在hdfs上创建对应的日志目录

cd /usr/local/hadoop/bin
./hdfs dfs -mkdir -p /spark/eventlogs

5.6.3 启动历史服务器

cd /usr/local/hadoop/sbin
./mr-jobhistory-daemon.sh start historyserver
# ./mr-jobhistory-daemon.sh stop historyserver

cd /usr/local/spark/sbin
./start-history-server.sh
# ./stop-history-server.sh

通过jps命令发现会多了一个HistoryServer(spark)和JobHistoryServer(hadoop)进程

root@master:/usr/local/hadoop/sbin# jps
15200 HistoryServer
22020 JobHistoryServer

当应用程序运行完成后,可通过点http://master:8088对应Application的History看历史日志,也可以通过 http://master:18080看历史日志

六、Kafka集群搭建

6.1 Kafka安装

解压,然后在 /home目录下创建kafka的log目录, 在/usr/local下创建软连接

# 解压
cd /opt
tar xavf ./kafka_2.12-2.5.0.tgz

# 创建目录
# 注意:尽量放到硬盘空间大的分区下,要不然有可能会因为硬盘空间不足导致kafka崩溃掉
mkdir -p /home/kafka/data

# 创建软连接
cd /usr/local
ln -s /opt/kafka_2.12-2.5.0 kafka

6.2 Kafka配置

6.2.1 server.properties (/usr/local/kafka/config目录下)

# 指定代理id,borker.id可以任意指定,前提是保证集群内每台机器的broker.id唯一,第二台机器设置为2...以此类推
broker.id=0

# 提供给客户端响应的端口, master节点指定为master:9092, slaver1节点指定slaver1:9092, 依次类推
listeners=PLAINTEXT://master:9092

# kafka数据的存放目录,而非Kafka的日志目录
log.dirs=/home/kafka/data

# 最长保留7天数据,注意是每个topic的每个partition下的每个segment中最大时间戳超过7天认为过期
# 注意:只有当新产生segment的时候才会触发数据回收
log.retention.hours=168

# 设置zookeeper集群地址
zookeeper.connect=master:2181,slaver1:2181,slaver2:2181

# broker处理消息的最大线程数
num.network.threads=9
# broker处理磁盘IO的线程数
num.io.threads=16
# 增加超时时间, 注意如果超过zookeep最大超时时间,则需要对应修改一下zookeep的配置
zookeeper.connection.timeout.ms=180000


上述配置对所有TOPIC都生效,如果想对某个TOPIC应用单独配置,可在创建的时候指定相关参数。e.g.

#!/bin/bash

if [ $# -ne 3 ]; then
    echo "usage $0 topic 分区数 副本数"
    exit
fi

kafka-topics.sh --create \
    --zookeeper master:2181,slaver1:2181,slaver2:2181 \
    --topic $1 \
    --config compression.type=lz4 \
    --config segment.bytes=4000 \
    --config retention.ms=30000 \
    --partitions $2 \
    --replication-factor $3

6.2.2 修改启动脚本

以下配置位于 /usr/local/kafka/bin目录下

6.2.2.1 kafka-server-start.sh

在最开始添加如下内容:

export JAVA_HOME=/usr/local/jdk
export JMX_PORT="9999"
6.2.2.2 kafka-server-stop.sh

在最开始添加如下内容:

export JAVA_HOME=/usr/local/jdk
6.2.2.3 kafka-run-class.sh

在最开始添加如下内容:

export JAVA_HOME=/usr/local/jdk

6.2.3 将配置好的kafka分发到slaver1,slaver2

cd /opt
scp -r kafka_2.12-2.5.0 root@slaver1:/opt
scp -r kafka_2.12-2.5.0 root@slaver2:/opt

注意:

  1. 需要修改slaver节点上broker.id, 比如slaver1为1, slaver2为2
  2. 修改对应的listeners
  3. 需要在个slaver节点的/usr/local下创建对应的软链接

6.3 Kafka启动

注意:一定要先启动kafka, 再启动kafka-eagle, 如果反过来会造成9999端口被eagle占用导致kafka起不来!!

分别在master,slaver1,slaver2上执行如下命令

cd /usr/local/kafka
./bin/kafka-server-start.sh -daemon ./config/server.properties
# ./bin/kafka-server-stop.sh

通过jps查看状态, 会发现多了Kafka进程

root@master:/usr/local/kafka# jps
1680 NameNode
1937 SecondaryNameNode
2097 QuorumPeerMain
10258 HMaster
11879 Worker
11720 Master
12618 Jps
12590 Kafka

root@slaver1:/usr/local/kafka# jps
6833 Jps
5414 HRegionServer
1575 DataNode
1751 QuorumPeerMain
6809 Kafka
6077 Worker

root@slaver2:/usr/local/kafka# jps
1456 DataNode
4768 HRegionServer
1626 QuorumPeerMain
6156 Kafka
5438 Worker
6175 Jps
6.3.1 集群启动/停止脚本

kafka/bin/kafka-cluster-start.sh

#!/bin/bash

brokers="master slaver1 slaver2"
KA_HOME="/usr/local/kafka"
KA_NAME="kafka"

echo "INFO: Begin to start kafka cluster ..."

# By default disable strict host key checking
if [ "$ZK_SSH_OPTS" = "" ]; then
  ZK_SSH_OPTS="-o StrictHostKeyChecking=no"
fi

for broker in $brokers
do
  echo "INFO:Start ${KA_NAME} on ${broker} ..."
  ssh $ZK_SSH_OPTS ${broker} "${KA_HOME}/bin/kafka-server-start.sh -daemon ${KA_HOME}/config/server.properties"
  echo ssh $ZK_SSH_OPTS ${broker} "${KA_HOME}/bin/kafka-server-start.sh -daemon ${KA_HOME}/config/server.properties"
  if [[ $? -eq 0 ]]; then
    echo "INFO: start ${KA_NAME} on ${broker}  is on !"
  fi
done

kafka/bin/kafka-cluster-stop.sh

#!/bin/bash

brokers="master slaver1 slaver2"
KAFKA_HOME="/usr/local/kafka"
KAFKA_NAME="kafka"

echo "INFO: Begin to stop kafka cluster ..."

# By default disable strict host key checking
if [ "$ZK_SSH_OPTS" = "" ]; then
  ZK_SSH_OPTS="-o StrictHostKeyChecking=no"
fi

for broker in $brokers
do
  echo "INFO:Shut down ${KAFKA_NAME} on ${broker} ..."
  ssh $ZK_SSH_OPTS ${broker} "${KAFKA_HOME}/bin/kafka-server-stop.sh"
  if [[ $? -eq 0 ]]; then
    echo "INFO :Shut down ${KAFKA_NAME} on ${broker}  is down !"
  fi
done
echo "INFO:Kafka cluster shutdown completed !"

6.5 Kafka Eagle安装

6.5.1 解压

# 解压
cd /opt
tar xavf kafka-eagle-bin-1.4.8.tar.gz
# 创建软链接
cd /usr/local
ln -s /opt/kafka-eagle-bin-1.4.8/kafka-eagle-web-1.4.8 kafka-eagle

6.5.2 设置环境变量

修改 /etc/profile, 添加如下配置

export KE_HOME=/usr/local/kafka-eagle

source /etc/profile 使配置生效

6.5.3 修改配置

kafka-eagle-web-1.4.8/conf/system-config.properties

#如果只有一个集群的话,就写一个cluster1就行了
kafka.eagle.zk.cluster.alias=cluster1
cluster1.zk.list=master:2181,slaver1:2181,slaver2:2181

#如果kafka开启了sasl认证,需要在这个地方配置sasl认证文件
kafka.eagle.sasl.enable=false

#下面两项是配置数据库的,默认使用sqlite,如果量大,建议使用mysql,这里我使用的是sqlit
#如果想使用mysql建议在文末查看官方文档
kafka.eagle.driver=org.sqlite.JDBC
kafka.eagle.url=jdbc:sqlite:/usr/local/kafka-eagle/db/ke.db
kafka.eagle.username=root
kafka.eagle.password=111111

6.5.4 启动kafka-eagle

cd /opt/kafka-eagle-web-1.4.8/bin
./ke.sh start
#./ke.sh stop

启动之后可通过 http://master:8048/ke登录查看信息,默认用户名密码 admin/123456

七、集群迁移

以将192.168.100.100上的数据拷贝到192.168.100.200上为例

7.1 新集群准备工作

参考 一、准备章节内容

7.2 将现有集群上的软件包拷贝到新集群上

以下操作是在192.168.100.100上进行

7.2.1 清空现有集群上各软件的log日志

# 进到各软件的安装目录
cd /opt/
# 删除zookeeper日志
rm apache-zookeeper-3.6.1-bin/logs/* -rf
rm apache-zookeeper-3.6.1-bin/data/version-2/ -rf
rm apache-zookeeper-3.6.1-bin/datalog/version-2/ -rf
# 删除hadoop日志
rm hadoop-3.1.3/logs/* -rf
# 删除hbase日志
rm hbase-2.2.5/logs/* -rf
# 删除spark日志
rm spark-3.0.0-bin-without-hadoop/logs/* -rf
# 删除kafka日志
rm kafka_2.12-2.5.0/logs/* -rf
# 删除kafka-eagle(如果有)
rm kafka-eagle-bin-1.4.8/kafka-eagle-web-1.4.8/logs/* -rf

7.2.2 将现有集群上的各软件打包

tar cavf total.tar.gz \
jdk1.8.0_151/ \
apache-zookeeper-3.6.1-bin/ \
hadoop-3.1.3/ \
hbase-2.2.5/ \
hbase-operator-tools-1.0.0/ \
spark-3.0.0-bin-without-hadoop/ \
kafka_2.12-2.5.0/ \
kafka-eagle-bin-1.4.8/

7.2.3 将打好的压缩包发送到新节点上

scp total.tar.gz root@192.168.100.200:/opt

7.3 在新集群节点上完成后续搭建工作

以下是在192.168.100.200上进行

7.3.1 解压

cd /opt
tar xavf total.tar.gz

7.3.2 参考各集群搭建细节,创建对应的数据目录及软连接等(如果有需要,设置对应的环境变量),完成集群搭建

注意:

  1. 创建软链接的时候,源地址最后不要带/

  2. 第一次启动时,hadoop启动之前需要先格式化

  3. 第一次启动时,hbase启动之前需要先把hdfs上的/hbase目录删掉,同时把zookeeper上的相关信息清掉

    # 清hdfs上的hbase信息
    cd /usr/local/hadoop/bin
    ./hdfs dfs -rm -r /hbase
    # 清zookeeper上hbase信息
    cd /usr/local/hbase/bin
    ./hbase zkcli
    rmr /hbase
    
  1. 需要修改本机/etc/hosts, 加上对应的master, slaver1, slaver2, 否则导致如下问题:

    • hadoop yarn application ui无法登陆
    • 本地操作hbase不好使
    • 从本地发kafka数据不好使
    192.168.100.200 master
    192.168.100.201 slaver1
    192.168.100.202 slaver2
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343