zoukankan      html  css  js  c++  java
  • Hadoop、Spark——完全分布式HA集群搭建

    前言

    完全分布式就是把Hadoop核心组件分开部署到不同的服务器节点上运行。

    通常,建议HDFS和YARN以单独的用户身份运行。在大多数安装中,HDFS进程以“hdfs”执行。YARN通常使用“yarn”帐户。

    搭建分为四个阶段,每一个是环境准备,第二个是Zookeeper集群的搭建,第三是Hadoop集群的搭建,第四是Spark集群的搭建。

    一、准备

    1、软件及版本

    • centOS-6.5
    • jdk-8u65-linux-x64.tar.gz
    • scala-2.11.11.tgz
    • zookeeper-3.4.7.tar.gz
    • hadoop-2.7.3_64bit.tar.gz
    • spark-2.3.3-bin-hadoop2.7.tgz

    2、服务器

    这里将使用六台服务器进行搭建。分别命名spark01、spark02、spark03、spark04、spark05、spark06。

    首先要解释,偶数台服务器并不是某个集群偶数台,而是三个集群共用了偶数台服务器,查看下面的角色分配,你就会明白。

    • 角色分配

    Zookeeper集群分配三台。

    Hadoop分配需要分开说:

        首先时HDFS:两个主节点,三个从节点,5台。

        JN集群:三台

        Yarn集群:两个主节点,三个从节点,5台。

    Spark集群分配三台。

    将以上各个集群的节点合并,具体分配如下:

        spark01:Zookeeper、ResourceManager(active)、NameNode(active)。

        spark02:Zookeeper、NameNode(standby)。

        spark03:Zookeeper、ResourceManager(standby)。

        spark04:JournalNode、DataNode、NodeManager、Spark。

        spark05:JournalNode、DataNode、NodeManager、Spark。

        spark06:JournalNode、DataNode、NodeManager、Spark。

    • 服务器设置

    每台服务器都要进行如下的配置。

      • 关闭防火墙

    此项配置,是根据自己的需求进行配置,这里为了方便搭建,进行了关闭,也可以进行端口开放,不过比较麻烦。

    service iptables status #查看防火墙状态
    service iptables start #立即开启防火墙,但是重启后失效。
    service iptables stop #立即关闭防火墙,但是重启后失效。
    #重启后生效
    chkconfig iptables on #开启防火墙,重启后生效。
    chkconfig iptables off #关闭防火墙,重启后生效。
      • 配置主机名

    文件位置:/etc/sysconfig/network

    vim /etc/sysconfig/network

    示例:

    source /etc/sysconfig/network

    经过上面的修改,主机名称不会马上改变,必须重启才能生效。所以可以使用如下命令进行立即更改:

    hostname spark01
      • 配置hosts

    文件位置:/etc/hosts

    vim /etc/hosts

    以下为填入内容示例:

    127.0.0.1   localhost
    ::1         localhost
    192.168.234.21 spark01
    192.168.234.22 spark02
    192.168.234.23 spark03
    192.168.234.24 spark04
    192.168.234.25 spark05
    192.168.234.26 spark06

    配置好此文件之后可以通过远程命令将配置好的hosts文件scp到其他5台节点上,执行命令如下:

    scp /etc/hosts spark02: /etc/hosts
    scp /etc/hosts spark03: /etc/hosts
    scp /etc/hosts spark04: /etc/hosts
    scp /etc/hosts spark05: /etc/hosts
    scp /etc/hosts spark06: /etc/hosts
      • 配置免密登录

    集群中所有主机都要互相进行免密登录,包括自己和自己。

    生成密钥:

    ssh-keygen

    发送公钥:

    ssh-copy-id root@spark01

    此时在远程主机的/root/.ssh/authorized_keys文件中保存了公钥,在known_hosts中保存了已知主机信息,当再次访问的时候就不需要输入密码了。

    通过以下命令远程连接,检验是否可以不需密码连接:

    ssh spark01

    记得免密登录一定要给本机发送。

    此次集群数量,互相发送免密登录的次数为36次。

    • 安装Jdk

    1、将jdk安装包上传、解压安装包,并更名,命令如下:

    tar -zxvf jdk-8u65-linux-x64.tar.gz
    mv jdk1.8.0_65 jdk1.8

    2、修改/etc/profile, 在文件行尾加入以下内容后保存退出。

    JAVA_HOME=/home/software/jdk1.8/
    PATH=$PATH:$JAVA_HOME/bin
    export JAVA_HOME PATH
    • 安装Scala

    1、上传解压scala-2.11.0.tgz,并更名,命令如下:

    tar -zxvf scala-2.11.0.tgz
    mv scala-2.11.0 scala2.11

    2、修改/etc/profile,配置如下:

    注:上图将Hadoop的环境变量也一起配置了,下面也有Hadoop的环境变量配置。

    3、重新加载profile使配置生效:

    source /etc/profile

    二、Zookeeper完全分布式搭建

    参见:Zookeeper集群的搭建

    三、Hadoop2.0 HA集群搭建步骤

    此示例以spark01节点服务器为示例。

    1、安装

    直接解压Hadoop压缩包即可。

    2、配置

    以下配置文件均在hadoop-2.7.1/etc/hadoop目录下。

    • hadoop-env.sh

    编辑hadoop-env.sh文件,命令如下:

    vim hadoop-env.sh

    此文件配置两项:jdk安装所在目录、hadoop配置文件所在目录。

    • core-site.xml

    直接编辑core-site.xml文件,命令如下:

    vim core-site.xml

    此文件配置项内容如下:

    <configuration>
    <!--用来指定hdfs的老大,ns为固定属性名,此值可以自己设置,但是后面的值要和此值对应,表示两个namenode-->
    <property>
      <name>fs.defaultFS</name>
      <value>hdfs://ns</value>
    </property>
    <!--用来指定hadoop运行时产生文件的存放目录-->
    <property>
      <name>hadoop.tmp.dir</name>
      <value>/home/software/hadoop-2.7.1/tmp</value>
    </property>
    <!--执行zookeeper地址-->
    <property>
      <name>ha.zookeeper.quorum</name>
      <value>spark01:2181,spark02:2181,spark03:2181</value>
    </property>
    </configuration>
    • hdfs-site.xml

    直接编辑hdfs-site.xml文件,命令如下:

    vim 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>spark01:9000</value> </property>
    <!--nn1的http通信地址--> <property>   <name>dfs.namenode.http-address.ns.nn1</name>   <value>spark01:50070</value> </property>
    <!--nn2的RPC通信地址--> <property>   <name>dfs.namenode.rpc-address.ns.nn2</name>   <value>spark02:9000</value> </property>
    <!--nn2的http通信地址--> <property>   <name>dfs.namenode.http-address.ns.nn2</name>   <value>spark02:50070</value> </property>
    <!--指定namenode的元数据在JournalNode上的存放位置,这样,namenode2可以从jn集群里获取最新的namenode的信息,达到热备的效果--> <property>   <name>dfs.namenode.shared.edits.dir</name>   <value>qjournal://spark04:8485;spark05:8485;spark06:8485/ns</value> </property>
    <!--指定JournalNode存放数据的位置--> <property>   <name>dfs.journalnode.edits.dir</name>   <value>/home/software/hadoop-2.7.1/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> <!--配置namenode数据存放的位置,可以不配置,如果不配置,默认用的是core-site.xml里配置的hadoop.tmp.dir的路径--> <property>   <name>dfs.namenode.name.dir</name>   <value>file:///home/software/hadoop-2.7.1/tmp/namenode</value> </property>
    <!--配置datanode数据存放的位置,可以不配置,如果不配置,默认用的是core-site.xml里配置的hadoop.tmp.dir的路径--> <property>   <name>dfs.datanode.data.dir</name>   <value>file:///home/software/hadoop-2.7.1/tmp/datanode</value> </property> <!--配置block副本数量--> <property>   <name>dfs.replication</name>   <value>3</value> </property>
    <!--设置hdfs的操作权限,false表示任何用户都可以在hdfs上操作文件,生产环境不配置此项,默认为true--> <property>   <name>dfs.permissions</name>   <value>false</value> </property> </configuration>
    • mapred-site.xml

     需要复制mapred-site.xml.template更名为mapred-site.xml然后配置,命令如下:

    cp mapred-sit.xml.template mapred-site.xml
    vim mapred-site.xml

     配置内容如下:

    <configuration>
    <property>
      <!--指定mapreduce运行在yarn上-->
      <name>mapreduce.framework.name</name>
      <value>yarn</value>
    </property>
    </configuration>
    • yarn-site.xml

    直接编辑yarn-site.xml文件,命令如下:

    vim yarn-site.xml

    配置内容如下:

    <configuration>
    <!-- 开启YARN HA --> 
    <property>
      <name>yarn.resourcemanager.ha.enabled</name>
      <value>true</value>
    </property>
    
    <!-- 指定两个resourcemanager的名称 --> 
    <property>
      <name>yarn.resourcemanager.ha.rm-ids</name>
      <value>rm1,rm2</value>
    </property>
    
    <!-- 配置rm1,rm2的主机 --> 
    <property>
      <name>yarn.resourcemanager.hostname.rm1</name>
      <value>spark01</value>
    </property>
    
    <property>
      <name>yarn.resourcemanager.hostname.rm2</name>
      <value>spark03</value>
    </property>
    
    <!--开启yarn恢复机制-->
    <property>
      <name>yarn.resourcemanager.recovery.enabled</name>
      <value>true</value>
    </property>
    
    <!--执行rm恢复机制实现类-->
    <property>
      <name>yarn.resourcemanager.store.class</name>
      <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    </property>
    
    <!-- 配置zookeeper的地址 -->  
    <property>
      <name>yarn.resourcemanager.zk-address</name>
      <value>spark01:2181,spark02:2181,spark03:2181</value>
      <description>For multiple zk services, separate them with comma</description>
    </property>
    
    <!-- 指定YARN HA的名称 -->
    <property>
      <name>yarn.resourcemanager.cluster-id</name>
      <value>yarn-ha</value>
    </property>
    
    <!--指定yarn的老大 resoucemanager的地址--> <property>   <name>yarn.resourcemanager.hostname</name>   <value>spark03</value> </property>

    <!--NodeManager获取数据的方式--> <property>   <name>yarn.nodemanager.aux-services</name>   <value>mapreduce_shuffle</value> </property>

     <!--开启日志聚合-->
      <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
      </property>

     <!--日志在HDFS上最多保存多长时间-->
      <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>106800</value>
      </property>

    </configuration>
    • slaves

    slaves文件是指定HDFS上有哪些DataNode节点。

    直接编辑slaves文件,命令如下:

    vim slaves

    配置内容如下:

    spark04
    spark05
    spark06

    3、环境变量

    如果在上面已经配置过了,此步骤可以忽略。

    配置hadoop的环境变量,命令如下:

    vim /etc/profile

    内容如下:

    JAVA_HOME=/home/software/jdk1.8
    HADOOP_HOME=/home/software/hadoop-2.7.3
    PATH=$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$PATH
    export JAVA_HOME PATH HADOOP_HOME

    重新加载:

    source /etc/profile

    4、创建文件夹

    根据配置文件,创建相关的文件夹,用来存放对应数据。

    在hadoop-2.7.1目录下创建:

    • journal目录。
    • 创建tmp目录。
    • 在tmp目录下,分别创建namenode目录和datanode目录。

    命令如下:

    #当前所在Hadoop根目录
    mkdir journal
    mkdir tmp
    cd tmp/
    mkdir namenode
    mkdir datanode

    5、拷贝文件

    通过scp 命令,将hadoop安装目录远程copy到其他5台机器上。

    比如向spark02节点传输:

    scp -r hadoop-2.7.1  root@spark02:/home/software/hadoop-2.7.1

    远程拷贝之前要先在其他服务器上创建对应的目录,否则拷贝失败。

    6、Hadoop集群启动

    • 启动zookeeper集群

     在Zookeeper安装目录的bin目录下执行:

    zkServer.sh start

    此命令需要在所有的Zookeeper节点服务器上执行,执行完成可以使用以下命令查看启动状态:

    zkServer.sh status

    以下是查看进程命令:

    jps
    • 格式化zkfc

    zkfc用来做两个namenode的状态切换管理或者失败切换管理。

    在zk的leader节点服务器上,Hadoop的bin目录中执行如下命令:

    sh hdfs zkfc -formatZK

    如果配置了Hadoop的环境变量,那么在此节点的任何目录下都可以执行,这个指令的作用是在zookeeper集群上生成ha节点(ns节点)。

    格式化以后会在Zookeeper写一些东西,现在可以看一下去(master节点):

    • 启动journalnode集群

    为hadoop提供元数据管理(edits)。在04、05、06任意节点服务器上,即分配了journalnode角色的节点服务器上,切换到hadoop安装目录的sbin目录下,执行如下命令:

    hadoop-daemons.sh start journalnode

    注意:1、第一次需要手动起,以后就不需要手动启动了,就包含在了start-dfs.sh脚本里面了;

               2、此命令执行一次就可以启动所有journalnode节点。如下图,命令使用的是hadoop-daemons.sh,是有s的,启动的时候一定要注意,不要用错了命令。

    然后执行jps命令查看,如果此项启动不成功尝试重启,这项启动不成功会影响下一步的格式化。

    • 格式化NameNode

    在spark01服务器上格式化namenode,执行如下命令:

    hadoop namenode -format
    • 启动NameNode
      • spark01服务器

    在spark01节点上执行如下命令,启动NameNode节点:

    hadoop-daemon.sh start namenode
      • spark02服务器

    首先把spark02服务器的 namenode节点变为standby namenode节点,执行命令如下:

    hdfs namenode -bootstrapStandby

    启动spark02服务器的namenode节点,执行命令如下:

    hadoop-daemon.sh start namenode
    • 启动DataNode

    在spark04、spark05、spark06服务器上分别启动datanode节点,在这三台服务器上分别执行如下命令:

    hadoop-daemon.sh start datanode
    • 启动zkfc

    FalioverControllerActive是失败恢复线程。这个线程需要在NameNode节点所在的服务器上启动,在spark01、spark02服务器上执行如下命令:

    hadoop-daemon.sh start zkfc
    • 启动Resourcemanager
      • spark01服务器

    在spark01服务器上启动主Resourcemanager节点,执行如下命令:

    start-yarn.sh

     启动成功后,spark04、spark05、spark06服务器上的nodemanager 也会跟随启动。

      • spark03服务器

    在spark03服务器上启动副 Resoucemanager节点,执行如下命令:

    yarn-daemon.sh start resourcemanager

    7、测试

    在浏览器中输入地址:http://192.168.234.21:50070,查看namenode的信息,是active状态的。此ip地址是我在配置的时候使用的ip地址,请不要照搬,要写自己使用的ip地址。

     输入地址:http://192.168.234.22:50070,查看namenode的信息,是standby状态

     然后使用kill命令停掉spark01节点的namenode,此时发现standby的namenode变为active。证明热备成功。

    查看yarn的管理地址:

    http://192.168.234.21:8088(spark01的8088端口)

    四、Spark On Yarn搭建

    1、安装

        在spark04、spark05、spark06节点上安装配置spark。此处以spark04服务器为例。

        直接解压压缩包即可。

    2、配置

        进入Spark安装目录的conf目录,配置以下文件。

    • spark-env.sh

    conf目录下没有此文件,需要复制模版文件spark-env.sh.template更名,命令如下:

    cp spark-env.sh.template spark-env.sh
    vim spark-env.sh

    直接在文件末尾添加,内容示例如下:

    export JAVA_HOME=/home/software/jdk1.8
    export SCALA_HOME=/home/software/scala2.11
    export HADOOP_HOME=/home/software/hadoop-2.7.1
    export HADOOP_CONF_DIR=/home/software/hadoop-2.7.1/etc/hadoop
    • spark-defaults.conf

    此文件在目录下也没有,也需要复制模版文件,更名然后编辑,命令如下:

    cp spark-defaults.conf.template spark-defaults.conf
    vim spark-defaults.conf

    直接在文件末尾添加内容,配置示例如下:

    spark.yarn.jars=hdfs://spark01:9000/spark_jars/*

    注:此处hdfs的地址需要是active状态的节点。

    • slaves

    此文件在conf目录下也没有,同样需要赋值模版文件,更名然后编辑,命令如下:

    cp slaves.template slaves
    vim slaves

    同样在文件末尾直接添加配置内容即可,配置示例如下:

    spark04
    spark05
    spark06
    • yarn-site.xml

    如果是用虚拟机搭建,可能会由于虚拟机内存过小而导致启动失败,比如内存资源过小,yarn会直接kill掉进程导致rpc连接失败。

    所以,我们还需要配置Hadoop的yarn-site.xml文件,加入如下两项配置:

    <property>
      <name>yarn.nodemanager.vmem-check-enabled</name>
      <value>false</value>
    </property>
    
    <property>
      <name>yarn.nodemanager.pmem-check-enabled</name>
      <value>false</value>
    </property>

    3、上传jar包

    在HDFS上,创建一个目录,用来存放spark的依赖jar包。此目录是spark-defaults.conf目录中配置的目录名称,命令如下:

    hadoop fs -mkdir /spark_jars

    进入spark安装目录的jars目录,执行:

    hadoop fs -put ./* /spark_jars

    至此,完成Spark-Yarn的配置。

    4、启动

    启动spark shell,进入Spark安装目录的bin目录,执行如下命令:

    spark-shell --master yarn-client

    可以通过yarn控制台来验证:

    五、重启集群

    往往在测试的时候,需要重新启动集群服务,在重新启动的时候,就不需要第一次配置时那么麻烦,可以按照如下步骤进行重启集群服务。

    1、启动zookeeper集群

    在Zookeeper安装目录的bin目录下执行:

    sh zkServer.sh start

    此命令同样需要在所有的Zookeeper节点服务器上执行。

    2、启动Hadoop集群

    • 启动HDFS

    进入hadoop安装目录的sbin目录,执行如下命令:

    start-dfs.sh

    此命令会将HDFS相关的所有节点都启动,不需要切换服务器来进行单独启动HDFS相关的节点进程。

    • 启动Yarn

      • spark01服务器

    在spark01服务器上启动主Resourcemanager节点,执行如下命令:

    start-yarn.sh

    启动成功后,spark04、spark05、spark06服务器上的nodemanager 也会跟随启动。

      • spark03服务器

    在spark03服务器上启动副 Resoucemanager节点,执行如下命令:

    yarn-daemon.sh start resourcemanager

    3、启动spark shell

    启动spark shell,进入Spark安装目录的bin目录,执行如下命令:

    sh spark-shell --master yarn-client

    引用:

  • 相关阅读:
    Linux:sudo,没有找到有效的 sudoers 资源。
    Python中关于CSV文件中的I/O
    Python数据处理进阶——pandas
    脚本的含义
    Common.Logging.dll----------配置方式,可选引用,用于日志输出
    Net作业调度
    MySQL版本介绍
    在 Windows 上安装Rabbit MQ 指南
    版本控制器
    C# 中的占位符本质
  • 原文地址:https://www.cnblogs.com/caoweixiong/p/13451038.html
Copyright © 2011-2022 走看看