过程完整:从基础配置过程一直到真正的商业项目开发
例子丰富:90个“实例”,1 个完整项目
原理清晰:重点概念、操作、思路都有图示,避免抽象理解
代码详尽:所有实例都有详细的代码,所有代码都有详尽的解读
知识点新:包含Structured Streaming详解
阅读感好:采用短段、短句,可以流畅阅读
辐射面广:讲解了Spark与周边框架的交互
服务完善:读者可加入本书QQ学习群在线交流
本书基于Spark 2.3.x、Spark 2.4.x系列版本,采用“理论+实践”的形式编写。全书共有90个实例,1个完整项目。
第1篇“准备”,包括认识大数据和Spark、安装与配置Spark集群、第1个Spark程序;
第2篇“入门”,包括读写分布式数据、处理分布式数据;
第3篇“进阶”,包括RDD的高级操作、用SQL语法分析结构化数据、实时处理流式数据;
第4篇“高阶”,包括实时处理流式数据、Spark的相关优化;
第5篇“商业项目实战”,用Spark的各种组件实现一个学生学情分析商业项目。
本书结构清晰、实例丰富、通俗易懂、实用性强,特别适合Spark的初学者和进阶读者作为自学用书。另外,本书也适合社会培训学校作为培训教材,还适合大中专院校的相关专业作为教学参考书。
第3章 第1个Spark程序
-学习编程语言首先需要安装开发环境,并编写“Hello World”代码,然后编译、运行。而学习框架可能会麻烦一点:首先准备安装环境、部署相关服务、修改配置文件,让框架服务-稳定运行在集群之中;然后编写并编译代码;最后将编译好的程序提交到集群中运行。
本章将主要介绍如何编写、编译程序,并将程序提交到集群中运行。
-
/3.1 运行第1个Spark程序
在运行第一个Spark程序之前,需要先了解提交并运行程序的流程。
(1)在提交一个Spark程序时,用于提交该程序的窗口被称为Client(客户)端。提交后的程序会向Master服务申请资源,并启动一个Driver进程,其中包含该程序的全部代码。
(2)每个Worker服务会启动Executor进程,该进程负责与Driver进程建立RPC通信,用于接收并运行Driver进程派发过来的任务,并将任务的执行状态持续反馈给Driver进程。
接下来准备运行第1个Spark程序——求Pi的值。
-
∣3.1.1 实例5:基于Standalone模式运行第1个Spark程序
----------------
实例描述
使用蒙特卡洛算法求Pi的值。
----------------
读者可根据如下步骤完成实例。
/
1. 提交程序
进入Spark的安装目录,通过脚本提交程序,见代码3-1。
--代码3-1 提交Spark官方案例任务----------------------
[admin@linux01 spark-2.3.1-bin-hadoop2.7]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://linux01:7077 \
--executor-memory 1G \
--total-executor-cores 3 \
/home/admin/modules/spark-2.3.1-bin-hadoop2.7/examples/jars/spark-exampl
es_2.11-2.3.1.jar \
100
------------------------------------------------------------------------------
上述代码中的参数解释如下:
-代码第02行,通过“--class”参数设置jar包中入口类的类名。
-代码第03行,通过“--master”参数设置Master服务的通信地址,包含机器的IP地址和端口号。
-代码第04行,通过“--executor-memory”参数设置每一个Executor进程的可用内存。如果任务运行时所使用的内存超过该值,则会出现虚拟机内存溢出错误。
-代码第05行,通过“--total-executor-cores”参数设置集群中一共可以调度多少个CPU内核(CPU Cores)来执行任务。一个CPU内核在同一时间内只能运行一个任务(Task)。在设置该参数时,需要结合机器硬件资源的配置情况。例如,分配到的CPU内核越多,则任务的并行度越高,任务完成的时间也越短。
-代码第06行,指定jar包的位置。该jar包中包含要运行的程序。
-代码第07行,“100”为程序参数,该参数会被传递到主方法中。该参数用于指定随机“点”的个数。
/
2. 观察与总结
在上述操作中,即使没有明显的报错信息,也应该去看一下任务日志。这是一个非常好的习惯。下面将通过Spark历史服务(History Server)页面来查看任务日志。
(1)查看Spark的历史任务。
在任务成功运行后,可以看到Pi的粗略值已经被计算出来了:Pi is roughly 3.1417199141719916。
此时来到Spark历史服务页面“http://linux01:4000”,可以看到该任务日志,如图3-1所示。
图3-1 Spark的历史服务页面
单击右侧的“Download”按钮可以完整地下载任务日志。
该日志文件实际上存储于第2章所配置的HDFS目录中,也可以通过HDFS页面下载该日志文件。
/
(2)查看HDFS中的日志文件。
访问“http://linux01:50070/explorer.html#/spark-logs”,来到HFDS的“/spark-logs”目录下,可以看到,产生了一个对应刚才任务的文件夹。该文件夹目录下的文件记录着刚才任务的日志信息,如图3-2所示。
提示:
在本例中,如果当前查看该目录的不是“admin”用户,则没有权限进入该目录中。可以根据Hadoop相关知识修改HDFS对应目录的访问权限,或者变更为有权限的用户进行操作。
在一般情况下,开发者也很少通过HDFS页面来操作该目录下的内容。
/
3.1.2 实例6:基于YARN模式运行第1个Spark程序
实例描述
使用两种不同的方式将求Pi值的程序提交到YARN集群中运行,并查看程序的运行结果。
/
1. 确认Hadoop集群已正常运行
如要查看程序在YARN集群的运行日志,应先确保HDFS服务、YARN服务及Hadoop中的Job History Server服务已全部稳定运行。
接下来,将分别介绍两种提交程序的方式——YARN-Client方式与YARN-Cluster方式。
/
2. 用YARN-Client方式提交程序
此时先不必深究YARN-Client方式到底是何用意,先将程序运行起来,保障操作的流畅性,然后再去思考YARN-Client与YARN-Cluster的区别。
(1)提交程序。
进入Spark的安装目录,使用YARN-Client方式提交程序。具体命令如下:
[admin@linux01 spark-2.3.1-bin-hadoop2.7]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
--executor-memory 1G \
--total-executor-cores 3 \
/home/admin/modules/spark-2.3.1-bin-hadoop2.7/examples/jars/spark-examples_2. 11-2.3.1.jar \
100
(2)查看任务进度。
在提交程序后,可以进入YARN的Web页面查看任务进度。Web页面地址如下:
http://linux02:8088/cluster/apps
耐心等待程序执行完毕,即可在控制台的输出中看到Pi的粗略值已经计算出来“Pi is roughly 3.1406739140673916”。此时YARN的Web页面中的内容如图3-3所示。
图3-3 YARN的Web页面
/
(3)查看历史记录。
程序运行完毕后,还可以通过Spark历史服务(Spark History Server)页面查看日志。访问地址如下:
http://linux01:4000
可以看到刚才在YARN上运行的程序记录,如图3-4所示。
图3-4 Spark历史服务页面
提示:
基于该方式运行的程序,Client客户端会与Driver进程绑定在一起。如果用于提交程序的Client客户端退出,则意味着Driver进程退出,程序将无法继续执行。
/
3. 用YARN-Cluster方式提交程序
用YARN-Cluster方式提交程序也非常简单,但是该方式无法在控制台直接看到Pi的输出结果。
(1)提交程序。
进入Spark的安装目录后,执行如下命令:
[admin@linux01 spark-2.3.1-bin-hadoop2.7]$ bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
--executor-memory 1G \
--total-executor-cores 3 \
/home/admin/modules/spark-2.3.1-bin-hadoop2.7/examples/jars/spark-examples_2. 11-2.3.1.jar \
100
(2)查看任务记录。
此时并不能在控制台直接看到输出结果,只是看到程序在进行。
当程序运行完毕后,前往YARN的Web页面,找到本次程序的运行记录,然后依次单击“History”链接→“Logs”链接打开日志,在日志最后一行可以看到已经求出了Pi的值,如图3-5所示。
图3-5 YARN的历史任务日志
提示:
基于该方式运行的程序,Client客户端不会与Driver进程绑定在一起。如果用于提交程序的Client客户端退出,程序依然可以继续执行。
这种方式可以保障集群内Executor进程和Driver进程通信更加稳定。
4. 总结
结合上面的实例,总结如下:
(1)如果现有集群中没有部署YARN集群,则使用Standalone模式提交程序。
(2)如果在现有的集群中已经部署了YARN集群,则使用YARN模式提交程序。当基于YARN模式提交程序时:
在正式的生产环境中,推荐使用YARN-Cluster方式提交程序。
在调试环境中,推荐使用YARN-Client方式提交程序。
3.1.3 提交Spark程序时的参数规范
提交程序时,除常用的参数外,还有一些其他参数。表3-1列出了提交Spark任务时常用的几个参数。
……