Spark官网:http://spark.apache.org/
0. Are You Ready To Be A Sparker?!
1. Spark平台介绍
2. 业务接入准备
3. 业务代码编写与调试
4. Spark任务提交
5. Spark任务状态跟踪
6. One more thing...
HI,各位小伙伴,让我们一起开始这趟充满冒险的Spark之旅吧!!!也许之前,你是一名MRer或者Hiver,都没关系,从现在开始,你就是我们Sparker中的一员了。
欢迎你!
Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop MapReduce的通用并行框架,Spark拥有Hadoop MapReduce所具有的优点;但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
Spark是适用于大规模数据处理的快速通用计算引擎。具有以下特点:
各位小伙伴,也许你之前或者现在正在使用MapReduce或者Hive(也是基于MR)计算引擎进行业务数据计算,但是对其执行速度真的是忍无可忍了,无奈进入到“晚上跑业务,早上看结果”的循环中。如果你想改变,并且不怕改变,那么跟我来吧!
第一件事,我们来确定你的业务是否适合使用Spark。一般来说,现在使用MapReduce和Hive运行的业务计算逻辑,都可以无缝切换(或者经过适当的逻辑重构)至Spark平台。但是就在最近,我们对Spark2.0版本做了一系列深入的调研和测试,使我们对Spark有了更清晰和真实的认识,一个残酷的现实就是:Spark并不能完全兼容某些MapReduce和Hive计算。
然而,我们是遇到困难就兴奋的Sparker,这点困难怎能把我们吓倒!
后续平台计算引擎升级过程中,Spark团队会对用户反馈的不兼容点进行评审,依据评审结论做相应的适配代码开发或提供其他解决方案。下面先来解答Spark平台新接入用户的一些常见疑问。
现在正在运行的Spark集群包括测试(sit)和生产(prd)两套环境。
目前在每套集群上,我们同时在维护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应用(见第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-shell
和spark-sql
命令调试spark应用代码。
详情见: 4.2 在客户端通过命令提交Spark任务
注意:Spark客户端的接入方式只能用于sit环境下;在prd环境下,无法使用该方式接入。
假设你第一次使用sit或者prd计算环境,也就是说你的数据并不在这两套环境的HDFS上面,那在运行Spark应用之前,还需要将数据接入或者导入这两套环境中(走业务数据接入流程)。
假设你现在需要使用Spark访问Hive表,需要确认你使用的用户对Hive表有访问或者修改权限,否则Spark应用会报没有相应权限的错误。(需要走Hive表权限开通流程)
废话不说,直接上图!
代码这东西,能不写就不写,能少写就少写。程序是一件以简为美的艺术品,否则大量的代码调试和阅读都是一件令人头痛的事儿。
说了这么多,其实就一句话:作为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 | 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类文件:
(8)编译打包Spark应用
点击底部【Terminal】,打开命令窗口,输入mvn assembly:assembly
命令打包应用。
(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)其他问题
环境:
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
假设现在我有第三方文件需要引入:
from pysparktest.gethdfspath import getHdfsPath
引进来就可以了。
如果有第三方包引入,方法是类似的。现在我们目录结构是这样的:
如果准备提交python任务,将编写的python包打成.zip
文件:
然后点击这里查看提交方法。
下面以sit-cbt为例说明Spark任务的提交流程。具体又分为普通Spark任务和Spark-SQL任务:
A. 普通Spark任务提交
登录sit-cbt平台,在左侧树形菜单中点击【任务管理】(图4.1红色框1),再点击【新建】(图4.1红色框2),选择【Spark任务】(图4.1红色框3),点击确定。
确定后弹出Spark任务参数配置窗口,点击【选择】(图4.2红色框1)上传Spark应用JAR包,点击【添加】(图4.2红色框2)添加Spark应用参数,对于一般的Spark应用来说,图中所示的三个参数已经可以保证应用正常运行。
另外,如果有依赖的第三方jar包,可以通过选择CBT Spark任务的--jars参数,将jar包上传。
最后,在窗口最后填写任务名称、失败重试次数和任务描述,点击确定关闭。
接下来,坐等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)。
在窗口下方填写好任务名称,失败重试次数(默认设置为3)和任务描述,点击确定提交Spark-SQL任务。接下来等待CBT调度Spark-SQL任务。
C. 任务上线
选中新建的任务,点击工具栏【上线】,确认任务状态为上线:
按需填写任务流参数:
点击【组织任务流】->【手动组织】:
点击【添加任务】,将已上线的Spark任务加入任务流:
最后,将任务流上线,触发Spark任务执行:
E. Spark任务状态查询
点击左侧树形菜单【任务运行状态】,通过输入查询条件,查看Spark任务的运行状态:
Tips:更多CBT 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
application_1479983160038_36435
,见下图标注:
命令行模式下直接键入命令spark-submit,我们可以得到spark-submit支持的提交参数,包括但不限于下图显示的参数:
yarn-client
模式。如果将我上面使用的提交命令通过参数配置完整,就是:spark-submit --class SparkWithHive --master yarn-cluster --num-executors 3 --executor-memory 4g --driver-memory 4g --queue bigdata /home/bigdata/zy/SparkWithHive.jar
目前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版本。
目前CBT平台正在开发pyspark任务的提交功能, 【临时方案】现有CBT功能支持python_on_spark提交.pdf
或者可以通过客户端spark-submit
手动提交任务: 将打包好的pySparkTest.zip
和main_python.py
主文件传送到客户端上,用命令
spark-submit --master yarn-cluster --py-files pySparkTest.zip main_python.py
提交就可以了。
当然你也可以在客户端用pyspark脚本本地启动pyspark,启动调试模式,运行python代码:
Spark任务提交以后,可以通过浏览器查看Spark任务的执行日志。
任务运行过程中,查看Driver和Executor的日志,有可能会因为网络隔离的原因打不开,请使用Window运维机进行访问。 windows运维机申请请至“ITSM》服务目录》服务器相关》操作系统相关变更申请”提流程,其中,应用系统名称为“BD(海量数据平台)”,环境为“PRD”,内容为“申请Windows运维机用户。”。并提供“公司/中心+ 部门+工号+姓名"。
在应用调优中,可能需要查看Spark Driver或者Executor进程的GC日志(生产环境需要Windows运维机权限),打开Spark UI的Executor页面,可以看到进程列表,点击需要查看的Driver进程或者Executor进程的stderr、stdout日志链接转到日志界面:
在日志页面第一部分即是进程的gclog信息:
通过点击图5.2中红色框4可以查看Spark应用中job、Stage和task的执行详情,Spark任务的调优和错误排除依据主要来自该链接下的一系列页面,如图5.6:
点击Executor标签打开页面,可以查看Executor端日志:
点击Environment标签打开页面,查看任务配置参数和运行环境:
后期,平台团队的贺岁大作--《华佗自动化异常检测平台》即将上线,剧透两个亮点: