Hadoop2.7.3+spark2.1.0+hbase0.98分布式集群部署
运行环境配置(10.79.115.111-114)
1、关闭防火墙与selinux
关闭防火墙:
CentOS 7.x默认使用的是firewall作为防火墙。
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
关闭selinux:
Redhat应用了SELinux去加强平安,永久封闭的举措为:
修改 /etc/selinux/config 文件中的 SELINUX=”” 为 disabled ,然后重启服务器。
重启后查看SELinux状态:执行getenforce命令
2、卸载centos7自带openjdk并安装oracle jdk
rpm -qa | grep java* 查看已安装列表
rpm -e --nodeps 软件名 卸载此软件及其依赖软件
然后在下载配置oracle jdk,我配置的JAVA_HOME=/opt/jdk1.8。
3、ssh免登陆
/usr/bin/ssh-keygen -t [rsa | dsa]
PS:如果直接执行/usr/bin/ssh-keygen ssh-keygen,那么默认采用rsa 生成公钥跟私钥。
这4台服务器依次执行 /usr/bin/ssh-keygen-t,然后将~/.ssh/id_rsa.pub生成的公钥添加到CentOS7-1的~/.ssh/authorized_keys文件,之后通过scp命令将CentOS7-1的authorized_keys文件发送到另外三台服务器。
如: scp ~/.ssh/authorized_keys CentOS7-2:/~/.ssh/
4、主机映射
cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.79.115.111 CentOS7-1
10.79.115.112 CentOS7-2
10.79.115.113 CentOS7-3
10.79.115.114 CentOS7-4
5、在111-113安装配置zookeeper(基数台)
我将zookeeper装在/opt路径下(cd /opt):
wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz -P
mv zookeeper-3.4.6 zookeeper
cd zookeeper
cp conf/zoo_sample.cfg conf/zoo.cfg
#把zookeeper加入到环境变量
"PATH=$PATH:/opt/zookeeper/bin" >> /etc/profile
source /etc/profile 使配置立即生效
Zookeeper集群配置:
注意:搭建zookeeper集群时,一定要先停止已经启动的zookeeper节点。
cat zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/var/zookeeper/data
dataLogDir=/var/zookeeper/logs
clientPort=2181
autopurge.snapRetainCount=500
autopurge.purgeInterval=24
server.1=10.79.115.111:2888:3888
server.2=10.79.115.112:2888:3888
server.3=10.79.115.113:2888:3888
#创建相关目录,三台节点都需要
mkdir -p /var/zookeeper/{logs,data}
#其余zookeeper节点安装完成之后,同步配置文件zoo.cfg。
创建ServerID标识
除了修改zoo.cfg配置文件外,zookeeper集群模式下还要配置一个myid文件,这个文件需要放在dataDir(/var/zookeeper/data)目录下。
这个文件里面有一个数据就是A的值(该A就是zoo.cfg文件中server.A=B:C:D中的A),在zoo.cfg文件中配置的dataDir路径中创建myid文件。
#在10.79.115.111服务器上面创建myid文件,并设置值为1,同时与zoo.cfg文件里面的server.1保持一致,如下
echo "1" > /var/zookeeper/data/myid
#在10.79.115.112服务器上面创建myid文件,并设置值为2,同时与zoo.cfg文件里面的server.2保持一致,如下
echo "2" > /var/zookeeper/data/myid
#在10.79.115.113服务器上面创建myid文件,并设置值为3,同时与zoo.cfg文件里面的server.3保持一致,如下
echo "3" > /var/zookeeper/data/myid
到此,相关配置已完成
启动每个服务器上面的zookeeper节点
/opt/zookeeper/bin/zkServer.sh start
PS:Zookeeper一些常用命令:
在准备好相应的配置之后,可以直接通过zkServer.sh 这个脚本进行服务的相关操作
- 1. 启动ZK服务: sh bin/zkServer.sh start
- 2. 查看ZK服务状态: sh bin/zkServer.sh status
- 3. 停止ZK服务: sh bin/zkServer.sh stop
- 4. 重启ZK服务: sh bin/zkServer.sh restart
6、ntp时间同步
10.79.0.60(ntp服务端)已搭好,配置ntp客户端(111-114)
systemctl enable ntpd &&systemctl start ntpd(设ntpd服务开机自启并启动)
编辑/etc/ntp.conf文件,请参考(111-114服务器任意一台的/etc/ntp.conf文件)。
重启ntpd服务 #systemctl restart ntpd
启动后,查看同步情况
# ntpq -p
# ntpstat
因为是内网,一般ntpstat很快就可以同步上。
7、配置 /etc/security/limits.conf 文件。
末尾添加
* soft nproc 100240
* hard nproc 100240
* soft nofile 100240
* hard nofile 100240
其中,nofile - 打开文件的最大数目,nproc - 进程的最大数目。
可通过ulimit -n -u命令来查看。(修改完要重新ssh连接服务器才能看到效果)
安装Hadoop2.7.3+Spark2.10+hbase0.98:
Hadoop(M:master,S:slave,RM:ResourceManager),
在/hadoop/目录下
CentOS7-1(M) |
CentOS7-2 |
CentOS7-3(S) |
CentOS7-4(S) |
Zookeeper |
Zookeeper |
Zookeeper |
|
NameNode |
NameNode |
JournalNode |
JournalNode |
ZKFS |
ZKFC |
NodeMana.. |
NodeManager |
RM |
|
DataNode |
DataNode |
JObHistoryS |
|
|
|
Hadoop分布式集群配置(按照上图进行配置):
首先配置HADOOP_HOME,在/etc/profile添加:
export HADOOP_HOME=/hadoop/hadoop-2.7.3
export PATH=$PATH:$HADOOP_HOME/bin
之后source /etc/profile使配置立即生效。
Hadoop的分布式安装过程非常简单,只需要将Hadoop安装包解压到指定的目录就可以了,接下来对Hadoop的主要配置文件进行配置。
将Hadoop安装包解压到/hadoop 目录下:
然后针对/hadoop/hadoop-2.7.3/etc/hadoop目录下几个主要文件进行配置:
hadoop-env.sh、yarn-env.sh 、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml、slaves
1、配置hadoop-env.sh
编辑hadoop-env.sh,找到JAVA_HOME指定JDK的安装配置
$vi hadoop-env.sh
export JAVA_HOME=/opt/jdk1.8
2、配置yarn-env.sh
编辑yarn-env.sh,找到JAVA_HOME指定JDK的安装配置
$vi yarn-env.sh
export JAVA_HOME=/opt/jdk1.8
3、配置core-site.xml
$vi core-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定hdfs的nameservice为cluster -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://cluster</value>
</property>
<!-- 指定zookeeper地址-->
<property>
<name>ha.zookeeper.quorum</name>
<value>CentOS7-1:2181,CentOS7-2:2181,CentOS7-3:2181</value>
</property>
<property>
<name>ha.zookeeper.session-timeout.ms</name>
<value>60000</value>
</property>
<!-- 故障检查时间 -->
<property>
<name>ha.failover-controller.cli-check.rpc-timeout.ms</name>
<value>60000</value>
</property>
<!-- ipc通讯超时时间 -->
<property>
<name>ipc.client.connect.timeout</name>
<value>20000</value>
</property>
<!-- 指定hadoop临时目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>file:/hadoop/tmp</value>
</property>
</configuration>
fs.defaultFS:指定hdfs的nameservice为ns1
hadoop.tmp.dir:指定hadoop临时目录
ha.zookeeper.quorum:指定zookeeper地址
4、配置hdfs-site.xml
Hadoop中的HDFS配置,主要配置备份方式,及NameNode、DataNode、NameSecondary存储地址。
$vi hdfs-site.xml
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!--指定hdfs的nameservice为cluster,需要和core-site.xml中的保持一致 -->
<property>
<name>dfs.nameservices</name>
<value>cluster</value>
</property>
<!-- cluster下面有两个NameNode,分别是nn1,nn2 -->
<property>
<name>dfs.ha.namenodes.cluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1、nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.cluster.nn1</name>
<value>CentOS7-1:9000</value>
</property>
<property>
<name>dfs.namenode.rpc-address.cluster.nn2</name>
<value>CentOS7-2:9000</value>
</property>
<!-- nn1、nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.cluster.nn1</name>
<value>CentOS7-1:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.cluster.nn2</name>
<value>CentOS7-2:50070</value>
</property>
<property>
<name>dfs.namenode.servicerpc-address.cluster.nn1</name>
<value>CentOS7-1:53310</value>
</property>
<property>
<name>dfs.namenode.servicerpc-address.cluster.nn2</name>
<value>CentOS7-2:53310</value>
</property>
<!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://CentOS7-3:8485;CentOS7-4:8485/cluster</value>
</property>
<!-- 指定JournalNode在本地磁盘存放数据的位置 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/hadoop/hdfs/journal/data</value>
</property>
<!-- 开启NameNode失败自动切换 -->
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<!-- 配置失败自动切换实现方式 -->
<property>
<name>dfs.client.failover.proxy.provider.cluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
</value>
</property>
<!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>
sshfence
shell(/bin/true)
</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<name>dfs.webhdfs.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
<property>
<name>dfs.image.transfer.bandwidthPerSec</name>
<value>1048576</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/hadoop/hdfs/name</value>
</property>
<property>
<name>dfs.datanode.name.dir</name>
<value>file:/hadoop/hdfs/data</value>
</property>
<property>
<name>dfs.namenode.checkpoint.dir</name>
<value>file:/hadoop/hdfs/namesecondary</value>
</property>
</configuration>
dfs.nameservices: 指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致
dfs.ha.namenodes.ns1:ns1下面有两个NameNode,分别是nn1,nn2
dfs.namenode.rpc-address.ns1.nn1: nn1的RPC通信地址
dfs.namenode.http-address.ns1.nn1: nn1的http通信地址
dfs.namenode.shared.edits.dir:指定NameNode的元数据在JournalNode上的存放位置
dfs.journalnode.edits.dir : 指定JournalNode在本地磁盘存放数据的位置
dfs.ha.automatic-failover.enabled: true是开启NameNode失败自动切换
dfs.client.failover.proxy.provider.ns1:配置失败自动切换实现方式
dfs.ha.fencing.ssh.private-key-files:使用sshfence隔离机制时需要ssh免登陆
5、配置mapred-site.xml
Hadoop的MapReduce框架配置,配置MapReduce框架名称
$vi mapred-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<!-- configure historyserver -->
<property>
<name>mapreduce.jobhistory.address</name>
<value>CentOS7-1:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>CentOS7-1:19888</value>
</property>
<property>
<name>mapred.job.reuse.jvm.num.tasks</name>
<value>-1</value>
</property>
<property>
<name>mapreduce.reduce.shuffle.parallelcopies</name>
<value>20</value>
</property>
</configuration>
6、配置yarn-site.xml
$vi yarn-site.xml
<?xml version="1.0"?>
<configuration>
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<property>
<name>yarn.resourcemanager.hostname</name>
<value>CentOS7-1</value>
</property>
</configuration>
7、配置slaves节点列表
对于分布式安装,该文件中需要配置从节点机器名。
$vi slaves
CentOS7-3
CentOS7-4
到此,整个Hadoop伪分布式安装完毕,接下来就可以格式HDFS文件系统,并启动Hadoop系统。(将以上这些配置文件同步到其他所有服务器)
启动集群
1、启动zookeeper集群
2、启动journal node(在CentOS7-3、CentOS7-4)
./sbin/hadoop-daemon.sh start journalnode
执行jps命令,可以查看到JournalNode的Java进程pid;
3、格式化CentOS7-1 :HDFS(namenode)第一次要格式化(这里直接复制会有问题,最好手动输入)
./bin/hdfs namenode –format
4、格式化zk(在CentOS7-1即可)(这里直接输入会有问题,最好手动输入)
./bin/hdfs zkfc –formatZK
格式成功后,在zookeeper中可以看到
[zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha
[cluster]
5、启动zkfc来监控NN状态(在CentOS7-1,CentOS7-2)
./sbin/hadoop-daemon.sh start zkfc
6、启动HDFS(namenode)(在CentOS7-1即可)
./sbin/start-dfs.sh
#把NameNode的数据同步到CentOS7-2上(在CentOS7-2上执行)
$ hdfs namenode –bootstrapStandby #启动mhadoop02上的namenode作为standby
./bin/hdfs zkfc –formatZK
$ sbin/hadoop-daemon.sh start namenode #在CentOS7-2启动namenode
7、启动YARN
在CentOS7-1上执行如下命令
启动YARN(MR)(在CentOS7-1执行)
./sbin/start-yarn.sh
8、CentOS7-1上启动 JobHistoryServer
执行: ./sbin/mr-jobhistory-daemon.sh start historyserver
测试HA
正常启动后CentOS7-1的namenode与CentOS7-2的namenode状态截图如下:
此时在CentOS7-1上执行如下命令关闭namenode
$ sbin/hadoop-daemon.sh stop namenode
再次查看CentOS7-2上的namenode,发现自动切换为active了。
此时,高可用Hadoop分布式框架就搭好了。
http://10.79.115.111:19888/ JobHistory
http://10.79.115.111:8088/ All Applications
spark-2.1.0-bin-hadoop2.7(在/opt目录下)安装配置:
CentOS7-1 |
CentOS7-2 |
CentOS7-3 |
CentOS7-4 |
Master |
|
Worker(s) |
Worker(s) |
在/etc/profile中加入如下变量:
export SCALA_HOME=/opt/scala-2.11.8
export PATH=$PATH:$SCALA_HOME/bin
export SPARK_HOME=/opt/spark-2.1.0-bin-hadoop2.7
export PATH="$SPARK_HOME/bin:$PATH"
source /etc/profile
1、首先安装scala-2.11.8 (在/opt目录下)
2、修改配置文件
vim conf/spark-env.sh
在末尾加上:
export SCALA_HOME=/opt/scala-2.11.8
export JAVA_HOME=/opt/jdk1.8
export SPARK_MASTER_IP=CentOS7-1
export SPARK_WORKER_MEMORY=1g
export HADOOP_CONF_DIR=/hadoop/hadoop-2.7.3/etc/hadoop
vim conf/slaves:
CentOS7-3
CentOS7-4
PS:配置文件修改完成后, 将/usr/local/spark文件夹拷贝到其他节点对应的位置, 并配置好环境变量。
3、spark集群启动, 在主节点(CentOS7-1)中执行:
./sbin/start-all.sh
spark启动后, 通过http://10.79.115.111:8080/可以查看spark当前的运行状态。
hbase-0.98.24-hadoop2(在/opt目录下)集群安装:
http://abloz.com/hbase/book.html(官方中文文档)
CentOS7-1 |
CentOS7-2 |
CentOS7-3 |
CentOS7-4 |
HMaster |
HMaster备份 |
HRegionServ. |
HRegionServer |
在/etc/profile中加入如下变量:
export HBASE_HOME=/opt/hbase-0.98.24-hadoop2
export PATH=$HBASE_HOME/bin:$PATH
source /etc/profile
1、配置hbase集群,要修改3个文件(首先zk集群已经安装好了)
vim hbase-env.sh
export JAVA_HOME=/opt/jdk1.8
export HBASE_MANAGES_ZK=false //告诉hbase使用外部的zk
vim hbase-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定hbase在HDFS上存储的路径 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://10.79.115.111:9000/hbase</value>
</property>
<!-- 指定hbase是分布式的 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 指定zk的地址,多个用“,”分割 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>CentOS7-1:2181,CentOS7-2:2181,CentOS7-3:2181</value>
</property>
</configuration>
vim regionservers
CentOS7-3
CentOS7-4
之后拷贝hbase到其他服务器
2、启动所有的hbase
在主节点上(CentOS7-1)运行:./start-hbase.sh
3、 通过浏览器访问hbase管理页面
4、为保证集群的可靠性,要启动多个HMaster
在CentOS7-2运行:./start-hbase.sh