需要的安装包:
注意:所有安装包均为 .tar.gz 格式
1、jdk压缩包 : jdk-8u162-linux-x64.tar.gz
2、zookeeper压缩包:zookeeper-3.4.6.tar.gz
3、hadoop压缩包:hadoop-2.7.3.tar.gz
4、Vmware安装包和CentOs镜像文件:
vm12
镜像: CentOS-6.8-x86_64-bin-DVD1.iso
开始搭建集群:
一.虚拟机准备
1、安装vm12,这里安装不进行介绍,自行百度安装
注意:安装之后可能无法正常使用,需要在dos界面打开虚拟化。
2、创建3个虚拟机,分别命名为master,slave1,slave2
之后就是设置主机名和用户名,用户名是普通用户名称,设置虚拟机登录密码
都设置后会自动进行安装,直到都安装完成,登录虚拟机就可以
注意:3台虚拟机都按照相同步骤进行操作,因为安装时间过长,建议3台机器一起安装
二、配置sudo
说明:配置sudo是为了可以很方便的使用root权限。
好处:配置sudo后可以不切换到root用户便可以使用root权限,防止频繁切换用户之后,导致某一些文件的用户权限不同
开始配置
1、切换用户到root : su root
2、编辑文件:vim /etc/sudoers
在root下面增加一行,当前我要给普通用户(lj)赋予sudo权限
修改后,保存退出
3、切换回普通用户(命令: exit ),尝试sudo是否成功
三、配置静态ip
说明:虚拟机需要配置景泰网络,防止每次使用时网络变化,集群中的节点都要互相访问,所以要保持节点网络不改变。
注意:当前使用的为NAT模式
开始配置静态ip:
1、首先需要配置windows下虚拟机使用的网卡,在设置找到网络设置,点击更改适配器选项
找到VMnet8这个选项卡,当前虚拟机net模式使用的是VMnet8这个网卡
右键查看属性,找到IPv4,点击IPv,之后点击属性
点击 使用下面IP地址 ,配置ip,子网掩码,默认网关和首选DNS服务器(DNS可以随意配置,具体原理我也不清楚)
2、配置虚拟机网络。进入到vm12,在编辑中找到虚拟网络编辑器
(1)首先点击更改设置,需要管理员权限才能配置网络。
(2)点击VMnet8,可以看到这里是NAT模式,我们虚拟机NAT模式使用的是此网卡,之后便可以对此网卡进行修改
(3)修改子网ip,此ip与windows下的子网ip前三段一致,子网掩码与windows下子网掩码一致。
(4)之后点击NAT设置,对网络进行修改
网关ip与windows下网关一致
3、修改虚拟机内网络设置
(1)Linux下查看IP: ifconfig
这里有2项,下面一项是lo(本地环回)可以不管,上面一项才是需要配置的。注意这里我的虚拟网卡是eth0,待会儿修改的也是eth0
(2)修改网络配置文件:首先找到对应目录 : cd /etc/sysconfig/network-scripts/
可以找到ifcfg-eth0的文件,这个就是需要修改的文件
(3)修改文件: 将划线部分改为static(静态),之后在后面新增方框里面的内容
这里ip前3段应该与网关一致,最后一段可自行设置
子网掩码,网关与VMnet8设置的保持一致
DNS1余网关ip一致。
(4)重启虚拟机网络服务:sudo /etc/init.d/networking restart (吐槽:重启后查询没起作用,所以需要重启,但是配置hostname也需要重启,所以不急)
(5)修改另外两台虚拟机网络
4、修改hostname
在这里修改主机名是因为重启之后主机名才生效,所以在这里配置主机名
编辑文件: sudo vim /etc/sysconfig/network
三台虚拟机都需要修改
5、重启虚拟机,重启后检查
1、网络是否变成了配置的网络
2、检查hostname是否修改,命令:hostname
四、配置ssh免密登录
说明:集群各节点之间交互会使用到ssh,所以需要各节点之间免密登录
注意:此配置必须进行配置
这里我已经配置过了,所以具体操作可以查看这篇文章:https://www.jb51.net/article/168598.htm
文章中配置master的ssh后要试验登录master,此时要是ssh别的节点会发现仍然需要密码。这是因为master有slave1和slave2的公钥,而slave1和slave2没有master的公钥
所以不能免密登录slave1和slave2。文章中的配置都完成之后再进行测试,不要急(ps:我之前着急测试,发现ssh别的节点需要密码,重新配置了一遍。。。。)
五、安装jdk和搭建zookeeper集群
说明:zookeeper为了使集群主备namenode之间可以自动切换,防止集群NameNode故障引起集群故障
1、jdk安装:(简单说明,如有疑问请自行搜索)
(1)解压: tar -zxvf jdk-8u162-linux-x64.tar.gz
解压后修改文件夹名称为 jdk
(2)配置环境变量:sudo vim /etc/profile (此处配置的是系统变量)
在最后一行增加:
export JAVA_HOME=/home/lj/cdh/jdk
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$JAVA_HOME/bin:$PATH
(3)刷新配置:source /etc/profile
(4)检验:
java -version
javac
2、zookeeper安装:
1、解压: tar -zxvf zookeeper-3.4.6.tar.gz
解压后修改文件夹名称为 zookeeper
2、创建文件夹:
(1)在zookeeper下创建tmp文件夹(与bin文件夹同级)
(2)在tmp文件夹中创建log文件夹
(3)在tmp文件夹下创建myid文件(必须名称为myid)
3、修改conf下文件
cd zookeeper/conf
复制zoo_sample.cfg为zoo.cfg 。命令: cp zoo_sample.cfg zoo.cfg
修改zoo.cfg文件: vim zoo.cfg
其中:dataDir为数据存储位置
dataLogDir为zookeeper位置文件路径
在最后新增3行,2888是节点之间通讯端口,3888是节点之间选举端口。新增内容如下
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
4、将zookeeper文件夹发送至其余节点上:
scp ./zookeeper lj@slave1:/home/lj/cdh/
scp ./zookeeper lj@slave2:/home/lj/cdh/
5、修改各节点zookeeper文件夹里的myid文件
vim myid
在master的myid中输入1,之后保存
在slave1的myid中输入2,之后保存
在slave2的myid中输入3,之后保存
这里的myid为zookeeper节点的编号,在启动时会用来进行节点选举。
注意:因为我所有的节点的目录结构完全一致,所以zoo.cfg文件中的dataDir和dataLogDir都一样不用更改。若目录结构不一致则需要更改
6、启动zookeeper
启动脚本在bin文件夹下,每个节点都要启动
启动命令为: zookeeper/bin/zkServer.sh start
启动之后使用jps查看进程
7、登录zookeeper集群
登录测试集群是否正常,登录脚本在bin目录下
这时候zookeeper集群正常,使用quit退出登录
六、安装Hadoop搭建集群
此时准备工作都已经结束,都正常之后便可建立集群
1、解压: tar -zxvf hadoop-2.7.3.tar.gz
修改文件名为 hadoop
2、配置环境变量: sudo vim /etc/profile
新增以下内容:
export HADOOP_HOME=/home/lj/cdh/hadoop
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native
这条之前jdk配置时已经增加,所以这里进行修改
export PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
修改完成之后刷新配置文件: source /etc/profile
检查hadoop版本: hadoop version
3、修改配置文件:
首先进入到hadoop/etc/hadoop 文件夹下 : cd hadoop/etc/hadoop
需要修改以下文件:
core-site.xml | hdfs-site.xml | yarn-site.xml | mapred-site.xml |
hadoop-env.sh | yarn-env.sh | slaves | |
(1) 修改core-site.xml,内容如下
<!--指定hdfs连接地址,集群模式(高可用)-->
<property>
<name>fs.defaultFS</name>
<value>hdfs://cluster</value>
</property>
<!-- 指定ZooKeeper集群的地址和端口。注意,数量一定是奇数,且不少于三个节点-->
<property>
<name>ha.zookeeper.quorum</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
(2)修改hdfs-site.xml
<!--指定HDFS副本的数量,不能超过机器节点数-->
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<!-- 为namenode集群定义一个services name -->
<property>
<name>dfs.nameservices</name>
<value>cluster</value>
</property>
<!-- nameservice 包含哪些namenode,为各个namenode起名 -->
<property>
<name>dfs.ha.namenodes.cluster</name>
<value>nn01,nn02</value>
</property>
<!-- 名为nn01的namenode的rpc地址和端口号,rpc用来和datanode通讯 -->
<property>
<name>dfs.namenode.rpc-address.cluster.nn01</name>
<value>master:9000</value>
</property>
<!--名为nn01的namenode的http地址和端口号,用来和web客户端通讯 -->
<property>
<name>dfs.namenode.http-address.cluster.nn01</name>
<value>master:50070</value>
</property>
<!-- 名为nn02的namenode的rpc地址和端口号,rpc用来和datanode通讯 -->
<property>
<name>dfs.namenode.rpc-address.cluster.nn02</name>
<value>slave1:9000</value>
</property>
<!--名为nn02的namenode的http地址和端口号,用来和web客户端通讯 -->
<property>
<name>dfs.namenode.http-address.cluster.nn02</name>
<value>slave1:50070</value>
</property>
<!-- namenode间用于共享编辑日志的journal节点列表 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://master:8485;slave1:8485;slave2:8485/cluster</value>
</property>
<!-- journalnode 上用于存放edits日志的目录 -->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/home/lj/cdh/hadoop-2.7.3/tmp/journal</value>
</property>
<!-- 指定该集群出现故障时,是否自动切换到另一台namenode -->
<property>
<name>dfs.ha.automatic-failover.enabled.cluster</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>
<!-- 一旦需要NameNode切换,使用ssh方式进行操作 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence(lj:9431)</value>
</property>
<!-- 如果使用ssh进行故障切换,使用ssh通信时用的密钥存储的位置 -->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/lj/.ssh/id_rsa</value>
</property>
<!-- connect-timeout超时时间 -->
<property>
<name>dfs.ha.fencing.ssh.connect-timeout</name>
<value>30000</value>
</property>
<property>
<name>dfs.name.dir</name>
<value>/home/lj/cdh/hadoop-2.7.3/dfs/name</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/home/lj/cdh/hadoop-2.7.3/dfs/data</value>
</property>
(3)修改yarn-site.xml
<!-- 启用Resource Manager HA高可用性 -->
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<!-- 指定resourcemanager的名字 -->
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>yrc</value>
</property>
<!-- 使用了2个resourcemanager,分别指定Resourcemanager的地址 -->
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<!-- 指定rm1的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>master</value>
</property>
<!-- 指定rm2的地址 -->
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>slave1</value>
</property>
<!-- 指定zookeeper集群机器 -->
<property>
<name>yarn.resourcemanager.zk-address</name>
<value>master:2181,slave1:2181,slave2:2181</value>
</property>
<!-- NodeManager上运行的附属服务,默认是mapreduce_shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
(4)修改mapred-site.xml,注意 该文件不存在,需要手动创建,
cp mapred-site.xml.template mapred-site.xml
修改内容如下:
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
<description>指定mapreduce使用yarn框架</description>
</property>
(5) 修改slaves文件,这里指定的是datanode节点,内容如下:
master
slave1
slave2
(6)修改hadoop-env.sh文件,指定jdk的地址
(7)修改yarn-env.sh文件,指定jdk的地址
4、将文件发送到其余节点
scp ./hadoop lj@slave1:/home/lj/cdh/
scp ./hadoop lj@slave2:/home/lj/cdh/
5、配置其余节点环境变量,与步骤2一致。
6、启动hadoop
注意:第一次启动需要以下内容顺序执行
(1)启动journalnode,三台机器都要这一步操作(仅第一次启动hadoop时,需要这一步操作,之后不再需要手动启动journalnode)
cd /usr/local/hadoop/sbin
sh hadoop-daemon.sh start journalnode
(2) 在master上执行格式化操作,格式化namenode和zkfc (在倒数几行可以看到formatted 即为成功)
hdfs namenode -format
hdfs zkfc -formatZK
(3)在master上启动namenode (在倒数几行可以看到formatted 即为成功)
hadoop-daemon.sh start namenode
(4)namenode主从信息同步,在slave1节点上执行同步命令 (无报错)
hdfs namenode -bootstrapStandby
上述步骤完成后,接下来我们就可以启动hadoop了
启动命令
master节点
start-all.sh
#启动ZookeeperFailoverController
hadoop-daemon.sh start zkfc
slave1节点
yarn-daemon.sh start resourcemanager
hadoop-daemon.sh start zkfc
停止命令
#master
/usr/local/hadoop/sbin/stop-all.sh
/usr/local/hadoop/sbin/hadoop-daemon.sh stop zkfc
#slave1
/usr/local/hadoop/sbin/yarn-daemon.sh stop resourcemanager
/usr/local/hadoop/sbin/hadoop-daemon.sh stop zkfc
7、查看进程 jps
#master
26849 NodeManager
2770 QuorumPeerMain
27331 DFSZKFailoverController
26308 DataNode
26537 JournalNode
26154 NameNode
26733 ResourceManager
#slave1
7489 JournalNode
7281 NameNode
627 QuorumPeerMain
8233 DFSZKFailoverController
8123 ResourceManager
7389 DataNode
7631 NodeManager
#slave2
21762 QuorumPeerMain
29476 NodeManager
29271 DataNode
29370 JournalNode
8、通过页面检验
打开火狐浏览器,输入master:50070 和slave1:50070,可以看到一个为active,一个为standby
之后查看master:8088和slave1:8088,可以看到yarn页面
此时便成功了。
9、测试高可用
这里需要kill掉活跃的namenode,之后查看页面是否转换成功。
我这里转换没有成功,可以参照此文章: