Spark学习笔记

Spark平台与业务接入

- - - 星星之火,可以燎原

Spark官网:http://spark.apache.org/


Catalog

0. Are You Ready To Be A Sparker?!
1. Spark平台介绍
2. 业务接入准备

  • 2.1 现在有哪些Spark集群?
  • 2.2 该选用哪个Spark版本?
  • 2.3 怎么接入Spark计算集群?
  • 2.4 任务提交账户和数据准备

3. 业务代码编写与调试

  • 3.1 Java/Scala任务
  • 3.2 Python任务

4. Spark任务提交

  • 4.1 通过cbt提交Spark任务
  • 4.2 在客户端通过命令提交Spark任务
  • 4.3 版本切换
  • 4.4 Python任务提交

5. Spark任务状态跟踪

  • 5.1 SparkOnYarn的任务界面
  • 5.2 查看Driver端日志和输出信息
  • 5.3 查看Driver进程和Executor进程的GC日志
  • 5.4 查看Spark Metrics信息

6. One more thing...

0. Are You Ready To Be A Sparker?!

HI,各位小伙伴,让我们一起开始这趟充满冒险的Spark之旅吧!!!也许之前,你是一名MRer或者Hiver,都没关系,从现在开始,你就是我们Sparker中的一员了。

欢迎你!

1. Spark平台介绍

Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。

Spark是适用于大规模数据处理的快速通用计算引擎。具有以下特点:

  • Speed 全内存计算性能号称可比Hadoop MapReduce快数十至上百倍。
  • Ease of Use Spark支持使用Java、Scala、Python、R来编写业务应用代码。官方也提供了丰富的代码示例供业务开发人员参考。
  • Generality Spark支持HiveSQL、标准SQL(从Spark2.0版本全面支持)查询,流处理(SparkStreaming)和复杂数据分析。Spark2.0版本提供了结构化流(StructStreaming)计算框架,使流数据和静态数据的关联计算更方便易行。
  • Runs Everywhere Spark能够基于Yarn,Mesos等资源管理框架部署,也能够以Standalone模式或者在云上运行。同时Spark能够对接多种数据源,如HDFS,Cassandra,HBase和S3等。

2. 业务接入准备

各位小伙伴,也许你之前或者现在正在使用MapReduce或者Hive(也是基于MR)计算引擎进行业务数据计算,但是对其执行速度真的是忍无可忍了,无奈进入到“晚上跑业务,早上看结果”的循环中。如果你想改变,并且不怕改变,那么跟我来吧!

第一件事,我们来确定你的业务是否适合使用Spark。一般来说,现在使用MapReduce和Hive运行的业务计算逻辑,都可以无缝切换(或者经过适当的逻辑重构)至Spark平台。但是就在最近,我们对Spark2.0版本做了一系列深入的调研和测试,使我们对Spark有了更清晰和真实的认识,一个残酷的现实就是:Spark并不能完全兼容某些MapReduce和Hive计算。

然而,我们是遇到困难就兴奋的Sparker,这点困难怎能把我们吓倒!

后续平台计算引擎升级过程中,Spark团队会对用户反馈的不兼容点进行评审,依据评审结论做相应的适配代码开发或提供其他解决方案。下面先来解答Spark平台新接入用户的一些常见疑问。

2.1 现在有哪些Spark计算集群?

现在正在运行的Spark集群包括测试(sit)和生产(prd)两套环境。

  • 现有测试环境拥有8台Spark计算节点,集群资源较少,假设你刚上手编写了一个Spark业务应用,但对其结果输出并不能确定,可以先在测试集群运行测试。
  • 如果你的业务应用已经较为成熟,经过了相关评审并在测试集群中通过了测试,可以将应用运行在生产环境上。我们强烈建议:应用需经过测试环境测试后才能上线生产环境。

2.2 该选用哪个Spark版本?

目前在每套集群上,我们同时在维护Spark1.5.2和Spark2.0两个版本,经过前期对Spark2.0进行的调研和测试,我们发现业务使用Spark2.0比Spark1.5.2平均会有40%-50%的性能提升,同时Spark2.0版本的功能更强大,比如对标准SQL的兼容性更好。当然,Spark1.5.2版本在苏宁生产环境已经成功运行了千万级的任务量,其稳定性和成熟度经历了考验,可以说,Spark1.5.2版本比Spark2.0版本“实战经验”更丰富,但Spark2.0在性能上的表现更优秀。 我们目前支持的版本可通过http://maven.cnsuning.com/content/repositories/releases/org/apache/spark 下的任何一个子目录查看。 针对Spark-1.5.2.x系列版本,从任一spark-xxx_2.10目录下查看可用版本信息,如:


