CentOS 6.5环境下搭建HDFS高可用完全分布式
高可用完全分布式
运行原理
在搭建完全分布式时可以发现SecndaryNameNode并不能有效的减少NameNode的负载,NameNode一旦出现问题整个集群就会瘫痪。所以才有了进一步的高可用(HA)完全分布式。
首先需要两个NameNode节点,一般一个NameNode处于Active状态,另一个处于StandBy状态。当一个NameNode出现问题时,可以切换到另一个NameNode继续运行集群。
但是如何判断NameNode是否出现问题并进行状态切换呢?这就需要一个新的集群:Zookeeper,这个集群的作用就是配置好后可以生成多个ZKFC进程用于分别监控NameNode,当处于Active状态的NameNode01出现问题时,ZKFC01就会向Zookeeper集群汇报,Zookeeper集群就会令ZKFC01将处于StandBy状态的NameNode02切换为Active状态。
那么两个NameNode又该如何实现数据同步呢?如果元数据不一致就容易出现脑裂。这里又引入了Hadoop中的JournalNode集群。一般为Active状态的NameNode向JournalNode写入元数据,StandBy状态的NameNode从JournalNode读出元数据,从而实现数据同步。JournalNode节点的个数一般都为奇数台,且当超过半数的节点写入成功时就能完成数据同步,否则将会出现脑裂。
原理图如图所示:
节点设计
搭建准备工作
准备工作
首先需要准备4台CentOS6.5虚拟机,并且将网络与JDK配置完全,如需配置JDK详见 分布式存储:HDFS.。
注意:在安装JDK时需要先确认一下系统中是否自带JDK,控制台输入java -version如果显示了JDK版本,最好先卸载后安装并配置自己下载的JDK
之后我们需要对这四台虚拟机做出合理设计,如我的虚拟机主机名分别为Lucian-01到Lucian-04。Lucian-01主要为NameNode,Lucian-02为SecondaryNameNode与DataNode,Lucian-03和04都为DataNode。其中各个组成的作用已在之前做出总结,这里就不重复了。
分工好后需要进一步配置hosts:
命令行:vi /etc/hosts/
文件打开后在文件结尾处分别添加上四台虚拟机对应的IP地址与主机名。
注意:四台虚拟机都需要修改hosts文件
配置免密登录
配置免密登录之前需要先弄清楚几台虚拟机之间的连接关系,即NameNode连接其余所有节点。所以本次将会用Lucian-01连接自身与其余节点。
首先在每个节点的命令行中输入:ssh-keygen -t rsa,这样就会在每个节点下的根目录中的 .ssh目录中生成一个公钥与私钥。
最后在NameNode节点(Lucian-01)中运行:
语句意为将公钥写入自身与其余节点中,运行过后,正确如图:
配置ZooKeeper文件
1.下载并解压ZooKeeper.tar.gz下载地址.
2.将conf目录下的zoo_sample.cfg的名称改为zoo.cfg,命令行:mv zoo_sample.cfg zoo.cfg
3.修改zoo.cfg,dataDir修改到任意目录,最后根据图片和主机名在文件最后添加一下文字。
4.在Lucian-02、03、04节点,dataDir中声明的目录中,各自都创建一个myid的文件,各自的数值为添加语句中对应数值,如Lucian-02的myid中数值只添1,一次类推。
5.因为之前的操作都是在Lucian-02上进行的,所以需要运行一下命令将文件远程发送给03、04节点。
scp -r zookeeper-3.4.10 root@Lucian-03:/opt/software/
scp -r zookeeper-3.4.10 root@Lucian-04:/opt/software/
注意:需要根据主机名、自身文件路径与目标路径对语句进行简单调整
6.在Lucian-02、03、04节点ZooKeeper的bin目录下依次启动Zookeeper服务,命令行:./zkServer.sh start
配置Hadoop文件
1.下载并解压Hadoop文件。下载地址.
2.修改Hadoop/etc路径下的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>node01:8020</value>
</property>
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node02:8020</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node01:50070</value>
</property>
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node02:50070</value>
</property>
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node01:8485;node02:8485;node03: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>
注意:如果主机名不一致时注意修改其中的代码
3.将以下数据添加到hadoop/etc中的core-site.xml中的<configuration>
标签中
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<property>
<name>ha.zookeeper.quorum</name>
<value>Lucian-02:2181,Lucian-03:2181,Lucian-04:2181</value>
</property>
注意:如果主机名不一致时注意修改其中的代码
4.将目录下的slaves中添加DataNode节点的主机名
注意:每个主机名之间必须换行,也不要有多余的空格
5.因为之前的操作都是在Lucian-01上进行的,所以需要运行一下命令将文件远程发送给其余节点。
scp -r hadoop-2.6.5 root@Lucian-02:/opt/software/
scp -r hadoop-2.6.5 root@Lucian-03:/opt/software/
scp -r hadoop-2.6.5 root@Lucian-04:/opt/software/
注意:需要根据主机名、自身文件路径与目标路径对语句进行简单调整
NameNode初始化与服务启动
1.分别在01、02、03节点启动JournalNode集群,命令行:hadoop-daemon.sh start journalnode
2.在任意一台NameNode初始化NameNode并启动NameNode端口,命令行:hdfs namenode -format 、hadoop-daemon.sh start namenode
3.在另一台NameNode并启动NameNodeStandby,命令行:hdfs namenode -bootstrapStandby
注意:该命令执行完毕在该节点控制台输入jps并不会显示新的端口
4.在Lucian-01初始化zooKeeper,命令行:hdfs zkfc -formatZK
注意:该命令在执行时zookeeper集群必选处于启动状态
5.在Lucian-01上关闭所有Hadoop端口,命令行:stop-dfs.sh
6.在Lucian-01上启动Hadoop集群,命令行:start-dfs.sh
7.在浏览器中输入Lucian-01:50070可以查看Hadoop集群是否启动成功,在各个节点下控制台输入jps可以查看对应的端口是否启动成功。
8.在浏览器中查看那个NameNode处于Active状态,在该节点下,使用jps查看NameNode端口号,并用kill -9 端口号杀死NameNode进程,并在浏览器中切换到另一个原先为Standby的NameNode节点查看是否切换为Active状态。
注意:NameNode故障时可以使用hadoop-daemon.sh start namenode将NameNode开启
搭建客户端Client
1.准备一台新的虚拟机为客户端Client,配置好客户端Client上的JDK环境,配置好五台虚拟机的/etc/hosts文件以实现虚拟机之间的互通;
2.将节点01上的Hadoop文件远程发送给客户端Client,命令行:scp -R hadoop-2.6.5 root@Client:/opt/software/;
3.在/etc/profile文件中添加Hadoop环境,添加语句:export path=$PATH:/opt/software/hadoop-2.6.5/bin,之后在客户端Client中即可通过控制台输入hdfs命令行正常操作HDFS;
Eclipse配置Map/Reduce插件
配置Map/Reduce插件
注意:一下操作不是在虚拟机中实现的,是在安装了虚拟机的Windows主机中实现的
1.修改主机中的/windows/drivers/etc/hosts文件,在文件最后添加虚拟机的ip地址与对应主机名。
2.下载hadoop-eclipse-plugin-2.6.0.jar下载地址.;
3.将该文件移动到eclipse根目录中的dropins目录下,如没有该目录需要自行创建;
4.开启eclipse,点击右上角的:
在弹出的窗口选择:
之后在下方出现的Map/Reduce Locations中右键选择新建Hadoop Location,按照如下数据进行填写:
点击结束后点击右上角Map/Reduce视图时能够在左侧栏目中看见文件则说明配置成功
;
配置Map/Reduce插件可能遇到的问题
1.权限问题,问题原因为操作用户为windows主机名,该用户并不具有操作文件的权限。
解决方法:1.修改HDFS中文件的权限为777;
解决方法:2.添加windows的环境变量,变量名为HADOOP_USER_NAME,变量值为root。