Hadoop2.5.2 HA高可靠性集群搭建(Hadoop+Zookeeper)

来源:互联网 发布:华硕驱动软件下载 编辑:程序博客网 时间:2024/06/02 05:30

Hadoop2.*解决了hadoop1.*里面的单点问题,在hadoop2中新的NameNode不再是只有一个,可以有多个每一个都有相同的职能。一个是active状态的,其他是standby状态的。集群运行时,只有active状态的NameNode是正常工作的,standby状态的NameNode是处于待命状态的,时刻同步active状态NameNode的数据。一旦active状态的NameNode不能工作,通过手工或者自动切换,standby状态的NameNode就可以转变为active状态的,就可以继续工作了。这就是高可靠。Hadoop2.0中,2个NameNode的数据其实是实时共享的。新HDFS采用了一种共享机制,Quorum Journal Node(JournalNode)集群或者Nnetwork File System(NFS)进行共享。NFS是操作系统层面的,JournalNode是hadoop层面的,我们这里使用JournalNode集群进行数据共享(这也是主流的做法)。如下图所示,便是JournalNode的架构图。


好了废话不多说,开撸。

1.机器分布以及功能的分布


   1.vmare虚拟机

   2.xshell or secureCRT

   3.JDK1.6 或者 1.7 -------不建议1.8

   4.centos的iso

   5.安装ssh

   6.hadoop2.5.2    

          download:http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.5.2/hadoop-2.5.2.tar.gz

          download:http://hadoop.apache.org/releases.html#19+November%2C+2014%3A+Release+2.5.2+available

   7.zookeeper-3.4.6.tar

          download:http://www.apache.org/dyn/closer.cgi/zookeeper/

      注意:apache提供的hadoop-2.5.2的安装包是在32位操作系统编译的,因为hadoop依赖一些C++的本地库,所以如果在64位的操作上安装hadoop-2.5.2就需要重新在64操作系统上重新编译(建议第一次安装用32位的系统)。

     编译教程:http://blog.csdn.net/ggz631047367/article/details/42460589

     64位hadoop2.5.2下载地址:http://pan.baidu.com/s/1kTnIeLT

现在4台虚拟机已经安装好了假设。搭建环境真正的开始 master,node1,node2,node3


一。

0.如果你其中3台虚拟机用的VMware克隆,需要保证ip能够自动获取,做以下修改。其中克隆的主机需要修改

克隆之后的操作系统需要重新分配MAC地址

 a、vi /etc/sysconfig/network-scripts/ifcfg-eth0   (网卡信息)

 将该文件中删除两行:UUID和物理地址

 b、删除rm -rf /etc/udev/rules.d/70-persistent-net.rules 文件

 c、重启  init 6 或reboot


1.修改linux主机名

修改每台主机的hostname
vim /etc/sysconfig/network

2.配置hosts文件

我的命名是master、node1、node2、 node3

3.修改IP(可选)改成固定ip,4台主机全部修改

vi /etc/sysconfig/network-scripts/ifcfg-eth0

注意DEVICE="eth2" 这个属性,用ifconfig查看ip信息可以看到
说明网卡用的是eth2这个 接下来就的修改HWADDR这个属性了 vi/etc/udev/rules.d/70-persistent-net.rules 查看你的mac地址列表 找到Name="eth2" 这个,选择 ATTR{address}=="00:0c:29:49:e8:29" 这个mac地址 修改</span></span>
vi /etc/sysconfig/network-scripts/ifcfg-eth0
的HWADDR这个属性=00:0c:29:49:e8:29 ok,mac地址修改好虚拟就可以用了,其他的几台机器的操作一样

4台机器配置完之后分别ping一下几台机器的host,如果ping的通的话就ok了

4.

关闭防火墙,重启还是自动重启service iptables stop永久关闭,建议永久关闭chkconfig iptables off查看防火墙关闭状态service iptables status 
5.免密设置

(1).

执行:ssh-keygen -t rsa

cd  /root/.ssh 进入到 .ssh目录下

这时.ssh目录下会生成私钥和公钥的键值对id_rsa,id_rsa.pub

再其他服务器上执行同样的命令生成文件

(2).将所有服务器上的公钥合并到master 机器上的一个文件authorized_keys中

每台机器执行 cat id_rsa.pub >> authorized_keys

在master机器上执行

ssh root@node1 cat /root/.ssh/id_rsa.pub >> authorized_keys

ssh root@node2  cat /root/.ssh/id_rsa.pub >> authorized_keys

ssh root@node3  cat /root/.ssh/id_rsa.pub >> authorized_keys

(3).查看authorized_keys里面有多个server的公钥信息,如果你有多个server同样往里面加就好了


(4)

将authorized_keys、known_hosts分别复制到其他服务器的.ssh目录下

先进入到

scp authorized_keys root@node1:/root/.ssh/

scp known_hosts root@node1:/root/.ssh/

scp authorized_keys root@node2:/root/.ssh/

scp known_hosts root@node2:/root/.ssh/

scp authorized_keys root@node3:/root/.ssh/

scp known_hosts root@node3:/root/.ssh/

这时候再ssh登录,这时候就不用再输入密码啦。

二、安装JDK 配置环境变量之类的就不多说了,自己百度去吧

接下来开始配置zookeeper和hadoop

1.配置zookeeper

root用户下,在/opt/目录下新建一个zookeeper文件夹,用于存放zookeeper文件

mkdir  /opt/zookeeper

将下载好的zookeeper-3.4.6文件copy到这个目录下解压

tar -zxvf zookeeper-3.4.6.tar.gz
2.在master上配置zookeeper信息
 master进行:    cd /opt/zookeeper/zookeeper-3.4.6/conf    cp zoo_sample.cfg zoo.cfg    vim zoo.cfg   修改:dataDir=/opt/zookeeper/zookeeper   在最后添加:    server.1=master:2888:3888    server.2=node2:2888:3888    server.3=node3:2888:3888   然后创建一个tmp文件夹    mkdir /opt/zookeeper/zookeeper   再创建一个空文件    touch /opt/zookeeper/zookeeper/myid   最后向该文件写入ID    echo 1 > /opt/zookeeper/zookeeper/myid3、将配置好的zookeeper拷贝到node1、node2
      scp -r /opt/zookeeper root@node1:/opt    
      scp -r /opt/zookeeper root@node2:/opt
 注意:修改node2、node2对应/opt/zookeeper/zookeeper/myid内容       node1:            echo 2 > /opt/zookeeper/zookeeper/myid       node2:            echo 3> /opt/zookeeper/zookeeper/myid4.配置zookeeper的环境变量vi /etc/profile/最后一行加入export ZOOKEEPER_HOME=/opt/zookeeper/zookeeper-3.4.6export PATH=$PATH:$JAVA_HOME/bin:$ZOOKEEPER_HOME/bin保存退出同样将环境变量copy到其他两台机器上scp -r /etc/profile root@node1:/etc/profile
scp -r /etc/profile root@node2:/etc/profileok 到此zookeeper配置完毕,测试一下三台机器上分别执行此命令命令:cd /opt/zookeeper/zookeeper-3.4.6/bin      ./zkServer.sh start     或者 直接 zkServer.sh start[root@master zookeeper]# zkServer.sh startJMX enabled by defaultUsing config: /opt/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfgStarting zookeeper ... STARTED[root@master zookeeper]# 这表示zookeeper 已经启动,接下来在三台机器上分别查看一下zookeeper的启动状态master机器上[root@master zookeeper]# zkServer.sh statusJMX enabled by defaultUsing config: /opt/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfgMode: follower[root@master zookeeper]# node1机器上[root@node1 bin]# zkServer.sh statusJMX enabled by defaultUsing config: /opt/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfgMode: leader[root@node1 bin]# node2机器上
[root@node2 node2]# zkServer.sh status
JMX enabled by default
Using config: /opt/zookeeper/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: follower
[root@node2 node2]#

这说明zookeeper已经启动成功,两个follower,一个leader

三,配置Hadoop

切换到root用户下


命令:su root在opt下新建hadoop-2.5.2文件夹命令:mkdir /opt/hadoop-2.5.2将下载好的hadoop-2.5.2.tar.gz 放到这个文件夹目录下,并解压命令:tar -zxvf hadoop-2.5.2 修改hadoop的环境变量vim /etc/profile修改:export JAVA_HOME=/usr/java/jdk1.7.0_79export HADOOP_HOME=/opt/hadoop-2.5.2/hadoop-2.5.2export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$ZOOKEEPER_HOME/bin修改hadoop的配置文件命令:cd /opt/hadoop-2.5.2/hadoop-2.5.2/etc/hadoop

1.修改core-site.xml

命令:vi core-site.xml

<configuration> <!-- 指定hdfs的nameservice为ns --> <property>          <name>fs.defaultFS</name>          <value>hdfs://mycluster</value>     </property> <!--指定hadoop数据临时存放目录--> <property>      <name>hadoop.tmp.dir</name>      <value>/opt/hadoop</value> </property>     <!--指定zookeeper地址--> <property>      <name>ha.zookeeper.quorum</name>      <value>master:2181,node1:2181,node2:2181</value> </property> </configuration>


2.修改hdfs-site.xml

<configuration><!--指定hdfs的nameservice为mycluster,需要和core-site.xml中的保持一致 --> <property>   <name>dfs.nameservices</name>   <value>mycluster</value></property><!-- mycluster下面有两个NameNode,分别是master,node1 --><property>  <name>dfs.ha.namenodes.mycluster</name>  <value>master,node1</value></property><!-- master的RPC通信地址 --><property>  <name>dfs.namenode.rpc-address.mycluster.master</name>  <value>master:8020</value></property><!-- node1的RPC通信地址 --><property>  <name>dfs.namenode.rpc-address.mycluster.node1</name>  <value>node1:8020</value></property> <!-- master的http通信地址 --><property>  <name>dfs.namenode.http-address.mycluster.master</name>  <value>master:50070</value></property> <!-- master的http通信地址 --><property>  <name>dfs.namenode.http-address.mycluster.node1</name>  <value>node1:50070</value></property><!--指定NameNode的元数据在JournalNode上的存放位置--><property>  <name>dfs.namenode.shared.edits.dir</name>  <value>qjournal://node1:8485;node2:8485;node3:8485/mycluster</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><!-- 使用隔离机制时需要ssh免登陆 --><property>  <name>dfs.ha.fencing.ssh.private-key-files</name>  <value>/root/.ssh/id_rsa</value></property><!-- 指定JournalNode在本地磁盘存放数据的位置 --><property>  <name>dfs.journalnode.edits.dir</name>  <value>/opt/journalnode/data</value></property><!--开启NameNode故障自动切换-->                                                               -> <property>   <name>dfs.ha.automatic-failover.enabled</name>   <value>true</value></property></configuration>

</pre><span style="font-size:14px;"><span style="color:#0000ff;"></span></span>

3.修改mapred-site.xml

<configuration>    <!-- 指定mr框架为yarn方式 --><property>    <name>mapreduce.framework.name</name>    <value>yarn</value></property></configuration>

4.修改yarn-site.xml

<configuration><!-- Site specific YARN configuration properties --><!-- 指定resourcemanager地址 --><property>    <name>yarn.resourcemanager.hostname</name>    <value>master</value></property><!-- 指定nodemanager启动时加载server的方式为shuffle server --><property>    <name>yarn.nodemanager.aux-services</name>    <value>mapreduce_shuffle</value></property></configuration>

5.修改slaves
node1node2node3

6.修改修改hadoop-env.sh

#export JAVA_HOME=${JAVA_HOME} --原来

export JAVA_HOME=/usr/java/jdk1.7.0_79

修改完成之后,将hadoop配置文件copy到其他四个机器上

scp -r /opt/hadoop-2.5.2 root@node1:/opt/hadoop-2.5.2

至此Hadoop的配置完毕,接下来就是启动集群了

四。

1.zookeeper已经启动,没有启动则执行下面命令启动

zkServer.sh start



2.启动JournalNode集群

在master上执行已经命令

[root@master hadoop-2.5.2]$ sbin/hadoop-daemons.sh start journalnode


执行jps命令,可以查看到JournalNode的java进程pid(node1,node2,node2)

[root@node1 node1]# jps
8060 JournalNode  <!--JournalNode进程-->
7788 QuorumPeerMain  <!--Zookeeper进程-->
8121 Jps
[root@node1 node1]#



3.格式化zkfc,在zookeeper中生成ha节点 (master上执行)

hdfs zkfc -formatZK



4.格式化hdfs(master上执行)

hadoop namenode -format
core-site.xml中的这个配置

<!--指定hadoop数据临时存放目录-->
 <property>
      <name>hadoop.tmp.dir</name>
      <value>/opt/hadoop</value>
 </property>   

格式化后会在/opt/下建立一个hadoop的临时数据存放目录



5.启动NameNode几点

(1).在master上启动

hadoop-daemon.sh start namenode

(2). 在node1上同步namenode的数据,同时启动standby的namenod,命令如下

hdfs namenode –bootstrapStandby

如果启动报错,则有可能格式化完成之后的clusterID 的值跟dataNode的clusterID值不一样,


查看

查看hadoop格式化后的的VERSION(master上执行)

命令:vi /opt/hadoop/dfs/name/current/VERSION

clusterID=CID-46e9e9b3-c242-417d-be4e-d6d493c94963

