Spark on Yarn集群配置

--------"道路是曲折的,前途是光明的。"
  最近又涉及到了hadoop以及spark的安装,之前课题设计中有要求安装过hadoop,所以这里直接把hadoop的安装过程以及初入手时出现的问题copy过程,以备份和记录。欢迎交流学习:)

1.环境要求

操作系统:ubuntu14.04 LTS 64位
Spark版本:spark-1.6.0-bin-hadoop2.6
hadoop版本:hadoop2.6.0
scala版本:scala-2.10.4
java版本:java1.8.0_111

2.环境准备

1)修改主机名

目的:方便区分集群中各台机器的名字
我们将搭建1个master,2个slave,在每台物理机上修改主机名,命令如下:
$ sudo vim /etc/hostname
在master上修改为master,其中一个slave上修改为slave1,另一个修改为slave2。
重启后可看到主机名的更改。

2) 配置hosts

在每台主机上修改host文件
$ vim /etc/hosts
根据自己的ip地址配置如下:
211.87.225.107 master
211.87.225.108 slave1
211.87.225.109 slave2
注意:如果一开始把用户名设置的就是master(最好不要这样设置),则在此处注意注释掉127.0.1.1 master。
配置之后ping一下用户名看是否生效
$ ping slave1 -c 3    #只ping3次,否则要按Ctrl+c中断
$ ping slave2 -c 3

3) SSH 免密码登录

目的:使各台机器之间可以无密码ssh。
其原理可参考如下:ssh免密码登录原理

a.安装Openssh server
$ sudo apt-get install openssh-server
b.在所有机器生成私钥和公钥(以便每台机器之间都可以免密码登录)
在每台机器上都执行
$ ssh-keygen -t rsa #一路回车
c.需要让机器间都能相互访问,就把每台机器上的id_rsa.pub发给master节点,传输公钥可以用scp来传输。
$ scp ~/.ssh/id_rsa.pub ubuntu@master:~/.ssh/id_rsa.pub.slave1
$ scp ~/.ssh/id_rsa.pub ubuntu@master:~/.ssh/id_rsa.pub.slave2
d.在master上,将所有公钥加到用于认证的公钥文件authorized_keys中
$ cat ~/.ssh/id_rsa.pub* >> ~/.ssh/authorized_keys
e.将公钥文件authorized_keys分发给每台slave
$ scp ~/.ssh/authorized_keys ubuntu@slave1:~/.ssh/
$ scp ~/.ssh/authorized_keys ubuntu@slave2:~/.ssh/
d.在每台机器上验证SSH无密码通信
$ ssh master
$ ssh slave1
$ ssh slave2
一开始测试的时候可能需要输入yes,把ip地址加入到know_hosts内。
e.如果登陆测试不成功,则可能需要修改文件authorized_keys的权限(权限的设置非常重要,因为不安全的设置安全设置,会让你不能使用RSA功能 )
$ chmod 600 ~/.ssh/authorized_keys

4) 安装java环境

这一步中主要是配置java环境变量。
oracle官网下载最新版 Java 就可以,我下载的是jdk-8u111-linux-x64.tar.gz,spark官网表示只要是6以上的版本都可以。
根据自己的需要在合适的目录下直接解压,比如我的目录是~/workspace.
$ tar -zxvf jdk-8u111-linux-x64.tar.gz
$ sudo vim ~/.bashrc   #修改环境变量
添加下列内容,注意将home路径替换成你自己的:
export JAVA_HOME=/home/ubuntu/workspace/jdk1.8.0_111
export JRE_HOME=/home/ubuntu/workspace/jdk1.8.0_111/jre
export PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
注意linux中环境变量之间用:隔开,而不是,。
$ source ~/.bashrc #生效环境变量
$ java -version #验证 Java 是否安装成功如果打印出如下版本信息,则说明安装成功
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
若出现版本仍为openJDK7,可参考我之前的一篇文章ubuntu14.04安装jdk1.8.0_111

5)安装 Scala

