美文网首页
hadoop2.x集群搭建

hadoop2.x集群搭建

作者: 先生_吕 | 来源:发表于2016-12-20 18:04 被阅读94次

    【集群设计】

    
        主机名       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
    
    免登陆.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客户端)
    
    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
                    <configuration>
                        <!-- 指定hdfs的nameservice为ns1 -->
                        <property>
                            <name>fs.defaultFS</name>
                            <value>hdfs://ns1</value>
                        </property>
                        <!-- 指定hadoop临时目录 -->
                        <property>
                            <name>hadoop.tmp.dir</name>
                            <value>/usr/local/hadoop-2.2.0/tmp</value>
                        </property>
                        <!-- 指定zookeeper地址 -->
                        <property>
                            <name>ha.zookeeper.quorum</name>
                            <value>hadoop2004:2181,hadoop2005:2181,hadoop2006:2181</value>
                        </property>
                    </configuration>
    
    
            3.3.3 修改hdfs-site.xml
                    <configuration>
                        <!--指定hdfs的nameservice为ns1,需要和core-site.xml中的保持一致 -->
                        <property>
                            <name>dfs.nameservices</name>
                            <value>ns1</value>
                        </property>
                        <!-- ns1下面有两个NameNode,分别是nn1,nn2 -->
                        <property>
                            <name>dfs.ha.namenodes.ns1</name>
                            <value>nn1,nn2</value>
                        </property>
                        <!-- nn1的RPC通信地址 -->
                        <property>
                            <name>dfs.namenode.rpc-address.ns1.nn1</name>
                            <value>hadoop2001:9000</value>
                        </property>
                        <!-- nn1的http通信地址 -->
                        <property>
                            <name>dfs.namenode.http-address.ns1.nn1</name>
                            <value>hadoop2001:50070</value>
                        </property>
                        <!-- nn2的RPC通信地址 -->
                        <property>
                            <name>dfs.namenode.rpc-address.ns1.nn2</name>
                            <value>hadoop2002:9000</value>
                        </property>
                        <!-- nn2的http通信地址 -->
                        <property>
                            <name>dfs.namenode.http-address.ns1.nn2</name>
                            <value>hadoop2002:50070</value>
                        </property>
                        <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
                        <property>
                            <name>dfs.namenode.shared.edits.dir</name>
                            <value>qjournal://hadoop2004:8485;hadoop2005:8485;hadoop2006:8485/ns1</value>
                        </property>
                        <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
                        <property>
                            <name>dfs.journalnode.edits.dir</name>
                            <value>/itcast/hadoop-2.2.0/journal</value>
                        </property>
                        <!-- 开启NameNode失败自动切换 -->
                        <property>
                            <name>dfs.ha.automatic-failover.enabled</name>
                            <value>true</value>
                        </property>
                        <!-- 配置失败自动切换实现方式 -->
                        <property>
                            <name>dfs.client.failover.proxy.provider.ns1</name>
                            <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
                        </property>
                        <!-- 配置隔离机制方法,多个机制用换行分割,即每个机制暂用一行-->
                        <property>
                            <name>dfs.ha.fencing.methods</name>
                            <value>
                                sshfence
                                shell(/bin/true)
                            </value>
                        </property>
                        <!-- 使用sshfence隔离机制时需要ssh免登陆 -->
                        <property>
                            <name>dfs.ha.fencing.ssh.private-key-files</name>
                            <value>/root/.ssh/id_rsa</value>
                        </property>
                        <!-- 配置sshfence隔离机制超时时间 -->
                        <property>
                            <name>dfs.ha.fencing.ssh.connect-timeout</name>
                            <value>30000</value>
                        </property>
                    </configuration>
    
    
            3.3.4 修改mapred-site.xml
                    <configuration>
                        <!-- 指定mr框架为yarn方式 -->
                        <property>
                            <name>mapreduce.framework.name</name>
                            <value>yarn</value>
                        </property>
                    </configuration>
    
    
            3.3.5 修改yarn-site.xml
                    <configuration>
                        <!-- 指定resourcemanager地址 -->
                        <property>
                            <name>yarn.resourcemanager.hostname</name>
                            <value>hadoop2003</value>
                        </property>
                        <!-- 指定nodemanager启动时加载server的方式为shuffle server -->
                        <property>
                            <name>yarn.nodemanager.aux-services</name>
                            <value>mapreduce_shuffle</value>
                        </property>
                    </configuration>
    
            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)
    
    
    启动日志.png 1.png 2.png stop-dfs.png stop-yarn.png 01.png 02.png 03.png 04.png 05.png 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 02.png

    3:kill掉01上的namenode进程

    03.png

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

    04.png 05.png

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

    06.png 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集群搭建

          本文链接:https://www.haomeiwen.com/subject/tzffvttx.html