HDFS完全分布式高可用集群一般至少有4个节点,平时学习过程中我们一般会通过搭建四个虚拟机来实现。
但如果一台机子同时启动四台虚拟机外加以后需要用到的eclipse和tomcat,其负载之大可以想象,所以我们可以通过用另一台主机A去连接主机B上的虚拟机中的HDFS从而加快我们的开发速度。
1.桥接模式
vmware workstation中有三种虚拟机网络的连接方式,分别为桥连,NAT和主机模式
1)桥接
桥接网络是指本地物理网卡和虚拟网卡通过VMnet0虚拟交换机进行桥接,物理网卡和虚拟网卡在拓扑图上处于同等地位,那么物理网卡和虚拟网卡就相当于处于同一个网段,虚拟交换机就相当于一台现实网络中的交换机,所以两个网卡的IP地址也要设置为同一网段
在这种模式下,虚拟机可以被宿主机以及同一局域网中的任何计算机访问
2)NAT
相较于桥接,NAT模式也可以自由访问外网,但是他只能和宿主机之间相互通信,局域网中的其他计算机无法访问到他
3)主机模式
最封闭的模式,与外界完全隔绝,无法访问外网以及被外网访问,只能和宿主机之间相互通信
对比这三种模式,我们可以得出结论当需要访问的虚拟机大于1台时,我们就只能通过桥接模式去访问虚拟机(在一台虚拟机的情况下可以通过nat的端口转发功能,但超过一台似乎就无法实现)
将所有节点的网络连接方式设置为桥连
2.配置ip
###1)首先关闭防火墙!关闭防火墙!关闭防火墙!
hdfs集群的很多错误都是因为防火墙未关闭导致,所以首先我们关闭所有防火墙
在所有节点上运行
service iptables stop
chkconfig iptables off
接着关闭虚拟机的selinux
修改/etc/selinux/config 文件将SELINUX=enforcing改为SELINUX=disabled重启机器即可
然后修改网络配置文件
vi /etc/sysconfig/network
添加一行
GATEWAY=(宿主机网关)
vi /etc/sysconfig/network-scripts/ifcfg-eth0
ONBOOT=yes
BOOTPROTO=static
下面是宿主机ip请对应更改
ip查看方式
win+r
输入cmd
输入ipconfig/all
附上vmware物理网卡地址
最后重启网络服务
service network restart
这样应该就可以访问外网了
在虚拟机打开浏览器进行测试
最后在查看是否能和局域网中的其他机器相互ping通
在虚拟机输入ping 172.17.36.49(同一局域网中的其他主机的ip)
在其他主机的cmd上输入
ping 172.17.36.223(虚拟机的ip)
测试成功,请在其余三台虚拟机上也完成以上配置
完成后接下来我们开始搭建hadoop高可用完全分布式集群
3.HDFS高可用完全分布式进群搭建
准备工作
首先需要准备4台CentOS6.5虚拟机
在搭建之前我们首先设定好各个虚拟机的角色
分工好后需要进一步配置hosts:
命令行:vi /etc/hosts/
文件打开后在文件结尾处分别添加上四台虚拟机对应的IP地址与主机名。
**注意:四台虚拟机都需要修改hosts文件且均为桥接修改后的ip
配置免密登录
配置免密登录之前需要先弄清楚几台虚拟机之间的连接关系,即NameNode连接其余所有节点,以及namenode02和namenode01之间的连接。所以本次将会用hadoop01连接自身与其余节点以及hadoop02连接hadoop01。
首先在每个节点的命令行中输入:ssh-keygen -t rsa,这样就会在每个节点下的根目录中的 .ssh目录中生成一个公钥与私钥。
最后在NameNode节点(Hadoop01)中运行:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@hadoop01
ssh-copy-id -i ~/.ssh/id_rsa.pub root@hadoop02
ssh-copy-id -i ~/.ssh/id_rsa.pub root@hadoop03
ssh-copy-id -i ~/.ssh/id_rsa.pub root@hadoop04
在NameNode节点(Haddop02)中运行
ssh-copy-id -i ~/.ssh/id_rsa.pub root@hadoop01
配置ZooKeeper文件
1.下载并解压ZooKeeper.tar.gz下载地址.
由于我们只需要在hadoop02、03、04下配置zookeeper集群,所以我们将压缩包下载并解压至hadoop02节点
2.将conf目录下的zoo_sample.cfg的名称改为zoo.cfg,命令行:mv zoo_sample.cfg zoo.cfg
3.修改zoo.cfg,dataDir修改到任意目录,最后根据图片和主机名在文件最后添加一下文字。
4.在hadoop02、03、04节点,dataDir中声明的目录中(/var/vickey/zookeeper),各自都创建一个myid的文件,各自的数值为添加语句中对应数值,如hadoop02的myid中数值为1,依次类推。
5.配置完成后将配置好的文件包发给hadoop03和hadoop04
scr -r zookeeper-3.4.10 root@hadoop03:`pwd`
scr -r zookeeper-3.4.10 root@hadoop04:`pwd`
注意:需要根据主机名、自身文件路径与目标路径对语句进行简单调整
6.在hadoop02、03、04节点ZooKeeper的bin目录下依次启动Zookeeper服务,命令行:./zkServer.sh start
配置hadoop文件
修改hdfs-site.xml文件
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>hadoop01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>hadoop02:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>hadoop01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>hadoop02:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://hadoop01:8485;hadoop02:8485;hadoop03:8485/mycluster</value>
</property>
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/var/sxt/hadoop/ha/jn</value>
</property>
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/root/.ssh/id_rsa</value>
</property>
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
修改core-site.xml文件
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>hadoop02:2181,hadoop03: 2181,hadoop04:2181</value>
</property>
因为我们的虚拟机网络采用桥接模式,所以各个节点之间相互的通信速度会比较慢,hadoop默认的连接时间较短,初始化时如果连接超时会报错,所以我们需要额外追加新的配置来延长连接时间
<property>
<name>ipc.client.connect.max.retries</name>
<value>100</value>
</property>
<property>
<name>ipc.client.connect.retry.interval</name>
<value>10000</value>
</property>
将以上代码也写入core-site.xml
修改slaves文件
hadoop02
hadoop03
hadoop04
配置完成,将配置好的hadoop文件夹发送给其余三个节点
scp -r hadoop-2.6.5 root@hadoop02:`pwd`
scp -r hadoop-2.6.5 root@hadoop03:`pwd`
scp -r hadoop-2.6.5 root@hadoop04:`pwd`
启动集群
1)在hadoop01、02、03都执行以下命令
hadoop-daemon.sh start journalnode
2)随机选取一台NameNode节点运行
hdfs namenode -format
hadoop-daemon.sh start namenode
3)在另一台NameNode节点运行
hdfs namenode -bootstrapStandby
4)初始化ZKFC
hdfs zkfc -formatZK
5)关闭所有节点的hdfs进程
stop-dfs.sh
6)启动hdfs
start-dfs.sh
启动完成后,我们先通过jps查看所有进程是否启动
四个节点应该启动的进程对应如下
接着我们可以去浏览器查看集群运行情况
因为本次搭建我们采用的网络连接方式是桥接模式
所以我们可以直接在同一局域网的其他主机上的本地浏览器上查看
为了方便我们在以后的开发中更好的连接集群,我们可以将这四个节点和对应的ip写入本机的hosts文件
win10系统下hosts文件的位置为
C:\Windows\System32\drivers\etc
在hosts文件中加入四条记录
保存后配置完成