Spark On Yarn彻底分布式搭建

Spark On Yarn彻底分布式搭建

    Spark On Yarn的搭建分为三个阶段,第一个是Zookeeper集群的搭建,第二是Hadoop集群的搭建,第三是Spark集群的搭建。因此如下将按照这三个步骤来给你们进行展现Spark On Yarn彻底分布式搭建。java

1、准备

一、软件及版本

    1. jdk-8u65-linux-x64.tar.gznode

    2. scala-2.11.0.tgzlinux

    3. zookeeper-3.4.7.tar.gzshell

    4. hadoop-2.7.1_64bit.tar.gzapache

    5. spark-2.0.1-bin-hadoop2.7.tgzbootstrap

二、服务器

    这里将使用六台服务器进行搭建。分别命名spark0一、spark0二、spark0三、spark0四、spark0五、spark06。vim

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

1.角色分配

    Zookeeper集群分配三台。bash

    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。

2.服务器设置

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

1>关闭防火墙

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

service iptables status #查看防火墙状态
service iptables start #当即开启防火墙,可是重启后失效。
service iptables stop #当即关闭防火墙,可是重启后失效。
#重启后生效
chkconfig iptables on #开启防火墙,重启后生效。
chkconfig iptables off #关闭防火墙,重启后生效。

2>配置主机名

    文件位置:/etc/sysconfig/network

vim /etc/sysconfig/network

    !!!!!注意安装hadoop的集群主机名不能有下划线!!否则会找不到主机!没法启动!

示例:

 

source /etc/sysconfig/network

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

hostname spark01

3>配置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

4>配置免密登陆

    集群中全部主机都要互相进行免密登陆,包括本身和本身。

    生成密钥:

ssh-keygen

    发送公钥:

ssh-copy-id root@spark01

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

ssh spark01

    经过此命令远程链接,检验是否能够不需密码链接。

    记得免密登陆必定要给本机发送。

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

3.安装jdk

1>解压安装

    将jdk安装包上传、解压安装包,并改名,命令以下:

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

2>配置环境变量

    修改/etc/profile。

    这个文件是每一个用户登陆时都会运行的环境变量设置,当用户第一次登陆时,该文件被执行。并从/etc/profile.d目录的配置文件中搜集shell的设置。

vim /etc/profile

    在文件行尾加入如下内容后保存退出。

JAVA_HOME=/home/software/jdk1.8/
PATH=$PATH:$JAVA_HOME/bin
export JAVA_HOME PATH

4.安装Scala

1>解压安装

    上传解压scala-2.11.0.tgz,并改名,命令以下:

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

2>配置环境变量

修改/etc/profile。

vim /etc/profile

    配置示例:

    上图将Hadoop的环境变量也一块儿配置了,下面也有Hadoop的环境变量配置。

3>从新加载

    从新加载profile使配置生效。

source /etc/profile

    环境变量配置完成,测试环境变量是否生效。

echo $JAVA_HOME
java -version
scala

    如上两步操做,操做完一台以后,能够进行远程拷贝,减小工做量。

2、Zookeeper彻底分布式搭建

    参见:Zookeeper集群的搭建

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

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

一、安装

    直接解压Hadoop压缩包便可。

二、配置

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

1.hadoop-env.sh

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

vim hadoop-env.sh

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

    如图:

 

2.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>

3.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>

4.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>

5.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>

<property>
<!--指定yarn的老大 resoucemanager的地址-->
<name>yarn.resourcemanager.hostname</name>
<value>spark03</value>
</property>
<property>
<!--NodeManager获取数据的方式-->
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>

6.slaves

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

vim slaves

    配置内容以下:

spark04
spark05
spark06

    这里面能够填写主机名,也能够填写ip地址,建议填写主机名,根据以上角色分配填写。

三、环境变量

    若是在上面已经配置过了,此步骤能够忽略

1.配置环境变量

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

vim /etc/profile

    内容以下:

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

    Hadoop的环境变量也能够不配置,可是若是不配置的话,后期命令操做会比较麻烦,须要一直切换目录。配置了环境变量以后,就能够在任何目录下使用Hadoop的命令了。

2.从新加载

source /etc/profile

    从新加载以后才会生效。