Scala是Spark的原生语言,其底层实现是用的scala语言。官方要求 Scala 版本为 2.10.x,注意不要下错版本,我这里下了 2.10.4,官方下载地址
同样在~/workspace中解压
$ tar -zxvf scala-2.10.4.tgz
mv scala-2.10.4 scala #重命名scala-2.10.4文件(也可忽略,注意修改环境变量时的命名即可)
$ sudo vim ~/.bashrc   #修改环境变量
添加内容:
export PATH=$PATH:/home/ubuntu/workspace/scala/bin
注意把路径换成你自己的安装路径。
$ source ~/.bashrc #生效环境变量
$ scala -version  #验证 scala 是否安装成功,如果打印出如下版本信息,则说明安装成功
Scala code runner version 2.10.4 -- Copyright 2002-2013, LAMP/EPFL

3.安装hadoop并进行配置

1)安装Hadoop2.6.0,

a.下载并校验
下载可以通过http://mirror.bit.edu.cn/apache/hadoop/common/或者http://mirrors.cnnic.cn/apache/hadoop/common/下载,下载时请下载hadoop-2.x.y.tar.gz这个格式的文件,这是编译好的。另外还要下载hadoop-2.x.y.tar.gz.mds,该文件包含了检验值可用于检查hadoop-2.x.y.tar.gz的完整性,否则若文件发生了损坏或下载不完整,Hadoop将无法正常运行。
本文文件通过浏览器下载,默认保存在“Downloads”目录中(若不是请自行更改
tar命令的相应目录)
$ cat ~/Downloads/hadoop-2.6.0.tar.gz.mds | grep 'MD5' #列出md5检验值
$ md5sum ~/Downloads/hadoop-2.6.0.tar.gz | tr "a-z" "A-Z" #计算md5值,并转化为大写,方便比较
ERROR******:
如果两个md5值不同。检查一下自己是不是两个文件都下载了。当时安装时不太仔细。漏下载了一个文件,导致md5值不同。
b.安装
我们选择将Hadoop安装至/home/ubuntu/workspace/中:
$ sudo tar -zxf ~/Downloads/hadoop-2.6.0.tar.gz -C /home/ubuntu/workspace/ #解压至~/worksapce文件夹中
$ cd ~/worksapce #进入文件目录
$ sudo mv ./hadoop-2.6.0/ ./hadoop #将文件夹名改为hadoop
c.检查hadoop
$ cd ~/worksapce/hadoop
$ ./bin/hadoop version
若hadoop安装成功会显示成功的版本信息。
d.配置环境变量(不执行此步骤当输入hdfs命令时会出现无此命令),将Hadoop安装目录加入PATH变量中,这样就可以在任意目录中直接使用hadoop、hdfs等命令了。
$ sudo vim ~/.bashrc
添加如下内容:
export PATH=$PATH:/home/ubuntu/workspace/hadoop/bin:/home/ubuntu/workspace/hadoop/sbin
$ source ~/.bashrc #使变量配置生效

2)配置集群/分布式环境

hadoop配置文件分为两类:一类是只读类型的默认文件(src/core/core-default.xml、src/hdfs/hdfs-default.xml、src/mapred/mapred-default.xml、
conf/mapred-queues.xml);另一类是定位(site-specific)设置,也就是集群
/分布式模式需要修改的配置文件。这里在/home/ubuntu/workspace/hadoop/etc/hadoop仅设置了正常启动所必须的设置项:datanodes、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml以满足实验要求。
首先需要修改的是hadoop_env.sh,把JAVA_HOME=$JAVA_HOME,修改为
JAVA_HOME=/home/ubuntu/workspace/jdk1.8.0_111 #[你的java路径]
否则会在启动时报错找不到JAVA_HOME.

a.修改配置文件中的slaves,本教程让master节点仅作为
Master使用,因此将文件中原来的localhost删除,只添加内容:
slave1
slave2
(一定要注意修改这里)
b.通过gedit编辑修改配置文件core-site.xml —— gedit ./etc/hadoop/core-site.xml,注意,是出现修改的界面而不是直接去编辑的界面,一定要理清自己所在的目录。否则会出现如下问题:


