ITPub博客

首页 > 数据库 > 数据库开发技术 > 5.Spark 编译与预编译

5.Spark 编译与预编译

原创 数据库开发技术 作者:BigData之路 时间:2018-05-14 09:10:00 0 删除 编辑

        在几篇理论过后,本篇让我们动动手,实操安装部署一个Spark环境,以供后续的学习探究。Spark的环境有预编译和源码编译两种方式,在官网可选择安装包,如下所示

一、预编译

        在Apache官网找到最新的Spark预编译版本,这里选择的是spark-2.3.0-bin-hadoop2.7.tgz

1、需要注意的是,从Spark2.2版本开始不再兼容java1.7,因此选用java1.8版本(安装过程略)

2、解压tar包

tar xvf  spark-2.3.0-bin-hadoop2.7.tgz

3、添加环境变量

export JAVA_HOME=/usr/java/jdk1.8.0_65

export SPARK_HOME=/home/hadoop/spark-2.2.0-bin-hadoop2.7

export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin:$JAVA_HOME/bin

        此时我们的spark 就安装好了,没错,确实已经安装好了!是不是开箱即用。

接下来我们使用spark自带的pi的示例程序,检测下spark环境是否正常,如下所示:

run-example SparkPi 10


二、源码编译

        为了最大化Spark版本兼容性,可以针对实际集群版本进行源码编译。这里我们使用Maven进行编译(当然使用SBT也可),Spark版本为的2.3.0。

1、maven部署

1.1 这里选择的版本是3.5.3,下载maven软件包,并解压

1.2 添加环境变量

export MAVEN_HOME=/home/hadoop/apache-maven-3.5.3

(使用国内源则改为 export M2_HOME=/home/hadoop/apache-maven-3.5.3)

export PATH=$PATH:$MAVEN_HOME/bin

1.3 执行mvn -v,结果如下,此时maven就安装好了

1.4 由于官方源比较慢,修改配置文件,添加国内阿里的镜像源

进入maven中的conf,修改settings.xml文件

<mirror>

    <id>nexus-aliyun</id>

    <mirrorOf>*</mirrorOf>

    <name>Nexus aliyun</name>

    <url>http://maven.aliyun.com/nexus/content/groups/public</url>

</mirror>

2、编译spark源码

2.1 这里选择的版本是2.3.0,下载Spark 源码包,并解压
2.2 进入到spark-2.3.0目录下,开始针对Spark基础包进行编译
mvn -Dhadoop2.7 -DskipTests clean package

具体编译多久,就看网速决定了。。。

   编译完成后,如上图所示。当然也可以通过编译生成Spark安装包,用于多个节点的安装。

./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Psparkr -Phadoop-2.7 -Phive -Phive-thriftserver -Pmesos -Pyarn -Pkubernetes

   执行完成后,Spark的主目录下会出现一个spark的二进制压缩包

 三、语言终端   

        在《Spark简介》中,我们有提到,Spark支持scala、python、R和Java语言。Spark对其中三种提供了轻量级的交互终端。

       对于scala 语言来说,需要通过spark-shell执行。如下所示

        对于python语言来说, 需要提前安装python环境,要求python2.7+,通过pyspark执行对于R语言来说,需要提前安装好R依赖,对R版本无特殊要求,通过sparkR执行。此处就不上图了。

        对于Java来说,Spark并没有提供直观的交互性终端,只提供了Spark-submit的方式提交任务。(虽然看似Spark对Java累觉不爱,但是实际上,Spark所有的语言终端都是根据Spark-submit来完成)

        各种终端来说,有默认的启动参数,如果你希望根据不同的环境进行适配的话,需要通过其他参数进行指定,查看参数可以通过 --help 查看,如下所示。


四、终端解析

       介绍了常用终端以后,我们来看看这种终端是如何实现的,还是以Spark-shell为例。在Spark-shell脚本的前半部分,检查了系统环境,设置了Shell为POSIX的标准模式,并且声明了环境变量。着重说一下SPARK_SUBMIT_OPTS这个环境变量,如下所示,Spark-shell是为scala提供的交互式终端,默认情况下是不会使用Java的ClassPath的,所以需要显示指定。

SPARK_SUBMIT_OPTS="$SPARK_SUBMIT_OPTS -Dscala.usejavacp=true"     

       上图为Spark-shell的主函数,在主函数中首先使用stty关闭了回显示,然后使用spark-submit去调用 org.apache.spark.repl.Main 类。我们再看看spark-submit中是做了什么。

        spark-submit直接通过spark-class调用了org.apache.spark.deploy.SparkSubmit类。我们再来看看spark-class中的内容,在spark-class中,有很大篇幅都是重新声明环境变量(SPARK_HOME、JAVA_HOME、lib包),最主要的就是下面的内容。调用的是org.apache.spark.launcher.Main 这个类。

         org.apache.spark.launcher.Main 类中会判断传入的Class Name,然后通过SparkSubmitCommandBuilder方法判断传不同类型客户端的传参,紧接着根据对应客户端类型,构造spark的提交命令。


如有疑问,可公众号留言和微信联系

推荐关注BigData之路。第一时间,分享更多干货,BigData之路与你共同成长,欢迎关注和转发。







原文作者:BigData之路;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2018-04-22

  • 博文量
    24
  • 访问量
    8859