大数据集群搭建
本文档将搭建以下集群
- hadoop 集群
- zookeeper 集群
- hbase 集群
- spark 集群
- kafka 集群
一、准备
1.1 软件版本
- Ubuntu 18.04
- JDK 1.8 (jdk-8u151-linux-x64.tar.gz)
- Hadoop 2.7.7 (hadoop-2.7.7.tar.gz)
- HBase 1.4.13 (hbase-1.4.13-bin.tar.gz)
- ZooKeeper 3.5.6 (apache-zookeeper-3.5.6-bin.tar.gz)
- Spark 2.4.5 (spark-2.4.5-bin-hadoop2.7.tgz)
- Kafka 2.12-2.3.1 (kafka_2.12-2.3.1.tgz)
- Kafka Eagle (kafka-eagle-bin-1.4.8.tar.gz)
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 修改/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.2 修改/etc/hostname,为绑定计算机名。(计算机名和上面hosts绑定名必须一致
root@master:~# cat /etc/hostname
master
root@slaver1:~# cat /etc/hostname
slaver1
root@slaver2:~# cat /etc/hostname
slaver2
修改完hostname之后好像需要重启才能生效
1.5 SSH 设置
1.5.1 设置ssh可以通过root用户登陆
设置root用户密码
sudo passwd
设置允许ssh以root用户登陆
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安装
解压 ,并在安装目录下创建tmp、dfs、dfs/name、dfs/node、dfs/data
cd /opt
tar xavf ./hadoop-2.7.7.tar.gz
cd hadoop-2.7.7
mkdir tmp
mkdir dfs
mkdir dfs/name
mkdir dfs/node
mkdir dfs/data
2.2 Hadoop配置
以下操作都在hadoop-2.7.7/etc/hadoop下进行
2.2.1 hadoop-env.sh
修改JAVA_HOME配置项为JDK安装目录
export JAVA_HOME=/usr/local/jdk
2.2.2 core-site.xml
fs.default.name : 这个属性用来指定namenode的hdfs协议的文件系统通信地址,可以指定一个主机+端口
hadoop.tmp.dir : hadoop集群在工作的时候存储的一些临时文件的目录
<configuration>
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/hadoop-2.7.7/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>/opt/hadoop-2.7.7/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>/opt/hadoop-2.7.7/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>
</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>
</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上的位置
<configuration>
<!--设置使用公平调度算法 -->
<property>
<name>yarn.resourcemanager.scheduler.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.scheduler.fair.FairScheduler</value>
</property>
<!-- Shuffle service 需要加以设置的MapReduce的应用程序服务 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_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>3600</value>
</property>
</configuration>
2.2.6 slaves
集群中机器的主机名列表,会在下边每台机器上启动一个NodeManager
master
slaver1
slaver2
2.2.7 将配置好的hadoop分发到slaver1,slaver2上
cd /opt
scp -r hadoop-2.7.7 root@slaver1:/opt
scp -r hadoop-2.7.7 root@slaver2:/opt
2.3 Hadoop启动
2.3.1 格式化一个新的文件系统
注意:第一次搭建的时候格式化一次就好!!不要重复format
cd /opt/hadoop-2.7.7/bin
./hadoop namenode -format
2.3.2 启动HDFS
cd /opt/hadoop-2.7.7/sbin
./start-dfs.sh
# stop-dfs.sh
通过jps检查是否启动成功,看看master上是否有NameNode, slaver节点上是否有DataNode
root@master:/opt/hadoop-2.7.7/sbin# jps
6306 SecondaryNameNode
6050 NameNode
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:/opt/hadoop-2.7.7/sbin# jps
6672 ResourceManager
6306 SecondaryNameNode
6050 NameNode
6934 Jps
root@slaver1:~# jps
5605 Jps
5416 NodeManager
4987 DataNode
root@slaver2:~# jps
3296 NodeManager
3480 Jps
3003 DataNode
可通过网页http://master:8088查看Hadoop任务状态
三、ZooKeeper集群搭建
3.1 ZooKeeper安装
解压,并创建data目录
cd /opt
tar xavf ./apache-zookeeper-3.5.6-bin.tar.gz
cd apache-zookeeper-3.5.6-bin
mkdir data
在data目录下创建myid文件,在文件第一行写上对应的 Server id。这个id必须在集群环境中服务器标识中是唯一的,且大小在1~255之间。
cd 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=/opt/apache-zookeeper-3.5.6-bin/data
server.1=master:2888:3888
server.2=slaver1:2888:3888
server.3=slaver2:2888:3888
3.2.2 将配置好的zookeeper分发到slaver1,slaver2
cd /opt
scp -r apache-zookeeper-3.5.6-bin root@slaver1:/opt
scp -r apache-zookeeper-3.5.6-bin root@slaver2:/opt
分发完成之后,需要ssh到各slaver节点上,修改对应myid中的值。设置slaver1中myid为2,设置slaver2中myid为3, 修改对应的zoo.cfg
3.3 ZooKeeper启动
分别在master,slaver1,slaver2执行如下命令
cd /opt/apache-zookeeper-3.5.6-bin/bin
./zkServer.sh start
# ./zkServer.sh stop
各节点启动后,通过jps检查启动状态,会出现QuorumPeerMain进程
root@master:/opt/apache-zookeeper-3.5.6-bin/bin# jps
6672 ResourceManager
6306 SecondaryNameNode
6050 NameNode
7434 QuorumPeerMain
7470 Jps
通过 zkServer.sh status
查看各节点的运行模式
root@master:/opt/apache-zookeeper-3.5.6-bin/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节点/opt/apache-zookeeper-3.5.6-bin/bin目录下添加脚本:
- 一键启动脚本:zk-cluster-start.sh
brokers="master slaver1 slaver2"
#brokers="slaver1"
ZK_HOME="/opt/apache-zookeeper-3.5.6-bin"
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"
#brokers="slaver1"
ZK_HOME="/opt/apache-zookeeper-3.5.6-bin"
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-1.4.13-bin.tar.gz
4.2 HBase配置
以下配置文件在/opt/hbase-1.4.13/conf目录下
4.2.1 hbase-env.sh
修改JAVA_HOME配置项为JDK安装目录,不使用hbase自带的zookeeper
export JAVA_HOME=/usr/local/jdk
export HBASE_MANAGES_ZK=false
4.2.2 hbase-site.xml
hbase.rootdir: hbase存放数据目录
hbase.zookerper.quorum: zookooper 服务启动的节点,只能为奇数个
<configuration>
<!-- 指定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>
</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-1.4.13 root@slaver1:/opt
scp -r hbase-1.4.13 root@slaver2:/opt
4.3 HBase启动
注意:启动hbase之前,要首先启动hadoop和zookeeper
cd /opt/hbase-1.4.13/bin
./start-hbase.sh
# stop-hbase.sh
通过jps检查启动状态,master会出现HMaster进程, slaver会出现HRegionServer进程
root@master:/opt/hbase-1.4.13/bin# jps
6672 ResourceManager
6306 SecondaryNameNode
7762 HMaster
6050 NameNode
7891 Jps
7434 QuorumPeerMain
root@slaver1:~# jps
6161 HRegionServer
6290 Jps
5959 QuorumPeerMain
5416 NodeManager
4987 DataNode
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
五、Spark集群搭建
5.1 Spark安装
cd /opt
tar xavf ./spark-2.4.5-bin-hadoop2.7.tgz
5.2 Spark配置
以下配置在spark-2.4.5-bin-hadoop2.7/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=/opt/spark-2.4.5-bin-hadoop2.7
# 目的是使能运行yarn-client/yarn-cluster模式
export SPARK_HOME=/opt/hadoop-2.7.7
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export YARN_CONF_DIR=$HADOOP_HOME/etc/hadoop
5.2.2 slaves
复制slaves.template成slaves, 做如下修改
master
slaver1
slaver2
5.2.3 将配置好的spark分发到slaver1,slaver2
cd /opt
scp -r spark-2.4.5-bin-hadoop2.7 root@slaver1:/opt
scp -r spark-2.4.5-bin-hadoop2.7 root@slaver2:/opt
5.3 Spark启动
cd /opt/spark-2.4.5-bin-hadoop2.7/sbin
./start-all.sh
# stop-all.sh
通过jps查看状态,发现多了一个Worker进程
root@master:/opt/spark-2.4.5-bin-hadoop2.7/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模式
spark-submit \
--class com.jdsy.BdatApp \
--master yarn \
--deploy-mode client \
--num-executors 3 \
--executor-cores 3 \
--executor-memory 4G \
--conf spark.default.parallelism=25 \
--packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.4.5 \
./bdat1.0-1.0-SNAPSHOT-jar-with-dependencies.jar
5.4.2 yarn-cluster模式
#!/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 3 \
--executor-cores 6 \
--executor-memory 6G \
--conf spark.default.parallelism=50 \
--conf spark.sql.shuffle.partitions=3 \
--files ./mysql.json \
--packages org.apache.spark:spark-sql-kafka-0-10_2.11:2.4.5 \
./bdat1.0-1.0-SNAPSHOT-jar-with-dependencies.jar \
$1
说明:
- 上边$1表示要从外边把一个文件传到spark程序中
- 可通过 yarn logs -applicationId <app ID> 来查看自己打的日志信息以及崩溃信息等
- 通过yarn application -kill <app ID> 来杀掉这个程序
六、Kafka集群搭建
6.1 Kafka安装
cd /opt
tar xavf ./kafka_2.12-2.3.1.tgz
6.2 Kafka配置
以下配置在kafka_2.12-2.3.1/config目录下
6.2.1 server.properties
# 指定代理id,borker.id可以任意指定,前提是保证集群内每台机器的broker.id唯一,第二台机器设置为2...以此类推
broker.id=0
# 提供给客户端响应的端口, master节点指定为master:9092, slaver1节点指定slaver1:9092, 依次类推
listeners=PLAINTEXT://master:9092
# kafka数据的存放目录,而非Kafka的日志目录
log.dirs=/opt/kafka_2.12-2.3.1/kafka-log
# 设置zookeeper集群地址
zookeeper.connect=master:2181,slaver1:2181,slaver2:2181
6.2.2 将配置好的kafka分发到slaver1,slaver2
cd /opt
scp -r kafka_2.12-2.3.1 root@slaver1:/opt
scp -r kafka_2.12-2.3.1 root@slaver2:/opt
注意:
- 需要修改slaver节点上broker.id, 比如slaver1为1, slaver2为2
- 修改对应的listeners
6.3 Kafka启动
分别在master,slaver1,slaver2上执行如下命令
cd /opt/kafka_2.12-2.3.1/
./bin/kafka-server-start.sh -daemon ./config/server.properties
# kafka-server-stop.sh
通过jps查看状态, 会发现多了Kafka进程
root@master:/opt/kafka_2.12-2.3.1# jps
1680 NameNode
1937 SecondaryNameNode
2097 QuorumPeerMain
10258 HMaster
11879 Worker
11720 Master
12618 Jps
12590 Kafka
root@slaver1:/opt/kafka_2.12-2.3.1# jps
6833 Jps
5414 HRegionServer
1575 DataNode
1751 QuorumPeerMain
6809 Kafka
6077 Worker
root@slaver2:/opt/kafka_2.12-2.3.1# jps
1456 DataNode
4768 HRegionServer
1626 QuorumPeerMain
6156 Kafka
5438 Worker
6175 Jps
6.4 Kafka常用操作
6.4.1 列出所有topic信息
kafka-topics.sh --describe --zookeeper master:2181,slaver1:2181,slaver2:2181
6.4.2 创建topic
kafka-topics.sh --create \
--zookeeper master:2181,slaver1:2181,slaver2:2181 \
--topic topicName \
--partitions 分区数 \
--replication-factor 备份数
6.5 Kafka Eagle安装
6.5.1 解压
cd /opt
tar xavf kafka-eagle-bin-1.4.8.tar.gz
6.5.2 修改配置
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:/opt/kafka-eagle-web-1.4.8/db/ke.db
kafka.eagle.username=root
kafka.eagle.password=111111
6.5.3 启动kafka-eagle
cd /opt/kafka-eagle-web-1.4.8/bin
./ke.sh start
#./ke.sh stop
启动之后可通过 http://localcast:8048/ke登录查看信息,默认用户名密码 admin/123456