hadoop2.x集群搭建

【集群设计】


    主机名       IP                安装的软件                   运行的进程
    hadoop2001  192.168.1.221   jdk、hadoop                  NameNode、DFSZKFailoverController
    hadoop2002  192.168.1.222   jdk、hadoop                  NameNode、DFSZKFailoverController
    hadoop2003  192.168.1.223   jdk、hadoop                  ResourceManager
    hadoop2004  192.168.1.224   jdk、hadoop、zookeeper        DataNode、NodeManager、JournalNode、QuorumPeerMain
    hadoop2005  192.168.1.225   jdk、hadoop、zookeeper        DataNode、NodeManager、JournalNode、QuorumPeerMain
    hadoop2006  192.168.1.226   jdk、hadoop、zookeeper        DataNode、NodeManager、JournalNode、QuorumPeerMain

在hadoop2.0中通常由两个NameNode组成,一个处于active状态,另一个处于standby状态。Active NameNode对外提供服务,而Standby NameNode则不对外提供服务,仅同步active namenode的状态,以便能够在它失败时快速进行切换。
hadoop2.0官方提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。这里我们使用简单的QJM。在该方案中,主备NameNode之间通过一组JournalNode同步元数据信息,一条数据只要成功写入多数JournalNode即认为写入成功。通常配置奇数个JournalNode
这里还配置了一个zookeeper集群,用于ZKFC(DFSZKFailoverController)故障转移,当Active NameNode挂掉了,会自动切换Standby NameNode为standby状态
【准备】

1:虚拟机6台 [hadoop2001、hadoop2002、hadoop2003、hadoop2004、hadoop2005、hadoop2006]
2:jdk1.7.0.tar.gz包
3:zookeeper3.4.5.tar.gz包

【环境准备】

1:设置静态ip
2:修改网络状态为host-only
3:修改hostname [hadoop2001、hadoop2002、hadoop2003、hadoop2004、hadoop2005、hadoop2006]
4:ip与主机名绑定
5:关闭防火墙
6:SSH免密码登陆
        (1)hadoop2001号机到其他主机的免密码登陆
        (2)hadoop2003号机到04、05、06号机的免密码登陆
        (3)hadoop2004号机到05、06号机的免密码登陆
        (4)hadoop2001号机与hadoop2002号机的互相免密码登陆

【免密码登陆】
免登陆即将自己主机生成的公钥发送给要免登陆的主机即可

在hadoop2001机器生成公钥
ssh-keygen -t rsa
做本机免登陆
ssh-copy-id hadoop2001
做其他机器免登陆
ssh-copy-id hadoop2002
ssh-copy-id hadoop2003
ssh-copy-id hadoop2004
ssh-copy-id hadoop2005
ssh-copy-id hadoop2006
hadoop2.x集群搭建_第1张图片
免登陆.png

【1】java环境搭建

tar -xzvf jdk1.7.0.tar.gz
cp -r /usr/local

配置环境变量
vim  /etc/profilr

export JAVA_HOME=/usr/local/jdk1.7.0
export PATH=$JAVA_HOME/bin:$PATH

刷新配置文件
source /etc/profile
echo $JAVA_HOME

搭建好01号主机的java环境后将/usr/local/jdk1.7.0复制到其他主机

scp -r /usr/local/jdk1.7.0  root@hadoop2002:/usr/local
scp -r /usr/local/jdk1.7.0  root@hadoop2003:/usr/local
scp -r /usr/local/jdk1.7.0  root@hadoop2004:/usr/local
scp -r /usr/local/jdk1.7.0  root@hadoop2005:/usr/local
scp -r /usr/local/jdk1.7.0  root@hadoop2006:/usr/local

在分别配置每台主机的JAVA_HOME即可并验证

【2】zookeeper集群环境搭建

zookeeper集群环境准备搭建在hadoop2004、hadoop2005、hadoop2006号主机,先搭建好2004 号主机

tar -xzvf zookeeper3.4.5.tar.gz
cp -r zookeeper3.4.5  /usr/local

cd zookeeper3.4.5/conf
mv zoo_sample.cfg zoo.cfg

修改zoo.cfg配置文件
      1,修改数据存储位置
                dataDir=/usr/local/zookeeper-3.4.5/data
      2,配置server编号
                server.1=hadoop2004:2888:3888
                server.2=hadoop2005:2888:3888
                server.3=hadoop2006:2888:3888


添加配置文件中所设置的数据存储目录data
        mkdir  /usr/local/zookeeper3.4.5/data
        cd data
        //在data下创建myid文件
        touch  myid
        //在myid文件中添加server编号
        vim myid   (添加1)

将/usr/local/zookeeper文件夹复制到hadoop2005和hadoop2006号主机
        scp  -r zookeeper3.4.5  root@hadoop2005:/usr/local
        scp  -r zookeeper3.4.5  root@hadoop2006:/usr/local

