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 -formathadoop-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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值