Spark on Yarn集群配置

作者: 九七学姐 | 来源:发表于2016-12-07 17:15 被阅读694次

    --------"道路是曲折的,前途是光明的。"
      最近又涉及到了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:https://img.haomeiwen.com/i3496624/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集群配置

    相关文章

      网友评论

      • f7db194709b4:简书上的文章质量就是高,简介清晰,赞作者。
        九七学姐:@鹰隼_23ae 谢谢:blush:
        九七学姐:@鹰隼_23ae 你配置历史信息存储的位置是存在的吗?
        f7db194709b4:求问作者:
        我按照步骤配置了历史信息,但是出现下面问题,是怎么回事儿?
        root@yarn-test-1:/home/users/shaokaiyang/spark-1.6.3/sbin# ./start-history-server.sh
        starting org.apache.spark.deploy.history.HistoryServer, logging to /home/users/shaokaiyang/spark-1.6.3/logs/spark-root-org.apache.spark.deploy.history.HistoryServer-1-yarn-test-1.out
        failed to launch org.apache.spark.deploy.history.HistoryServer:
        Error: Could not create the Java Virtual Machine.
        Error: A fatal exception has occurred. Program will exit.
        full log in /home/users/shaokaiyang/spark-1.6.3/logs/spark-root-org.apache.spark.deploy.history.HistoryServer-1-yarn-test-1.out
        谢谢指教!

      本文标题:Spark on Yarn集群配置

      本文链接:https://www.haomeiwen.com/subject/fegdmttx.html