Spark on YARN集群环境搭建

Spark 官方提供了三种集群部署方案: Standalone, Mesos, YARN。其中 Standalone 最为方便,官网有搭建教程,本文主要讲述结合 YARN 的部署方案。关于YARN和Hadoop的介绍可以看看这个 YARN 简介

环境准备

注:下面的操作都是以root的角色操作的,如果不是root用户大部分命令都需要sudo

1.Server环境准备

1.1 修改主机名

修改主机名的目的一是为了方便后续管理,一眼能看出每台机器的角色;二是Spark和Hadoop很多配置都是使用master、slave这样的hostname,方便配置文件的重用。。
这里搭建的是1个master,2个slave的集群方案,主机名分别为master、slave1、slave2。修改主机名的操作:

vim /etc/sysconfig/network #修改HOSTNAME=$your_host_name
sysctl kernel.hostname = $your_host_name #使改变立即生效
# 或者使用
# echo $your_host_name  > /proc/sys/kernel/hostname

两种方式修改后当前会话的hostname还是不会变化,exit后再reconnect一下就好了,这部分更详细的解释可以看这里

1.2 配置hosts

在每台主机上修改host文件,目的同上

vim /etc/hosts
192.168.0.1 master
192.168.0.2 slave1
192.168.0.3 slave2

配置完之后相互ping一下看是否生效

1.3 SSH免密码登录

后续的操作经常会用到在各个节点之间分发配置文件,配置免密登录可以更方便切换到不同的节点。
在所有机器上都生成私钥和公钥

ssh-keygen -t rsa   #一路回车

需要让机器间都能相互访问,就把每个机子上的id_rsa.pub发给master节点,传输公钥可以用scp来传输。

# 在slave1上执行,将slave1的id_rsa.pub发给master
scp ~/.ssh/id_rsa.pub root@master:~/.ssh/id_rsa.pub.slave1

在master上,将所有公钥加到用于认证的公钥文件authorized_keys

cat ~/.ssh/id_rsa.pub* >> ~/.ssh/authorized_keys

将公钥文件authorized_keys分发给每台slave

# 发给slave1
scp ~/.ssh/authorized_keys root@slave1:~/.ssh/
# 发给slave2
scp ~/.ssh/authorized_keys root@slave2:~/.ssh/

在每台机器上验证SSH无密码通信

ssh master
ssh slave1
ssh slave2

如果登陆测试不成功,则可能需要修改文件authorized_keys的权限(权限的设置非常重要,因为不安全的设置安全设置,会让你不能使用RSA功能 )

chmod 600 ~/.ssh/authorized_keys

2.安装配置Java

(如果已有Java环境,可以跳过这步)
从官网下载正确的版本,然后解压

tar -zvxf jdk-8u91-linux-i586.tar.gz

修改环境变量(也可以解压完scala后一起修改,省事)

vim /etc/profile

# 添加以下内容
# environment for spark
export JAVA_HOME=/data2/java/jdk1.8.0_91

export PATH=$JAVA_HOME/bin::$PATH
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib

使环境变量生效

source /etc/profile

3.安装配置Scala

下载,解压

tar -zvxf scala-2.11.8.tgz

为了方便管理,可以将java、scala、spark等软件包解压在同一个目录下。这里在/data2下建立了java、scala、spark、hadoop的目录,用来放解压后的文件。

vim /etc/profile修改环境变量,并 source /etc/profile生效
可以使用scala -version查看是否配置成功

4.安装配置Hadoop YARN

4.1下载解压

tar -zvxf hadoop-2.7.3.tar.gz

4.2配置Hadoop