分别修改hadoop2005号机和hadoop2006号机下/zookeeper/data/myid文件,与server编号同步


分别开启zk
        ./zkServer.sh  start(开启zk服务端)
        ./zkServer.sh  status (重启zk服务端)

        ./zkCli.sh (开启zk客户端)
hadoop2.x集群搭建_第2张图片
zoo-cfg.png

【3】hadoop集群环境搭建

3.1:解压tar包并cp到local下
        tar -zxvf hadoop-2.2.0.tar.gz
        cp -r hadoop-2.2.0  /usr/local
3.2:配置环境变量
        vim /etc/profile
        export JAVA_HOME=/usr/java/jdk1.7.0_55
        export HADOOP_HOME=/itcast/hadoop-2.2.0
        export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin

3.3:更改配置文件(hadoop2.0所有的配置文件都在$HADOOP_HOME/etc/hadoop目录下)
        3.3.1 修改hadoo-env.sh
                export JAVA_HOME=/usr/local/jdk1.7.0
      
        3.3.2 修改core-site.xml
                
                    
                    
                        fs.defaultFS
                        hdfs://ns1
                    
                    
                    
                        hadoop.tmp.dir
                        /usr/local/hadoop-2.2.0/tmp
                    
                    
                    
                        ha.zookeeper.quorum
                        hadoop2004:2181,hadoop2005:2181,hadoop2006:2181
                    
                


        3.3.3 修改hdfs-site.xml
                
                    
                    
                        dfs.nameservices
                        ns1
                    
                    
                    
                        dfs.ha.namenodes.ns1
                        nn1,nn2
                    
                    
                    
                        dfs.namenode.rpc-address.ns1.nn1
                        hadoop2001:9000
                    
                    
                    
                        dfs.namenode.http-address.ns1.nn1
                        hadoop2001:50070
                    
                    
                    
                        dfs.namenode.rpc-address.ns1.nn2
                        hadoop2002:9000
                    
                    
                    
                        dfs.namenode.http-address.ns1.nn2
                        hadoop2002:50070
                    
                    
                    
                        dfs.namenode.shared.edits.dir
                        qjournal://hadoop2004:8485;hadoop2005:8485;hadoop2006:8485/ns1
                    
                    
                    
                        dfs.journalnode.edits.dir
                        /itcast/hadoop-2.2.0/journal
                    
                    
                    
                        dfs.ha.automatic-failover.enabled
                        true
                    
                    
                    
                        dfs.client.failover.proxy.provider.ns1
                        org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
                    
                    
                    
                        dfs.ha.fencing.methods
                        
                            sshfence
                            shell(/bin/true)
                        
                    
                    
                    
                        dfs.ha.fencing.ssh.private-key-files
                        /root/.ssh/id_rsa
                    
                    
                    
                        dfs.ha.fencing.ssh.connect-timeout
                        30000
                    
                


        3.3.4 修改mapred-site.xml
                
                    
                    
                        mapreduce.framework.name
                        yarn
                    
                


        3.3.5 修改yarn-site.xml
                
                    
                    
                        yarn.resourcemanager.hostname
                        hadoop2003
                    
                    
                    
                        yarn.nodemanager.aux-services
                        mapreduce_shuffle
                    
                

        3.3.6 修改slaves(slaves是指定子节点的位置,因为要在hadoop2001上启动HDFS、在hadoop2003启动yarn,
         所以hadoop2001上的slaves文件指定的是datanode的位置,hadoop2003上的slaves文件指定的是nodemanager的位置)
                hadoop2004
                hadoop2005
                hadoop2006

3.4 将配置好的hadoop拷贝到其他节点
            scp -r hadoop-2.2.0  root@hadoop2002:/usr/local
            scp -r hadoop-2.2.0  root@hadoop2003:/usr/local
            scp -r hadoop-2.2.0  root@hadoop2004:/usr/local
            scp -r hadoop-2.2.0  root@hadoop2005:/usr/local
            scp -r hadoop-2.2.0  root@hadoop2006:/usr/local


############注意:严格按照下面的步骤##############
3.5 启动zookeeper集群(分别在hadoop2004、hadoop2005、hadoop2006上启动zk)
            ./zkServer.sh start
            #查看状态:一个leader,两个follower
            ./zkServer.sh status

3.6 启动journalnode(在hadoop2001上启动所有journalnode,注意:是调用的hadoop-daemons.sh这个脚本,注意是复数s的那个脚本)
            sbin/hadoop-daemons.sh start journalnode
            #运行jps命令检验,hadoop2004、hadoop2005、hadoop2006上多了JournalNode进程
      注意:也可以在hadoop2004,hadoop2005,hadoop2006上分别启动,执行
          hadoop-daemon.sh start journalnode
          此命令没有S指单开(记得要jps验证)
切记在格式化之前要开启journalnode进程,这个进程读取slave配置,告诉主机子节点,

3.7 格式化HDFS
            #在hadoop2001上执行命令:
            hdfs namenode -format
            #格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成一个名为tmp的目录,