查看dataNode的clusterID(node1,node2,node3上执行)

命令:vi /opt/hadoop/dfs/data/current/VERSION

clusterID=CID-46234234-23234-be4e-d6d493c94sr2

#如果一样,则保存,排除这个错误,看日志找其他错误原因
#如果两个clusterID不一样,则以master的clusterID为准,将node1,node2,node3上的clusterID 替换为 master上的clusterID保存

(3)

在node1以上继续执行

hdfs namenode –bootstrapStandby

如果看到如下信息则表示node1上的namenode同步成功


(4).启动node1上的namenode

hadoop-daemon.sh start namenode
#jps查看进程
[root@node1 node1]# jps
8224 NameNode  <!--表示namenode启动成功-->
8261 Jps
8060 JournalNode
7788 QuorumPeerMain
[root@node1 node1]#



(5).启动dateNode(master上执行)

hadoop-daemons.sh start datanode

[root@master hadoop]# hadoop-daemons.sh start datanode
192.168.221.129: starting datanode, logging to /opt/hadoop-2.5.2/hadoop-2.5.2/logs/hadoop-root-datanode-node3.out
192.168.221.131: starting datanode, logging to /opt/hadoop-2.5.2/hadoop-2.5.2/logs/hadoop-root-datanode-node2.out
192.168.221.130: starting datanode, logging to /opt/hadoop-2.5.2/hadoop-2.5.2/logs/hadoop-root-datanode-node1.out
[root@master hadoop]#
表示三台datenode都启动成功了


(6)在作为资源管理器上的机器上启动,我这里是master,执行如下命令完成yarn的启动


start-yarn.sh

[root@master hadoop]# start-yarn.sh
starting yarn daemons
starting resourcemanager, logging to /opt/hadoop-2.5.2/hadoop-2.5.2/logs/yarn-master-resourcemanager-master.out
192.168.221.129: starting nodemanager, logging to /opt/hadoop-2.5.2/hadoop-2.5.2/logs/yarn-root-nodemanager-node3.out
192.168.221.131: starting nodemanager, logging to /opt/hadoop-2.5.2/hadoop-2.5.2/logs/yarn-root-nodemanager-node2.out
192.168.221.130: starting nodemanager, logging to /opt/hadoop-2.5.2/hadoop-2.5.2/logs/yarn-root-nodemanager-node1.out
[root@master hadoop]#
表示yarn资源管理器启动成功

(7).在master上执行如下命令,完成ZKFC的启动

hadoop-daemons.sh start zkfc

[root@master hadoop]# hadoop-daemons.sh start zkfc
192.168.221.131: starting zkfc, logging to /opt/hadoop-2.5.2/hadoop-2.5.2/logs/hadoop-root-zkfc-node2.out
192.168.221.129: starting zkfc, logging to /opt/hadoop-2.5.2/hadoop-2.5.2/logs/hadoop-root-zkfc-node3.out
192.168.221.130: starting zkfc, logging to /opt/hadoop-2.5.2/hadoop-2.5.2/logs/hadoop-root-zkfc-node1.out
[root@master hadoop]#

表示zkfc启动成功
接下来,分别查看每台机器上的进程jps
master
[root@master hadoop]# jps
7242 Jps
6481 QuorumPeerMain <!--zookeeper-->
6735 NameNode   <!--namenode-->
6937 ResourceManager <!--resourceManager-->
[root@master hadoop]#

node1
[root@node1 node1]# jps
8224 NameNode                 <!--namenode-->
8448 NodeManager              <!--dataManager-->
8601 DFSZKFailoverController  <!--zkfc-->
8060 JournalNode              <!--journalNode-->
8681 Jps
7788 QuorumPeerMain            <!--zookeeper-->
8340 DataNode               <!--dataNode-->
[root@node1 node1]#


node2
[root@node2 node2]# jps
4765 JournalNode            <!--journalNode-->
4896 DataNode               <!--datanode-->
5181 Jps
4998 NodeManager               <!--dataManager-->
4514 QuorumPeerMain           <!--zookeeper-->
[root@node2 node2]#


node3
[root@node3 logs]# jps
4521 DataNode              <!--dataNode-->
4387 JournalNode          <!--journalNode-->
4623 NodeManager         <!--dataManager-->
4807 Jps
[root@node3 logs]#

以上几个信息如果都有,则表示hadoop集群搭建完成,测试一下
http://master:50070/
http://node1:50070/







因为有三台DataNode,所以 LiveNodes = 3 表示有3个活动的dataNode

大功告成










                                             
0 0