cd /data2/hadoop/hadoop-2.7.3/etc/hadoop进入配置目录,需要配置有以下7个文件:hadoop-env.sh,yarn-env.sh,slaves,core-site.xml,hdfs-site.xml,maprd-site.xml,yarn-site.xml

  • hadoop-env.sh中配置JAVA_HOME

    # The java implementation to use.
    export JAVA_HOME=/home/spark/workspace/jdk1.7.0_75
    

    hadoop-env.sh记录脚本要用的环境变量,以运行Hadoop

  • yarn-env.sh中配置JAVA_HOME

    # some Java parameters
    export JAVA_HOME=/home/spark/workspace/jdk1.7.0_75
    
  • slaves中配置slave节点的ip或者host,纯文本文件,没有的话创建一个,一行表示一个节点

    slave1
    slave2
    
  • 修改core-site.xml

    <configuration>
      <property>
          <name>fs.defaultFS</name>
          <value>hdfs://master:9000/</value>
      </property>
      <property>
           <name>hadoop.tmp.dir</name>
           <value>file:/data2/hadoop/hadoop-2.7.3/tmp</value>
      </property>
    </configuration>
    

    Hadoop Core的配置项,例如HDFS和MapReduce常用的IO设置等。

  • 修改hdfs-site.xml

    <configuration>
      <property>
          <name>dfs.namenode.secondary.http-address</name>
          <value>master:9001</value>
      </property>
      <property>
          <name>dfs.namenode.name.dir</name>
          <value>file:/data2/hadoop/hadoop-2.7.3/dfs/name</value>
      </property>
      <property>
          <name>dfs.datanode.data.dir</name>
          <value>file:/data2/hadoop/hadoop-2.7.3/dfs/data</value>
      </property>
      <property>
          <name>dfs.replication</name>
          <value>3</value>
      </property>
    </configuration>
    

    Hadoop守护进程的配置项,包括namenode、辅助namenode和datanode等

  • 修改yarn-site.xml

    <configuration>
      <property>
          <name>yarn.nodemanager.aux-services</name>
          <value>mapreduce_shuffle</value>
      </property>
      <property>
          <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name>
          <value>org.apache.hadoop.mapred.ShuffleHandler</value>
      </property>
      <property>
          <name>yarn.resourcemanager.address</name>
          <value>master:8032</value>
      </property>
      <property>
          <name>yarn.resourcemanager.scheduler.address</name>
          <value>master:8030</value>
      </property>
      <property>
          <name>yarn.resourcemanager.resource-tracker.address</name>
          <value>master:8035</value>
      </property>
      <property>
          <name>yarn.resourcemanager.admin.address</name>
          <value>master:8033</value>
      </property>
      <property>
          <name>yarn.resourcemanager.webapp.address</name>
          <value>master:8088</value>
      </property>
    </configuration>
    
  • 将配置好的hadoop文件夹分发给所有slaves吧

    scp -r ~/data2/hadoop root@slave1:/data2/
    

    后面的spark配置也一样,可以先在master上配好后再分发到slave上

4.3.启动Hadoop

在 master 上执行以下操作,就可以启动 hadoop 了。

cd ~/data2/hadoop/hadoop-2.7.3     #进入hadoop目录
bin/hadoop namenode -format     #格式化namenode,这个只在初始化的时候执行就好,后面再启动不需要执行
sbin/start-dfs.sh               #启动dfs
sbin/start-yarn.sh              #启动yarn

4.4验证 Hadoop 是否安装成功

可以通过jps命令查看各个节点启动的进程是否正常。在 master 上应该有以下几个进程:

$ jps  #run on master
3407 SecondaryNameNode
3218 NameNode
3552 ResourceManager
3910 Jps

在每个slave上应该有以下几个进程:

$ jps   #run on slaves
2072 NodeManager
2213 Jps
1962 DataNode

在浏览器中输入http://192.168.0.1:8088,应该有 hadoop 的管理界面出来了,并能看到 slave1 和 slave2 节点。

5 Spark安装

5.1下载解压

tar -zvxf spark-2.0.0-bin-hadoop2.7.tgz

5.2配置Spark

cd /data2/spark/spark-2.0.0-bin-hadoop2.7/conf    #进入spark配置目录
cp spark-env.sh.template spark-env.sh   #从配置模板复制
vi spark-env.sh     #添加配置内容

在spark-env.sh末尾添加以下内容

export SCALA_HOME=/home/spark/workspace/scala-2.10.4
export JAVA_HOME=/home/spark/workspace/jdk1.7.0_75
export HADOOP_HOME=/home/spark/workspace/hadoop-2.6.0
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
SPARK_MASTER_IP=master
SPARK_LOCAL_DIRS=/home/spark/workspace/spark-1.3.0
SPARK_DRIVER_MEMORY=1G

注:在设置Worker进程的CPU个数和内存大小,要注意机器的实际硬件条件,如果配置的超过当前Worker节点的硬件条件,Worker进程会启动失败。

vi slaves在slaves文件下填上slave主机名:

slave1
slave2

将配置好的spark文件夹分发给所有slaves吧

scp -r /data2/spark root@slave1:/data2/

5.3启动Spark

sbin/start-all.sh

5.4验证 Spark 是否安装成功

用jps检查,在 master 上应该有以下几个进程:

$ jps
7949 Jps
7328 SecondaryNameNode
7805 Master
7137 NameNode
7475 ResourceManager

在 slave 上应该有以下几个进程:

$ jps
3132 DataNode
3759 Worker
3858 Jps
3231 NodeManager

进入Spark的Web管理页面:http://192.168.0.1:8080

5.5运行示例

#本地模式两线程运行
./bin/run-example SparkPi 10 --master local[2]

#Spark Standalone 集群模式运行
./bin/spark-submit \
  --class org.apache.spark.examples.SparkPi \
  --master spark://master:7077 \
  lib/spark-examples-1.3.0-hadoop2.4.0.jar \
  100

#Spark on YARN 集群上 yarn-cluster 模式运行
./bin/spark-submit \
    --class org.apache.spark.examples.SparkPi \
    --master yarn-cluster \  # can also be `yarn-client`
    lib/spark-examples*.jar \
    10

注意 Spark on YARN 支持两种运行模式,分别为yarn-cluster和yarn-client,具体的区别可以看这篇博文,从广义上讲,yarn-cluster适用于生产环境;而yarn-client适用于交互和调试,也就是希望快速地看到application的输出。

本文总阅读量