大数据集群搭建
本文档将搭建以下集群
- 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
注意:
- ip地址和DNS服务器地址需要用[]括起来,但是网关地址不需要
- 注意每个冒号后边都要先加一个空格
- 注意每一层前边的缩进,至少比上一层多两个空格
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集群在工作的时候存储的一些临时文件的目录
hadoop.tmp.dir
/home/hadoop/tmp
Abase for other temporaty directories.
fs.default.name
hdfs://master:9000
io.file.buffer.size
131702
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 不同节点
dfs.name.dir
/home/hadoop/dfs/name
Path on the local filesystem where the NameNode stores the namespace and transactions log persistently.
dfs.data.dir
/home/hadoop/dfs/data
Comma separated list of on the local filesystem where the NameNode stores the namespace and transactions log persistently.
dfs.replication
2
replication num.
dfs.permissions
false
need not permissions.
dfs.namenode.sencondary.http-address
master:9001
第二namenode地址.
dfs.namenode.datanode.registration.ip-hostname-check
false
check.
dfs.namenode.http-address
master:50070
2.2.4 mapred-site.xml
cp mapred-site.xml.template mapred-site.xml
mapreduce.framework.name:指定mr框架为yarn方式
mapreduce.framework.name
yarn
mapreduce.map.memory.mb
1536
mapreduce.map.java.opts
-Xmx1024M
mapreduce.reduce.memory.mb
3072
mapreduce.reduce.java.opts
-Xmx2560M
mapreduce.jobhistory.address
master:10020
mapreduce.jobhistory.webapp.address
master:19888
2.2.5 yarn-site.xml
yarn.resourcemanager.scheduler.class:设置调度算法,默认FIFO
yarn.log-aggregation-enable:如果开启了日志聚合,那么容器日志将被复制到HDFS,并删除本地日志。而后这些日志可以在集群任何节点上用yarn logs命令查看 yarn logs -applicationId
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 起不来
yarn.resourcemanager.scheduler.class
org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler
yarn.scheduler.fair.preemption
true
yarn.nodemanager.aux-services
mapreduce_shuffle,spark_shuffle
yarn.nodemanager.aux-services.mapreduce.shuffle.class
org.apache.hadoop.mapred.ShuffleHandler
yarn.resourcemanager.address
master:8032
yarn.resourcemanager.scheduler.address
master:8030
yarn.resourcemanager.resource-tracker.address
master:8035
yarn.resourcemanager.admin.address
master:8033
yarn.resourcemanager.webapp.address
master:8088
yarn.log-aggregation-enable
true
yarn.nodemanager.remote-app-log-dir
/tmp/logs
yarn.log-aggregation.retain-seconds
86400
yarn.log.server.url
http://master:19888/jobhistory/logs
yarn.nodemanager.resource.memory-mb
8192
yarn.scheduler.maximum-allocation-mb
8192
yarn.nodemanager.resource.cpu-vcores
21
yarn.scheduler.maximum-allocation-vcores
21
yarn.nodemanager.pmem-check-enabled
false
yarn.nodemanager.vmem-check-enabled
false
yarn.nodemanager.aux-services.spark_shuffle.class
org.apache.spark.network.yarn.YarnShuffleService
yarn.resourcemanager.am.max-attempts
10000
对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
公平调度算法用到的配置文件
4096 mb,8vcores
2.0
fair
60
4096 mb,8vcores
3.0
fair
30
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目录下添加脚本:
- 一键启动脚本: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 !"
- 一键关闭脚本 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 服务启动的节点,只能为奇数个
hbase.tmp.dir
./tmp
hbase.unsafe.stream.capability.enforce
false
hbase.rootdir
hdfs://master:9000/hbase
hbase.cluster.distributed
true
hbase.zookeeper.quorum
master:2181,slaver1:2181,slaver2:2181
hbase.thrift.maxWorkerThreads
10000
hbase.thrift.maxQueuedRequests
10000
hbase.regionserver.executor.openregion.threads
10000
hbase.hregion.memstore.block.multiplier
5
hbase.hregion.memstore.flush.size
268435456
hbase.regionserver.global.memstore.size
0.4
hbase.regionserver.global.memstore.size.lower.limit
0.625
hbase.hregion.compacting.memstore.type
BASIC
hbase.hregion.majorcompaction
0
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
启动问题:
- HMaster: Failed to become active master, 解决办法:把hbase.rootdir对应的目录删掉即可, e.g.
hadoop fs -rm -r /hbase
- 通过登录 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表示要从外边把一个文件传到spark程序中
- 可通过 yarn logs -applicationId
来查看自己打的日志信息以及崩溃信息等 - 通过yarn application -kill
来杀掉这个程序
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
yarn.nodemanager.aux-services
mapreduce_shuffle,spark_shuffle
yarn.nodemanager.aux-services.spark_shuffle.class
org.apache.spark.network.yarn.YarnShuffleService
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
, 添加如下内容
mapreduce.jobhistory.address
master:10020
mapreduce.jobhistory.webapp.address
master:19888
5.6.1.2 yarn-site.xml
修改/usr/local/hadoop/etc/hadoop/yarn-site.xml
, 添加如下内容
yarn.log-aggregation-enable
true
yarn.nodemanager.remote-app-log-dir
/tmp/logs
yarn.log-aggregation.retain-seconds
86400
yarn.log.server.url
http://master:19888/jobhistory/logs
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
注意:
- 需要修改slaver节点上broker.id, 比如slaver1为1, slaver2为2
- 修改对应的listeners
- 需要在个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 [email protected]:/opt
7.3 在新集群节点上完成后续搭建工作
以下是在192.168.100.200上进行
7.3.1 解压
cd /opt
tar xavf total.tar.gz
7.3.2 参考各集群搭建细节,创建对应的数据目录及软连接等(如果有需要,设置对应的环境变量),完成集群搭建
注意:
创建软链接的时候,源地址最后不要带/
第一次启动时,hadoop启动之前需要先格式化
第一次启动时,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
需要修改本机/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