四、建立文件夹

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

    在hadoop-2.7.1目录下建立:

    ①journal目录。

    ②建立tmp目录。

    ③在tmp目录下,分别建立namenode目录和datanode目录。

    命令以下:

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

五、拷贝文件

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

    好比向spark02节点传输:

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

    远程拷贝以前要先在其余服务器上建立对应的目录,不然拷贝失败。

六、Hadoop集群启动

1.启动zookeeper集群

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

sh zkServer.sh start

    此命令须要在全部的Zookeeper节点服务器上执行,执行完成可使用如下命令查看启动状态:

sh zkServer.sh status

    如下是查看进程命令:

jps

2.格式化zookeeper

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

sh hdfs zkfc -formatZK

    这个指令的做用是在zookeeper集群上生成ha节点(ns节点)。

    若是配置了Hadoop的环境变量,那么在此节点的任何目录下均可以执行以下命令:

hdfs zkfc -formatZK

 

3.启动journalnode集群

    在0四、0五、06任意节点服务器上,即分配了journalnode角色的节点服务器上,切换到hadoop安装目录的sbin目录下,执行以下命令:

sh hadoop-daemons.sh start journalnode

    注意:此命令执行一次就能够启动全部journalnode节点。以下图,命令使用的是hadoop-daemons.sh,是有s的,启动的时候必定要注意,不要用错了命令。

    而后执行jps命令查看:

    若是此项启动不成功尝试重启,这项启动不成功会影响下一步的格式化。

4.格式化NameNode

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

hadoop namenode -format

5.启动NameNode

1>spark01服务器

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

hadoop-daemon.sh start namenode

 

2>spark02服务器

    首先把spark02服务器的 namenode节点变为standby namenode节点。

    执行命令以下:

hdfs namenode -bootstrapStandby

 

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

hadoop-daemon.sh start namenode

6.启动DataNode

    在spark0四、spark0五、spark06服务器上分别启动datanode节点,在这三台服务器上分别执行以下命令:

hadoop-daemon.sh start datanode

7.启动zkfc

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

hadoop-daemon.sh start zkfc

 

8.启动Resourcemanager

1>spark01服务器

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

start-yarn.sh

    启动成功后,spark0四、spark0五、spark06服务器上的nodemanager 也会跟随启动。

2>spark03服务器

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

yarn-daemon.sh start resourcemanager

七、测试

    在浏览器中输入地址: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端口)

 

4、Spark On Yarn搭建

一、安装

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

    直接解压压缩包便可。

二、配置

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

1.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

2.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状态的节点。

 

3.slaves

    此文件在conf目录下也没有,一样须要赋值模版文件,改名而后编辑,命令以下:

cp slaves.template slaves
vim slaves

    一样在文件末尾直接添加配置内容便可,配置示例以下:

spark04
spark05
spark06

三、上传jar包

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

hadoop fs -mkdir /spark_jars

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

hadoop fs -put ./* /spark_jars

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

    注意:若是是用虚拟机搭建,可能会因为虚拟机内存太小而致使启动失败,好比内存资源太小,yarn会直接kill掉进程致使rpc链接失败。因此,咱们还须要配置Hadoop的yarn-site.xml文件,加入以下两项配置:

    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>

    此项在生产环境不须要配置。

四、启动

1.启动spark shell

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

sh spark-shell --master yarn-client

2.测试

    能够经过yarn控制台来验证。

    至于spark的使用,和以前都是同样的。只不过资源的分配和管理是交给yarn来控制了。

5、重启集群

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

一、启动zookeeper集群

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

sh zkServer.sh start

    此命令一样须要在全部的Zookeeper节点服务器上执行。

二、启动Hadoop集群

1.启动HDFS

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

start-dfs.sh

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

2.启动Yarn

1>spark01服务器

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

start-yarn.sh

    启动成功后,spark0四、spark0五、spark06服务器上的nodemanager 也会跟随启动。

2>spark03服务器

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

yarn-daemon.sh start resourcemanager

 

三、启动spark shell

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

sh spark-shell --master yarn-client

    这样启动,比第一次配置的完成启动简单了不少。

上一篇:Spark简介及彻底分布式安装

下一篇:Spark框架核心概念

相关文章
相关标签/搜索