针对Spark-2.0.2.x系列版本,从任一 spark-xxx_2.11 目录下查看可用版本信息,如:

比如图中,我们在 spark-catalyst_2.10 spark-catalyst_2.11 目录下分别查询到支持spark-1.5.2.1、spark-1.5.2.2、spark-1.5.2.5版本和spark2.0.2.1版本,这些版本就是你创建maven应用工程时可引用的版本。(如何编写调试Spark应用程序: 3. 业务代码编写与调试
对于新用户,我们推荐使用Spark2.0版本。 更多详情:《 Spark 2.0 计算框架推广

2.3 怎么接入Spark计算集群?

假设我已经在本地编译打包了一个Spark应用(见第3章),我怎样将它提交到Spark计算集群呢?对于sit集群,现支持命令行和IDE两种提交任务方式;对于线上prd集群,只支持通过IDE平台提交任务。

  • 通过IDE平台接入Spark sit和prd集群
    我们有一个统一的计算任务提交入口——IDE,通过部门统一申请的用户登录。
    sit-IDE: http://datacloudpre.cnsuning.com
    prd-cbt: http://datacloud.cnsuning.com
    登陆后配置任务流,选择“任务管理”,提交“Spark任务或者Spark-SQL任务”。
    详情见: 4.1 通过ide提交Spark任务

  • 通过Spark客户端接入spark-sit集群
    通过分配账户登录 sit集群spark客户端,客户端上的spark环境均为标准配置,支持直接通过spark-submit命令提交spark任务。支持使用spark-shellspark-sql命令调试spark应用代码。
    详情见: 4.2 在客户端通过命令提交Spark任务
    注意:Spark客户端的接入方式只能用于sit环境下;在prd环境下,无法使用该方式接入。

2.4 任务提交账户和数据准备

假设你第一次使用sit或者prd计算环境,也就是说你的数据并不在这两套环境的HDFS上面,那在运行Spark应用之前,还需要将数据接入或者导入这两套环境中(走业务数据接入流程)。

假设你现在需要使用Spark访问Hive表,需要确认你使用的用户对Hive表有访问或者修改权限,否则Spark应用会报没有相应权限的错误。(需要走Hive表权限开通流程

3. 业务代码编写与调试

3.1 Java/Scala任务

废话不说,直接上图!

第一张很辉煌的代码截图是使用Java编写的,实现了Spark WordCount应用;第二张代码截图是使用Scala代码编写的,实现了同样的功能。如果要选一门语言来开发Spark业务应用,你选哪个?

代码这东西,能不写就不写,能少写就少写。程序是一件以简为美的艺术品,否则大量的代码调试和阅读都是一件令人头痛的事儿。

说了这么多,其实就一句话:作为Sparker必须要拥抱Scala!

Java or Scala
Scala是一种类似Java的编程语言,它无缝结合了命令式编程、面向对象编程和函数式编程的特性。Scala的代码风格比Java更简洁,提供了丰富的语法糖。

Spark源代码绝大部分都是使用Scala编写的,如果要研读Spark源码,弄清Spark的一些底层机制,没有对Scala的了解是做不到的。其实从单纯编写Spark应用来说,选谁都无关紧要,语言只是一个工具,关键要实现安全、稳定、极致、快的业务逻辑才行。或者有些小伙伴想要使用Scala编写Spark应用代码的主体,其他底层的方法库还是使用之前Java语言编写的,这都OK,Scala也可以调用Java的方法、实例化Java类。

下面我使用Scala为例说明一个开发Spark应用的基本流程:

(1)环境准备

  • Java:这个不多说了。推荐Java 7,配置好环境变量。
  • IDEA:去官网下载安装社区版。推荐使用IDEA进行应用代码开发和Spark源码阅读。安装好IDEA后,需要安装Scala插件,参考:IDEA及插件安装
  • Scala:开发Spark-1.5应用程序,必须使用Scala-2.10.4版本;开发Spark-2.0应用程序,必须使用Scala-2.11.8版本,安装完成配置好环境变量。
  • Maven:推荐使用3.3.9版本,配置好环境变量。

下表是我们推荐使用的开发环境软件版本,可点击下载:

软件 版本 下载地址
Java jdk1.7.0_60 java
Maven maven-3.3.9 maven
Scala(for spark-1.5) scala-2.10.4 scala-2.10
Scala(for spark-2.0) scala-2.11.6 scala-2.11
R R-3.2.1 R
Python python-2.7 python

(2)创建Spark maven工程
打开IDEA,配置好Scala SDK和JDK,选择【New Project】,点击Maven:

(3)记得选择enable auto-import

(4)在工程的main目录下创建Scala代码目录

(5)设置scala 源码属性

(6)修改pom.xml
点击下载pom文件:
pom-2.1.0.xml
pom-1.5.2.xml

将此pom文件内容粘贴到新建工程中的pom文件。 下面的字段要根据应用工程实际情况设置:

com.suning.spark-2.0.2.1-test
com.suning.spark-2.0.2.1-test
......

    com.suning.spark-2.0.2.1-test

注意:下面版本需要和集群版本保持一致:
** spark-1.5.2.5版本示例:**

2.10.4
1.5.2.5

** spark-2.0.2.1版本示例:**

2.11.8
2.0.2.1

另外要注意:pom文件中spark相关的包设置provided,无需将其打入应用Jar包。

Tips:版本的选择参考:该选用哪个Spark版本?

(7)新建Scala类文件
在scala代码文件夹下新建Scala类文件:

填写Scala类文件名,选择Kind为Object,点击确定就可以开始编写Scala代码了。

(8)编译打包Spark应用
点击底部【Terminal】,打开命令窗口,输入mvn assembly:assembly命令打包应用。

命令框中显示 BUILD SUCCESS 时即编译打包成功,到【 target 】目录下找到打包成功的应用包,去CBT提交即可。

(9)本地调试Spark应用
如果想在本地进行Spark应用程序调试,需要将Spark相关Jar包导入工程,如基于Spark1.5.2.2版本开发应用,需要导入spark-assembly-1.5.2.2-hadoop2.4.0.7.jar。Spark-assembly Jar 包可以在spark客户端10.27.15.33 /home/bigdata/software/spark-1.5.x.x/lib路径下载。 Jar包导入方法: IDEA点击【File】->【Project Structure】-> 【Project】->【Libraries】,在本地路径找到assembly包,点击OK导入,见下图:

(10)其他问题

  • Spark应用示例
    我们提供了三个Spark应用工程示例,分别是Spark访问HDFS,Hive和HBase数据源的代码。下载地址:http://bdgit.cnsuning.com/bd/Spark-Example/tree/master

3.2 Python任务

环境:
1、使用spark-1.5.2.8版本
2、python使用2.7.9版本

(1)新建python项目:

(2)选择项目存储路径和python版本:

新建一个python package,名称为pySparkTest:

新建python工程主文件,名称为main_python.py:

编写业务代码:

这时候,你可能会发现from pyspark...提示找不到包,因为你需要将spark版本的pyspark包放到指定路径下(本机python安装路径的Lib下面):

pyspark包下载地址:
[spark-1.5.2.8版本]:pyspark_spark-1.5.2.8.tar.gz
[spark-2.1.0.3版本]:pyspark_spark-2.1.0.3.tar.gz

假设现在我有第三方文件需要引入:


我的Demo有个获取HDFS路径的函数,可供主程序调用。在主程序里面通过 from pysparktest.gethdfspath import getHdfsPath 引进来就可以了。

如果有第三方包引入,方法是类似的。现在我们目录结构是这样的:

如果准备提交python任务,将编写的python包打成.zip文件:

然后点击这里查看提交方法。

4. Spark任务提交

4.1 通过cbt提交Spark任务

下面以sit-cbt为例说明Spark任务的提交流程。具体又分为普通Spark任务和Spark-SQL任务:

A. 普通Spark任务提交
登录sit-cbt平台,在左侧树形菜单中点击【任务管理】(图4.1红色框1),再点击【新建】(图4.1红色框2),选择【Spark任务】(图4.1红色框3),点击确定。


图4.1 sit-cbt Spark任务提交页面

确定后弹出Spark任务参数配置窗口,点击【选择】(图4.2红色框1)上传Spark应用JAR包,点击【添加】(图4.2红色框2)添加Spark应用参数,对于一般的Spark应用来说,图中所示的三个参数已经可以保证应用正常运行。
另外,如果有依赖的第三方jar包,可以通过选择CBT Spark任务的--jars参数,将jar包上传。


图4.2 Spark任务参数配置页面

最后,在窗口最后填写任务名称、失败重试次数和任务描述,点击确定关闭。


图4.3 Spark任务描述配置页面

接下来,坐等CBT调度提交的Spark任务。

B. Spark-SQL任务提交
在选择Spark-SQL任务提交时(点击图4.1红色框4),可以点击【选择】(图4.4红色框1)提交已有的sql脚本文件或者点击【编辑SparkSql文件】(图4.4红色框2)在页面中编辑一个sql脚本文件(图4.3红色框3)。点击【添加】(图4.4红色框4)添加Spark-SQL任务参数,Spark-SQL任务需要配置部署模式参数(--master yarn-client)。

图4.4 Spark-SQL任务参数配置页面

在窗口下方填写好任务名称,失败重试次数(默认设置为3)和任务描述,点击确定提交Spark-SQL任务。接下来等待CBT调度Spark-SQL任务。

图4.5 Spark-SQL任务参数配置页面

C. 任务上线
选中新建的任务,点击工具栏【上线】,确认任务状态为上线:

D. 创建任务流及任务流上线
点击左侧树形菜单【 任务流管理 】,点击工具栏【 新建 】:

按需填写任务流参数:

点击【组织任务流】->【手动组织】:

点击【添加任务】,将已上线的Spark任务加入任务流:

最后,将任务流上线,触发Spark任务执行:

E. Spark任务状态查询
点击左侧树形菜单【任务运行状态】,通过输入查询条件,查看Spark任务的运行状态:

Tips:更多CBT Spark任务提交和高级配置详情,请参考豆芽《数据开发产品用户群》共享文件中的相关文档。

4.2 在客户端通过命令提交Spark任务

除了通过CBT提交Spark任务,你也可以使用自己的账户登录Spark客户端,通过spark-submit命令来提交任务。目前此种提交方式只支持在sit环境调试Spark应用使用,生产环境暂不支持。

账户开通:目前平台以部门为单位分配了sit环境的Spark客户端账户(用于调试),若需要该账户,请首先咨询部门账户权限负责人。如果部门还未申请该账户,请联系平台组走账户开通流程。需提供"公司/中心+ 部门+工号+姓名+部门或者系统英文简称"信息。

假设我现在已经在Spark客户端10.27.15.**上面有一个账户bigdata,并且打包了一个Spark应用SparkWithHive.jar,下面我们来提交这个任务。
对应命令:spark-submit --class SparkWithHive --master yarn-cluster /home/bigdata/zy/SparkWithHive.jar


提交任务后,可以通过日志查询到Spark任务被Yarn接受,并处于RUNNING状态,同时可以查询到这个任务的AppID: application_1479983160038_36435 ,见下图标注:
在图中,你还可以查询到该任务的最后状态final status:SUCCESS,说明你提交的任务运行成功了。任务执行中或者执行结束后,你可以通过AppID在Spark WebUI上查询到你的任务执行详情(具体内容见 5. Spark任务状态跟踪 )。

命令行模式下直接键入命令spark-submit,我们可以得到spark-submit支持的提交参数,包括但不限于下图显示的参数:


关于Spark配置参数更多详情,请参考: SPARK-Configuration
常用的几个参数:
  • --master:设置任务提交模式。默认使用yarn-cluster,如果想直接在提交客户端查看任务运行日志,可使用yarn-client模式。
  • --num-executors:调节Executor的数目,可提高任务并发度。
  • --executor-memory:调节Executor内存大小,如数据量较大,Executor进程遭遇GC瓶颈,可适当调大此参数。
  • --driver-memory:调节driver端内存大小。如driver端需要接受较多的executor返回数据,适当调大此参数。
  • --queue:设置队列名称。每个部门都有一个YARN资源队列,设置该参数是激昂Spark任务提交到该队列中。

如果将我上面使用的提交命令通过参数配置完整,就是:
spark-submit --class SparkWithHive --master yarn-cluster --num-executors 3 --executor-memory 4g --driver-memory 4g --queue bigdata /home/bigdata/zy/SparkWithHive.jar

4.3 版本切换

目前sit环境spark支持多版本,你可以分别依赖spark1.5和spark2.0编译应用,在spark客户端使用不同版本提交任务。假设我使用bigdata账户登录了一台客户端,登录后的初始化版本是spark1.5.2.5,你可以使用命令source change_spark_version spark-2.0.2.1切换版本,见下图实例:

使用 change_spark_version 命令可以查看当前的spark版本( Current version ),当前所有可用的spark版本( Available version )和版本切换示例命令。在完成版本切换后,就可以直接使用spark-submit命令提交对应版本的应用程序了。

Tips:重新登录客户端或者使用source change_spark_version spark-1.5.2.5命令可以切换回spark1.5.2版本。

4.4 Python任务提交

目前CBT平台正在开发pyspark任务的提交功能, 【临时方案】现有CBT功能支持python_on_spark提交.pdf

或者可以通过客户端spark-submit手动提交任务: 将打包好的pySparkTest.zipmain_python.py主文件传送到客户端上,用命令

spark-submit --master yarn-cluster --py-files pySparkTest.zip main_python.py  

提交就可以了。

当然你也可以在客户端用pyspark脚本本地启动pyspark,启动调试模式,运行python代码:

5. Spark任务状态跟踪

Spark任务提交以后,可以通过浏览器查看Spark任务的执行日志。

  • sit环境任务WEB地址:http://namenode2-sit.cnsuning.com:8088
  • prd环境任务WEB地址:http://namenode2-prd3.cnsuning.com:8088
  • SSMP-PRD环境任务WEB地址:http://slave524-prd3.cnsuning.com:8088

任务运行过程中,查看Driver和Executor的日志,有可能会因为网络隔离的原因打不开,请使用Window运维机进行访问。 windows运维机申请请至“ITSM》服务目录》服务器相关》操作系统相关变更申请”提流程,其中,应用系统名称为“BD(海量数据平台)”,环境为“PRD”,内容为“申请Windows运维机用户。”。并提供“公司/中心+ 部门+工号+姓名"。

5.1 SparkOnYarn的任务界面

图5.1 SparkOnYarn任务页面
通过图5.1中红色框1任务名或者图中红色框2搜索用户名可以找到自己提交的Spark任务,通过点击图中红色框3可以查看Spark任务的信息和日志,如图5.2,其中显示了该任务的最终状态,点击【 logs 】可以查看任务driver端日志和主程序的输出信息,如图5.3:
图5.2 Spark任务页面

5.2 查看Driver端日志和输出信息

图5.3 Spark任务Driver端日志和输出信息

5.3 查看Driver进程和Executor进程的GC日志

在应用调优中,可能需要查看Spark Driver或者Executor进程的GC日志(生产环境需要Windows运维机权限),打开Spark UI的Executor页面,可以看到进程列表,点击需要查看的Driver进程或者Executor进程的stderr、stdout日志链接转到日志界面:


图5.4 Spark UI Executor页面

在日志页面第一部分即是进程的gclog信息:

图5.5 Spark UI Executor页面

5.4 查看Spark Metrics信息

通过点击图5.2中红色框4可以查看Spark应用中job、Stage和task的执行详情,Spark任务的调优和错误排除依据主要来自该链接下的一系列页面,如图5.6:

图5.6 Spark任务详情页面
红色框中共有五个标签页,分别展示了Jobs,Stages,Storage,Environment和Executors的详情。

点击Executor标签打开页面,可以查看Executor端日志:

点击Environment标签打开页面,查看任务配置参数和运行环境:

One more thing...

后期,平台团队的贺岁大作--《华佗自动化异常检测平台》即将上线,剧透两个亮点:

  • 该平台将捕获Spark任务执行异常与Spark内核的核心执行逻辑信息,解析后展示在WEB页面。同时通过维护一个知识库组件,将历次发生的异常进行分析归类,小伙伴们不再需要阅读繁杂的日志即可找到异常产生的原因。
  • 该平台还会从任务的占用资源量、CPU和内存利用率等多个维度对Spark任务进行分析,并做评分。

你可能感兴趣的:(Spark学习笔记)