美文网首页
2.4.1伪分布式环境搭建

2.4.1伪分布式环境搭建

作者: 无名灰衣扫地人 | 来源:发表于2017-02-15 10:36 被阅读0次

    环境需要:
    linux系统(当前使用Centos6.5)、jdk、hadoop2.4.1、zookeeper-3.4.6、ssh

    概念简单介绍

    NameNode
    Namenode 管理者文件系统的Namespace。它维护着文件系统树(filesystem tree)以及文件树中所有的文件和文件夹的元数据(metadata)。管理这些信息的文件有两个,分别是Namespace 镜像文件(Namespace image)和操作日志文件(edit log),这些信息被Cache在RAM中,当然,这两个文件也会被持久化存储在本地硬盘。Namenode记录着每个文件中各个块所在的数据节点的位置信息,但是他并不持久化存储这些信息,因为这些信息会在系统启动时从数据节点重建。
    客户端(client)代表用户与namenode和datanode交互来访问整个文件系统。客户端提供了一些列的文件系统接口,因此我们在编程时,几乎无须知道datanode和namenode,即可完成我们所需要的功能。

    DataNode
    Datanode是文件系统的工作节点,他们根据客户端或者是namenode的调度存储和检索数据,并且定期向namenode发送他们所存储的块(block)的列表。
    集群中的每个服务器都运行一个DataNode后台程序,这个后台程序负责把HDFS数据块读写到本地的文件系统。当需要通过客户端读/写某个 数据时,先由NameNode告诉客户端去哪个DataNode进行具体的读/写操作,然后,客户端直接与这个DataNode服务器上的后台程序进行通 信,并且对相关的数据块进行读/写操作。

    DFSZKFailoverController
    驱动整个ZKFC的运转,通过向HealthMonitor和ActiveStandbyElector注册回调函数的方式,subscribe HealthMonitor和ActiveStandbyElector的事件,并做相应的处理

    ResourceManager
    YARN中的资源管理器(Resource Manager)负责整个系统的资源管理和调度,并内部维护了各个应用程序的ApplictionMaster信息,NodeManager信息,资源使用信息等

    NodeManager
    NodeManager(NM)是YARN中每个节点上的代理,它管理Hadoop集群中单个计算节点,包括与ResourceManger保持通信,监督Container的生命周期管理,监控每个Container的资源使用(内存、CPU等)情况,追踪节点健康状况,管理日志和不同应用程序用到的附属服务(auxiliary service)。

    JorunalNode
    journalNode的作用是存放EditLog的,在MR1中editlog是和fsimage存放在一起的然后SecondNamenode做定期合并,Yarn在这上面就不用SecondNamanode了

    QuorumPeerMain
    zookeeper独立的进程

    1.集群规划

    主机 IP 软件 运行进程
    server01 192.168.1.101 hadoop、ssh NameNode、DFSZKFailoverController(zkfc)
    server02 192.168.1.102 hadoop、ssh NameNode、DFSZKFailoverController(zkfc)
    server03 192.168.1.103 hadoop、ssh ResourceManager
    server04 192.168.1.104 hadoop、ssh ResourceManager
    server05 192.168.1.105 hadoop、ssh、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
    server06 192.168.1.106 hadoop、ssh、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain
    server07 192.168.1.107 hadoop、ssh、zookeeper DataNode、NodeManager、JournalNode、QuorumPeerMain

    本环境中,将有两个NameNode组成,一个处于Active状态,一个处于StandBy状态。Active NameNode将对外提供服务,StandBy NameNode不对外提供服务,仅同步Active NameNode的状态。当Active NameNode失败时,则进行切换(原处于Active状态的NameNode变成StandBy状态,另一个反之)
    Hadoop2.0之后,提供了两种HDFS HA的解决方案,一种是NFS,另一种是QJM。本环境中使用QJM(市场使用较多)。在该方案中,主备NameNode通过一组JournalNode同步元数据信息,一条数据只要写入到JorunalNode即认为写入成功。一般配置奇数个JorunalNode。
    本环境中还配置了一个zookeeper集群,用于ZKFC(DFSZKFailoverController)故障转移,当Acitve NameNode挂掉了,会自动切换StandBy状态的NameNode为Active状态
    本环境中也配置了两个ResourceManager,一个是Active,一个是Standby,状态由zookeeper进行协调
    2.安装步骤

        1.安装配置zooekeeper集群(在server05上)
        1.1解压
            tar -zxvf zookeeper-3.4.5.tar.gz -C /root/app/
            
        1.2修改配置
            cd /root/app/zookeeper-3.4.5/conf/
            cp zoo_sample.cfg zoo.cfg
            vi zoo.cfg
            修改:dataDir=/root/app/zookeeper-3.4.5/tmp
            在最后添加:
            server.1=server05:2888:3888
            server.2=server06:2888:3888
            server.3=server07:2888:3888
            保存退出
            然后创建一个tmp文件夹
            mkdir /root/app/zookeeper-3.4.5/tmp
            echo 1 > /root/app/zookeeper-3.4.5/tmp/myid
        1.3将配置好的zookeeper拷贝到其他节点
            scp -r /root/app/zookeeper-3.4.5/ root@server06:/root/app/
            scp -r /root/app/zookeeper-3.4.5/ root@server07:/root/app/
            
            注意:修改server06、server07对应/root/app/zookeeper-3.4.5/tmp/myid内容
            server06:
                echo 2 > /root/app/zookeeper-3.4.5/tmp/myid
            server07:
                echo 3 > /root/app/zookeeper-3.4.5/tmp/myid
        2.安装配置hadoop集群(在server01上操作)
        2.1解压
            tar -zxvf hadoop-2.4.1.tar.gz -C /root/app/
        2.2配置HDFS
            #将hadoop添加到环境变量中
            vim /etc/profile
            export JAVA_HOME=/usr/java/jdk1.7.0_55
            export HADOOP_HOME=/root/app/hadoop-2.4.1
            export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin
            
            #hadoop2.4.1的配置文件全部在$HADOOP_HOME/etc/hadoop下
            cd /root/app/hadoop-2.4.1/etc/hadoop
            
            2.2.1修改hadoo-env.sh
                export JAVA_HOME=/root/app/jdk1.7.0_55
                
            2.2.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>/root/app/hadoop-2.4.1/tmp</value>
                    </property>
                    
                    <!-- 指定zookeeper地址 -->
                    <property>
                        <name>ha.zookeeper.quorum</name>
                        <value>server05:2181,server06:2181,server07:2181</value>
                    </property>
                </configuration>
                
            2.2.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>server01:9000</value>
                    </property>
                    <!-- nn1的http通信地址 -->
                    <property>
                        <name>dfs.namenode.http-address.ns1.nn1</name>
                        <value>server01:50070</value>
                    </property>
                    <!-- nn2的RPC通信地址 -->
                    <property>
                        <name>dfs.namenode.rpc-address.ns1.nn2</name>
                        <value>server02:9000</value>
                    </property>
                    <!-- nn2的http通信地址 -->
                    <property>
                        <name>dfs.namenode.http-address.ns1.nn2</name>
                        <value>server02:50070</value>
                    </property>
                    <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->
                    <property>
                        <name>dfs.namenode.shared.edits.dir</name>
                        <value>qjournal://server05:8485;server06:8485;server07:8485/ns1</value>
                    </property>
                    <!-- 指定JournalNode在本地磁盘存放数据的位置 -->
                    <property>
                        <name>dfs.journalnode.edits.dir</name>
                        <value>/root/app/hadoop-2.4.1/journaldata</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>
            
            2.2.4修改mapred-site.xml
                <configuration>
                    <!-- 指定mr框架为yarn方式 -->
                    <property>
                        <name>mapreduce.framework.name</name>
                        <value>yarn</value>
                    </property>
                </configuration>    
            
            2.2.5修改yarn-site.xml
                <configuration>
                        <!-- 开启RM高可用 -->
                        <property>
                           <name>yarn.resourcemanager.ha.enabled</name>
                           <value>true</value>
                        </property>
                        <!-- 指定RM的cluster id -->
                        <property>
                           <name>yarn.resourcemanager.cluster-id</name>
                           <value>yrc</value>
                        </property>
                        <!-- 指定RM的名字 -->
                        <property>
                           <name>yarn.resourcemanager.ha.rm-ids</name>
                           <value>rm1,rm2</value>
                        </property>
                        <!-- 分别指定RM的地址 -->
                        <property>
                           <name>yarn.resourcemanager.hostname.rm1</name>
                           <value>server03</value>
                        </property>
                        <property>
                           <name>yarn.resourcemanager.hostname.rm2</name>
                           <value>server04</value>
                        </property>
                        <!-- 指定zk集群地址 -->
                        <property>
                           <name>yarn.resourcemanager.zk-address</name>
                           <value>server05:2181,server06:2181,server07:2181</value>
                        </property>
                        <property>
                           <name>yarn.nodemanager.aux-services</name>
                           <value>mapreduce_shuffle</value>
                        </property>
                </configuration>
            
                
            2.2.6修改slaves(slaves是指定子节点的位置,因为要在server01上启动HDFS、在server03启动yarn,所以server01上的slaves文件指定的是datanode的位置,server03上的slaves文件指定的是nodemanager的位置)
                server05
                server06
                server07
    
            2.2.7配置免密码登陆
                #首先要配置server01到server02、server03、server04、server05、server06、server07的免密码登陆
                #在server01上生产一对钥匙
                ssh-keygen -t rsa
                #将公钥拷贝到其他节点,包括自己
                ssh-coyp-id server01
                ssh-coyp-id server02
                ssh-coyp-id server03
                ssh-coyp-id server04
                ssh-coyp-id server05
                ssh-coyp-id server06
                ssh-coyp-id server07
                #配置server03到server04、server05、server06、server07的免密码登陆
                #在server03上生产一对钥匙
                ssh-keygen -t rsa
                #将公钥拷贝到其他节点
                ssh-coyp-id server04
                ssh-coyp-id server05
                ssh-coyp-id server06
                ssh-coyp-id server07
                #注意:两个namenode之间要配置ssh免密码登陆,别忘了配置server02到server01的免登陆
                在server02上生产一对钥匙
                ssh-keygen -t rsa
                ssh-coyp-id -i server01             
        
        2.4将配置好的hadoop拷贝到其他节点
            scp -r /root/app/hadoop-2.4.1/ root@server02:/root/app/
            scp -r /root/app/hadoop-2.4.1/ root@server03:/root/app/
            scp -r /root/app/hadoop-2.4.1/ root@server04:/root/app/
            scp -r /root/app/hadoop-2.4.1/ root@server05:/root/app/
            scp -r /root/app/hadoop-2.4.1/ root@server06:/root/app/
            scp -r /root/app/hadoop-2.4.1/ root@server07:/root/app/
    

    3.启动

        ###注意:严格按照下面的步骤
        2.5启动zookeeper集群(分别在server05、server06、server07上启动zk)
            cd /root/app/zookeeper-3.4.5/bin/
            ./zkServer.sh start
            #查看状态:一个leader,两个follower
            ./zkServer.sh status
            
        2.6启动journalnode(分别在在server05、server06、server07上执行)
            cd /root/app/hadoop-2.4.1
            sbin/hadoop-daemon.sh start journalnode
            #运行jps命令检验,server05、server06、server07上多了JournalNode进程
        
        2.7格式化HDFS
            #在server01上执行命令:
            hdfs namenode -format
            #格式化后会在根据core-site.xml中的hadoop.tmp.dir配置生成个文件,这里我配置的是/server/hadoop-2.4.1/tmp,然后将/server/hadoop-2.4.1/tmp拷贝到server02的/server/hadoop-2.4.1/下。
            scp -r tmp/ server02:/home/hadoop/app/hadoop-2.4.1/
            ##也可以这样,建议hdfs namenode -bootstrapStandby
        
        2.8格式化ZKFC(在server01上执行即可)
            hdfs zkfc -formatZK
        
        2.9启动HDFS(在server01上执行)
            sbin/start-dfs.sh
    
        2.10启动YARN(#####注意#####:是在server03上执行start-yarn.sh,把namenode和resourcemanager分开是因为性能问题,因为他们都要占用大量资源,所以把他们分开了,他们分开了就要分别在不同的机器上启动)
            sbin/start-yarn.sh
    
        
    到此,hadoop-2.4.1配置完毕,可以统计浏览器访问:
        http://192.168.1.101:50070
        NameNode 'server01:9000' (active)
        http://192.168.1.102:50070
        NameNode 'server02:9000' (standby)
    
    验证HDFS HA
        首先向hdfs上传一个文件
        hadoop fs -put /etc/profile /profile
        hadoop fs -ls /
        然后再kill掉active的NameNode
        kill -9 <pid of NN>
        通过浏览器访问:http://192.168.1.202:50070
        NameNode 'server02:9000' (active)
        这个时候server02上的NameNode变成了active
        在执行命令:
        hadoop fs -ls /
        -rw-r--r--   3 root supergroup       1926 2017-02-06 15:36 /profile
        刚才上传的文件依然存在!!!
        手动启动那个挂掉的NameNode
        sbin/hadoop-daemon.sh start namenode
        通过浏览器访问:http://192.168.1.101:50070
        NameNode 'server01:9000' (standby)
    
    验证YARN:
        运行一下hadoop提供的demo中的WordCount程序:
        hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.4.1.jar wordcount /profile /out
    

    4.测试集群的简单命令

    测试集群工作状态的一些指令 :
        bin/hdfs dfsadmin -report    查看hdfs的各节点状态信息
        bin/hdfs haadmin -getServiceState nn1        获取一个namenode节点的HA状态
        sbin/hadoop-daemon.sh start namenode  单独启动一个namenode进程
        ./hadoop-daemon.sh start zkfc   单独启动一个zkfc进程

    相关文章

      网友评论

          本文标题:2.4.1伪分布式环境搭建

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