这里我配置的是/usr/local/hadoop-2.2.0/tmp,
然后将/itcast/hadoop-2.2.0/tmp拷贝到hadoop2002的/usr/local/hadoop-2.2.0/下(因为两个namenode的格式化数据要一样)。
            scp -r tmp/ hadoop2002:/usr/local/hadoop-2.2.0/

3.8 格式化ZK(在hadoop2001上执行即可)
            hdfs zkfc -formatZK

3.9 启动HDFS(在hadoop01上执行)
            sbin/start-dfs.sh

3.10 启动YARN
(#####注意#####:是在hadoop03上执行start-yarn.sh,
把namenode和resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了就要分别在不同的机器上启动)
            sbin/start-yarn.sh



注意:hadoop01和hadoop02上都运行的namenode,上边的hadoop配置slaver文件是指定datanode的节点(属于HDFS的子节点)
hadoop03上运行的resourceManager,上边的hadoop配置slaver文件是指定nodemanager的节点(属于MR的子节点),
两个slave的配置内容可以不一样

【4】验证

注意:在开启hdfs和yarn时一定要确保zookeeper集群开启,否则可能会出现两台namenode均为standby状态

        http://192.168.1.221:50070
        NameNode 'hadoop2001:9000' (active)
        http://192.168.1.222:50070
        NameNode 'hadoop2002:9000' (standby)

hadoop2.x集群搭建_第3张图片
启动日志.png
hadoop2.x集群搭建_第4张图片
1.png
hadoop2.x集群搭建_第5张图片
2.png
hadoop2.x集群搭建_第6张图片
stop-dfs.png
hadoop2.x集群搭建_第7张图片
stop-yarn.png
hadoop2.x集群搭建_第8张图片
01.png
hadoop2.x集群搭建_第9张图片
02.png
hadoop2.x集群搭建_第10张图片
03.png
hadoop2.x集群搭建_第11张图片
04.png
hadoop2.x集群搭建_第12张图片
05.png
hadoop2.x集群搭建_第13张图片
06.png

【5】操作验证

启动后01号主机和02号主机都有进城nameNode,01是主active状态,02是备standby状态。我们在01上上传一个文件,在kill掉01主机上的nameNode进程,再去看02的状态是否由standby切换为active状态,在看看02上是否有01上上传的文件,最后在重新开启01上的nameNode进程,看看他的状态是active还是standby

1:开启集群(开启之前要开启zookeeper)
2:在01上上传文件

01.png
hadoop2.x集群搭建_第14张图片
02.png

3:kill掉01上的namenode进程

hadoop2.x集群搭建_第15张图片
03.png

4:查看02状态是否切换为主active,并看01上上传的文件是否在02上可以查看

hadoop2.x集群搭建_第16张图片
04.png
hadoop2.x集群搭建_第17张图片
05.png

5:在从新开启01上的namenode进程查看01状态

hadoop2.x集群搭建_第18张图片
06.png
hadoop2.x集群搭建_第19张图片
07.png

【注意】:
如果出现namenode启动后出现两个均为standby状态,那一定要确保zookeeper集群提前启动

【6】java操作2.x集群
hadoop2.X的namenode有两个,而具体哪个namenode状态为active,哪个namenode状态为standby不能确定,所以在操作时只能连接nameservices来进行操作

代码实现:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IOUtils;


public class HDFSDemo_HA {

    public static void main(String[] args) throws Exception {
        Configuration conf = new Configuration();
        //设置nameservices
        conf.set("dfs.nameservices", "ns1");
        //设置nameservices上的namenode节点
        conf.set("dfs.ha.namenodes.ns1", "nn1,nn2");
        //设置节点1的rpc通信地址
        conf.set("dfs.namenode.rpc-address.ns1.nn1", "hadoop2001:9000");
        //设置节点2的rpc通信地址
        conf.set("dfs.namenode.rpc-address.ns1.nn2", "hadoop2002:9000");
        //设置nameservice的代理客户端
        conf.set("dfs.client.failover.proxy.provider.ns1", "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider");
        /**
         * 注意:上边的一系列参数设置都在hdfs-site.xml的文件上,由于集群上namenode节点有两个,具体哪个是active状态也不能确定,
         * 所以hadoop2.x的集群用java操作只需要连接nameservices,由nameservices去调用状态为active的namenode完成文件操作
         */
        
        
        FileSystem fs = FileSystem.get(new URI("hdfs://ns1"),conf,"root");//这里最好指明root用户
        
        //下载
        //InputStream in = fs.open(new Path("/test.txt"));
        //OutputStream out = new FileOutputStream("D://test.txt");
        
        //上传
        InputStream in = new FileInputStream("D://many.jar");
        OutputStream out = fs.create(new Path("/many.jar"));
        
        IOUtils.copyBytes(in, out, 4096,true);
    }
}

你可能感兴趣的:(hadoop2.x集群搭建)