• hadoop高可用集群环境详解


                                                                                                                                  YD~随风

    原理简解

    hadoop  

    组成:HDFS,   MapReduce             

      hdfs 分布式文件系统

                流式数据访问  hdfs的构建思路是  一次写入、多次读取是最高效的访问模式

                hdfs同样也有快(block)的概念,但是大的多,默认为64MB。与单一磁盘上的文件系统相似,hdfs上的文件也被划分为块大小的多个分块

               作为独立的存储单元。但与其他文件系统不同的是,hdfs中小于一个块大小的文件不会占据整个块的空间

                    hdfs中的块为何如此之大:hdfs的块比磁盘的块大,其目的是为了最小化寻址开销,如果块设置得足够大,从磁盘传输数据的时间会明显

      大于定位整个块开始位置所需的时间,因而,传输一个由多个块组成的文件的时间取决于磁盘传输速率

              namenode  和 datanode

       hdfs集群有两类节点以管理者-工作者模式运行,即一个namenode(管理者)和多个datanode(工作者)。namenode管理文件系统的命名空间。

    它维护着文件系统树及整棵树内所有的文件和目录。这些信息以两个文件形式永久保存在本地磁盘上:命名空间镜像文件和编辑日志文件。namenode也

    记录着每个文件中各个块所在的数据节点信息,但它并不永久保存块的位置信息,因为这些信息会在系统启动时由数据节点重建

    基于后面的两个,之后在研究

    其实说白了,hdfs里面有namenode   和  datanode   ,namenode为命名空间,也是master,下发任务,datenode为数据节点,专门干活,执行任务存数据

    clipboard

    不过这样看,有单点问题,

    hadoop中的namenode好比人的心脏,绝对不可以停止工作,在hadoop2.0中新的namenode不再是一个,可以有多个(目前只支持2个)

    每一个都有相同的职能,一个是active状态的,一个是standby状态的,当集群运行时,只有active状态的namenode是正常工作的,standby

    状态的namenode是处于待命状态的,时刻同步active状态namenode的数据。一旦active状态的namenode不能工作,通过手工或者自动切换,

    standby状态的namenode就可以转变为active状态的,就可以继续工作了,

    hadoop2.0中,两个namenode的数据其实是实时共享的,新hdfs采用了一种共享机制,Quorum Journal Node(JournalNode)集群或者

    NFS进行共享,nfs是操作系统层面的,journalnode是hadoop层面的我们这里使用journalnode集群

    clipboard

    两个NameNode为了数据同步,会通过一组称作JournalNodes的独立进程进行相互通信。当active状态的NameNode的命名空间有任何修改时,

    会告知大部分的JournalNodes进程。standby状态的NameNode有能力读取JNs中的变更信息,并且一直监控edit log的变化,把变化应用于自己

    的命名空间。standby可以确保在集群出错时,命名空间状态已经完全同步了

    对于HA集群而言,确保同一时刻只有一个NameNode处于active状态是至关重要的。否则,两个NameNode的数据状态就会产生分歧,可能丢失

    数据,或者产生错误的结果。为了保证这点,这就需要利用使用ZooKeeper了。首先HDFS集群中的两个NameNode都在ZooKeeper中注册,

    当active状态的NameNode出故障时,ZooKeeper能检测到这种情况,它就会自动把standby状态的NameNode切换为active状态

    我这里是做了4台   。    这里我说一下,这个journalnode最少三台,也就是最起码是奇数,数据节点也弄三台吧

    namenode             datanode         zookeeper       year     journalnode

    192.168.10.36  hadoop-master-01                     是                              否                    是                 否              否 

    192.168.10.39  hadoop-master-03                       是                           是                        是                是             是

    192.168.10.37  hadoop-slave-01                          否                            是                        是                否              是

    192.168.10.38  hadoop-slave-02                           否                             是                     否                   否               是

    前期的环境都弄好,我这里系统是centos7,我将自带的java卸了,自己装了一个

    jdk-8u72-linux-x64.rpm 

    clipboard

    环境变量配好

    export JAVA_HOME=/usr/java/jdk1.8.0_72

    export CLASSPATH=.:$JAVA_HOME/jreb/rt.jar:$JAVA_HOMEb/dt.jar:$JAVA_HOMEb/tools.jar

    export PATH=$PATH:$JAVA_HOME/bin

    好了,准备好,那就开始zookeeper。

    我们看看配置文件

    tickTime=2000

    initLimit=10

    syncLimit=5

    dataDir=/usr/local/zookeeper-3.4.6/data

    clientPort=2181

    dataLogDir=/tmp/zookeeper/log

    server.1=hadoop-master-01:2888:3888

    server.2=hadoop-master-03:2888:3888

    server.3=hadoop-slave-01:2888:3888

    后面别忘了创建那个小文件

    clipboard

    好了,zk完了,

    开始hadoop。

    wget  http://apache.fayea.com/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gz

    hadoop-2.7.2.tar.gz      最新版本

    对了,ssh免密码登陆,这个别忘,因为Hadoop需要通过SSH登录到各个节点进行操作

    (1)CentOS默认没有启动ssh无密登录,去掉/etc/ssh/sshd_config其中2行的注释,每台服务器都要设置,
    #RSAAuthentication yes
    #PubkeyAuthentication yes
    (2)输入命令,ssh-keygen -t rsa,生成key,都不输入密码,一直回车,/root就会生成.ssh文件夹,

    然后将公钥拷贝到其他机器上生成authorized_keys

    测试一下

    好了,解包hadoop

    创建几个数据目录在/home/hadoop     data   name   temp

    我们开始看配置

    这里要涉及到的配置文件有7个:

    ~/hadoop-2.7.2/etc/hadoop/hadoop-env.sh           export JAVA_HOME=/usr/java/jdk1.8.0_72    我直接在这个文件里修改了一下环境变量

    ~/hadoop-2.7.2/etc/hadoop/yarn-env.sh       这个也是环境的一些配置

    ~/hadoop-2.7.2/etc/hadoop/slaves                  这个里面是很明显,都是slave,datanode,

    ~/hadoop-2.7.2/etc/hadoop/core-site.xml             这里是namenode的配置文件

    ~/hadoop-2.7.2/etc/hadoop/hdfs-site.xml             hdfs的配置文件

    ~/hadoop-2.7.2/etc/hadoop/mapred-site.xml       mapreduce

    ~/hadoop-2.7.2/etc/hadoop/yarn-site.xml                 yarn的配置

    /usr/local/hadoop/etc/hadoop/core-site.xml

    <configuration>

            <property>

                    <name>fs.defaultFS</name>

                    <value>hdfs://ns</value>                 这里定义namenode,他的数据目录

            </property>

            <property>

                    <name>hadoop.tmp.dir</name>

                    <value>file:/home/hadoop/temp</value>

                    <description>Abase for other temporary directories.</description>

            </property>

            <property>

                    <name>ha.zookeeper.quorum</name>                     以及注册与zk的配置

                    <value>hadoop-master-01:2181,hadoop-master-03:2181,hadoop-slave-01:2181</value>

            </property>

    </configuration>

    vi /usr/local/hadoop/etc/hadoop/hdfs-site.xml

    <configuration>

        <!--指定hdfs的nameservice为ns,需要和core-site.xml中的保持一致 -->

        <property>

            <name>dfs.nameservices</name>

            <value>ns</value>

        </property>

        <!-- ns下面有两个NameNode,分别是nn1,nn2 -->

        <property>

           <name>dfs.ha.namenodes.ns</name>

           <value>nn1,nn2</value>

        </property>

        <!-- nn1的RPC通信地址 -->

        <property>

           <name>dfs.namenode.rpc-address.ns.nn1</name>

           <value>hadoop-master-01:9000</value>

        </property>

        <!-- nn1的http通信地址 -->

        <property>

            <name>dfs.namenode.http-address.ns.nn1</name>

            <value>hadoop-master-01:50070</value>

        </property>

        <!-- nn2的RPC通信地址 -->

        <property>

            <name>dfs.namenode.rpc-address.ns.nn2</name>

            <value>hadoop-master-03:9000</value>

        </property>

        <!-- nn2的http通信地址 -->

        <property>

            <name>dfs.namenode.http-address.ns.nn2</name>

            <value>hadoop-master-03:50070</value>

        </property>

        <!-- 指定NameNode的元数据在JournalNode上的存放位置 -->

        <property>

             <name>dfs.namenode.shared.edits.dir</name>

             <value>qjournal://hadoop-master-03:8485;hadoop-slave-01:8485;hadoop-slave-02:8485/ns</value>

        </property>

        <!-- 指定JournalNode在本地磁盘存放数据的位置 -->

        <property>

              <name>dfs.journalnode.edits.dir</name>

              <value>/home/hadoop/journal</value>

        </property>

        <!-- 开启NameNode故障时自动切换 -->

        <property>

              <name>dfs.ha.automatic-failover.enabled</name>

              <value>true</value>

        </property>

        <!-- 配置失败自动切换实现方式 -->

        <property>

                <name>dfs.client.failover.proxy.provider.ns</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>

        <property>

            <name>dfs.namenode.name.dir</name>

            <value>file:///home/hadoop/name</value>

        </property>

        <property>

            <name>dfs.datanode.data.dir</name>

            <value>file:///home/hadoop/data</value>

        </property>

        <property>

           <name>dfs.replication</name>

           <value>2</value>

        </property>

        <!-- 在NN和DN上开启WebHDFS (REST API)功能,不是必须 -->

        <property>

           <name>dfs.webhdfs.enabled</name>

           <value>true</value>

        </property>

    这里的配置就是允许它用户连接   

    <property>

            <name>dfs.permissions</name>

            <value>false</value>

        </property>

    </configuration>

    /usr/local/hadoop/etc/hadoop/mapred-site.xml

    <configuration>

             <property>

                    <name>mapreduce.framework.name</name>

                    <value>yarn</value>

             </property>

    </configuration>

    /usr/local/hadoop/etc/hadoop/yarn-site.xml

    <configuration>

            <!-- 指定resourcemanager地址 -->

            <property>

                    <name>yarn.resourcemanager.hostname</name>

                    <value>hadoop-master-03</value>

            </property>

            <!-- 指定nodemanager启动时加载server的方式为shuffle server -->

            <property>

                    <name>yarn.nodemanager.aux-services</name>

                    <value>mapreduce_shuffle</value>

            </property>

    </configuration>

    vi /usr/local/hadoop/etc/hadoop/slaves 

    hadoop-master-03

    hadoop-slave-01

    hadoop-slave-02

    然后将本机的  hadoop  直接拷贝到其他机器。什么防火墙啊。。。主机名啊都改好

    192.168.10.36 hadoop-master-01

    192.168.10.37 hadoop-slave-01

    192.168.10.38 hadoop-slave-02

    192.168.10.39 hadoop-master-03

    开始启动。

    在master1上

    启动journalnode集群

    sbin/hadoop-daemons.sh start journalnode

    bin/hadoop-daemons.sh start journalnode

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

    格式化zkfc,让在zookeeper中生成ha节点

    在master1上

    hdfs zkfc –formatZK

    [zk: localhost:2181(CONNECTED) 1] ls /hadoop-ha

    [ns]

    在master1上                                               因为有两个namnode。这台格式化后,将数据同步到另一台上,手动考培,或者执行命令

    格式化hdfs

    hadoop namenode –format

    用命令同步,得先把目前这台启动起来

    sbin/hadoop-daemon.sh start namenode

    然后来到第二台namenode  master-03 执行

    hdfs namenode -bootstrapStandby      同步

    然后开启 sbin/hadoop-daemon.sh start namenode

    然后继续启动datanode  在master1

    sbin/hadoop-daemons.sh start datenode

    然后启动yarn  在你所配置yarn的那台机器上启动,

    sbin/start-yarn.sh

    最后启动zkfc

    sbin/hadoop-daemons.sh start zkfc

    ok,我们最后看jps

    clipboard

    clipboard

    clipboard

    clipboard

    测试

    clipboard

    clipboard

    我创建了文件夹以及文件测试

    clipboard

    clipboard

    好的,hadoop就算搭建完了,不过路还长!!!

  • 相关阅读:
    012——matlab判断变量是否存在
    011——MATLAB清除工作控件变量
    014——C#新建文件夹
    征服django的关键内容
    Django中session的使用
    RabbitMq与Redis的使用
    python的命名规则
    python类的深层次理解
    python类总结
    python之paramiko模块
  • 原文地址:https://www.cnblogs.com/jiange13/p/5445650.html
Copyright © 2020-2023  润新知