目录正确后修改内容如下:

<configuration> <property> <name>fs.defaultFS</name> <value>hdfs://master:9000/</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/home/ubuntu/workspace/hadoop/tmp</value> </property> </configuration>
c.文件hdfs-site.xml,dfs.replication一般设为3,根据自己的需要设置即可,如果有两个slave节点,则设置为2即可。

`<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>master:50090</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/home/ubuntu/workspace/hadoop/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>

    <value>file:/home/ubuntu/workspace/hadoop/dfs/data</value>
</property>
<property>
    <name>dfs.replication</name>
    <value>3</value>
</property>

</configuration>d.文件mapred-site.xml(需要重命名,默认文件名为mapred-site.xml.template),然后配置修改如下: ![](http://upload-images.jianshu.io/upload_images/3496624-59a917d3b38ed7fc.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>Master:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>Master:19888</value>
</property>
</configuration>e.文件yarn-site.xml,修改配置如下:<configuration>
<property>
  <name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
<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>
<property>
<name>yarn.nodemanager.resource.memory-mb</name>
<value>1024</value>
</property>
<property>
<name>yarn.nodemanager.resource.cpu-vcores</name>
<value>1</value>
</property>
</configuration>我们可以在http://master:19888 下面查看hadoop的历史信息。 f.配置好后,将master上的/home/ubuntu/workspace/hadoop文件夹分发到各个slave节点上。在master节点上执行:$ cd ~/workspace$ tar -zcf ~/hadoop.master.tar.gz ./hadoop   #先压缩再分发$ cd ~$ scp ./hadoop.master.tar.gz slave1:/home/ubuntu同样也需要向slave2分发。 g.在slave节点上执行:$ sudo rm -r home/ubuntu/workspace/hadoop #删掉旧的(如果存在)$ sudo tar -zxf ~/hadoop.master.tar.gz -C /home/ubuntu/workspace #文件夹存放在slave节点的~/workspace目录下`
注意目录一定要和master节点的一致,不然易出错

3)启动hadoop

首次启动需要先在master节点执行namenode的格式化:
$ hdfs namenode -format #首次运行需要执行初始化,之后不需要
注意:只首次初始化即可,因为如果多次启动会导致master和slaves的namenodeID不同,从而会导致datanode节点无法启动。
Tip:
namespaceID是文件系统的唯一标识符,是在文件系统初次格式化时生成的。
其目录位于/the path to hadoop/hadoop/dfs/name/current的VERSION中。
接着可以启动hadoop了,启动需要在master节点上进行:
$ sbin/start-dfs.sh
$ sbin/start-yarn.sh
$ sbin/mr-jobhistory-daemon.sh start historyserver #可查看历史信息
通过命令jps可以查看各个节点所启动的进程。正确的话,在master节点上可以看到Namenode、ResourceManager、SecondryNamenode、JobHistoryServer进程,如下所示:
3385 Jps
2912 SecondaryNameNode
3064 ResourceManager
2702 NameNode
3347 JobHistoryServer
在slave节点上会看到Jps、datanode、NodeManager进程,如下所示:
2902 DataNode
3055 NodeManager
3189 Jps
另外还需要在namenode节点上通过命令hdfs dfsadmin -report(报告文件系统的基本信息和统计信息)查看DataNode是否正常启动,如果Live datanodes不为0,则说明集群启动成功。例如本实验共有2个Datanodes,成功显示会出现:live datanodes (2):等信息。
或者在浏览器中输入 http://master:8088 ,应该有 hadoop 的管理界面出来了,并能看到 slave1 和 slave2 节点。

4.安装并配置Spark

1)下载Spark

