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就算搭建完了,不过路还长!!!

原文地址:https://www.cnblogs.com/jiange13/p/5445650.html