进入官方下载地址下载Spark。我下载的是 spark-1.6.0-bin-hadoop2.6.tgz。
在~/workspace目录下解压
$ tar -zxvf spark-1.6.0-bin-hadoop2.6.tgz
$ mv spark-1.6.0-bin-hadoop2.6 spark #原来的文件名太长了,修改为spark
修改环境变量
$ sudo vim ~/.bashrc
加入内容:
export PATH=$PATH:/home/ubuntu/workspace/spark/bin
$ source ~/.bashrc #生效环境变量

2)配置 Spark

$ cd ~/workspace/spark/conf #进入spark配置目录
$ cp spark-env.sh.template spark-env.sh #复制配置模板
$ vim spark-env.sh #添加配置内容
在spark-env.sh末尾添加以下内容(这是我的配置,你可以自行修改):
export SCALA_HOME=/home/ubuntu/workspace/scala
export JAVA_HOME=/home/ubuntu/workspace/jdk1.8.0_111
export HADOOP_HOME=/home/ubuntu/workspace/hadoop
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
SPARK_MASTER_IP=master
SPARK_LOCAL_DIRS=/home/ubuntu/workspace/spark
SPARK_DRIVER_MEMORY=1G
注:在设置Worker进程的CPU个数和内存大小,要注意机器的实际硬件条件,如果配置的超过当前Worker节点的硬件条件,Worker进程会启动失败。
$ vim slaves在slaves文件下填上slave主机名:
slave1
slave2
为了也可以观察到spark集群上的历史信息,我们还需要配置spark-default.conf
$ cp spark-defaults.conf.template spark-defaults.conf #复制配置模板
进行如下修改:
spark.eventLog.enabled true #是否记录Spark事件,用于应用程序在完成后重构webUI
spark.eventLog.dir hdfs://master:9000/user/ubuntu/sparkhistorylogs #保存日志相关信息的路径,可以是hdfs://开头的HDFS路径,也可以是file://开头的本地路径,都需要提前创建.
spark.eventLog.compress true #是否压缩记录Spark事件,前提spark.eventLog.enabled为true,默认使用的是snappy
之后还需要继续修改spark-env.sh,加入如下内容:
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.retainedApplications=3 -Dspark.history.fs.logDirectory=hdfs://master:9000/user/ubuntu/sparkhistorylogs"
参数描述:
spark.history.ui.port=18080 调整WEBUI访问的端口号为18080;
spark.history.fs.logDirectory=hdfs://master:9000/user/ubuntu/sparkhistorylogs 配置了该属性后,在start-history-server.sh时就无需再显示的指定路径;
spark.history.retainedApplications=3 指定保存Application历史记录的个数,如果超过这个值,旧的应用程序信息将被删除。
注意:设置的目录必须存在,可以先创建,不然在启动历史记录时无法启动,报错如下:
failed to launch org.apache.spark.deploy.history.HistoryServer: at org.apache.spark.deploy.history.FsHistoryProvider.<init>(FsHistoryProvider.scala:49) ... 6 more full log in /home/ubuntu/workspace/spark/logs/spark-ubuntu-org.apache.spark.deploy.history.HistoryServer-1-master.out
---------------------------------------
将配置好的spark文件夹分发给所有slaves吧
$ scp -r ~/workspace/spark ubuntu@slave1:~/workspace/

3)启动Spark

$ sbin/start-all.sh
$ sbin/start-history-server.sh
验证 Spark 是否安装成功,用jps检查,
在 master 上应该有以下几个进程:
$ jps
3385 Jps
2912 SecondaryNameNode
7805 Master
3064 ResourceManager
2702 NameNode
3347 JobHistoryServer
3774 HistoryServer
在 slave 上应该有以下几个进程:
$ jps
2902 DataNode
3055 NodeManager
3189 Jps
3858 Worker
进入Spark的Web管理页面: http://master:8080可以看slaves信息;
提交spark应用程序并运行后,进入http://master:18080可以看到历史信息。

4)关闭spark

sbin/stop-all.sh
sbin/stop-history-server.sh #关闭历史记录

参考:
Spark官网
linux公社-spark on yarn集群搭建
给力星-hadoop集群配置

推荐阅读更多精彩内容