Spark第二天【SparkCore内容】
主要内容
- Spark集群搭建
- Spark Spark Pi任务提交
- Spark on Yarn 配置
- Spark基于Standalone任务提交两种模式
- Spark基于Yarn任务提交两种模式
- Spark部分Transformation算子
- Spark部分Action算子
学习目标
第一节 Spark 集群搭建
- Standalone 集群搭建与 Spark on Yarn 配置
Standalone
Standalone 集群是 Spark 自带的资源调度框架,支持分布式搭建,这里建议搭建 Standalone 节点数为 3 台,1 台 master 节点,2 台 worker 节点,这虚拟机中每台节点的内存至少给 2G 和 2 个 core,这样才能保证后期 Spark 基于 Standalone 的正常运行。搭建 Standalone 集群的步骤如下:
1).下载安装包,解压
登录 Spark 官网下载 Spark,官网地址:https://spark.apache.org 点击 “Download” 找到 “ Spark release archives ” 找到对应的 Spark 版本下载。这里选择 Spark2.3.1 版本下载。
将下载好的 Spark 安装包上传到 Spark Master 节点,解压:
2).改名
3).进入安装包的 conf 目录下,修改或者复制 slaves.template文件,去掉 template 后缀,在新的 slaves 文件中添加从节点。保存。
在 slaves 中配置 worker 节点:
4).复制 $SPARK_HOME/conf/spark-env.sh.template 为 spark-env.sh,修改 spark-env.sh 内容:
SPARK_MASTER_HOST:master 的 ip
SPARK_MASTER_PORT:提交任务的端口,默认是 7077
SPARK_WORKER_CORES:每个 worker 从节点能够支配的 core 的个数
SPARK_WORKER_MEMORY:每个 worker 从节点能够支配的内存数
JAVA_HOME:java 的 home,这里需要 jdk8
5).同步到其他节点上
6).启动集群
进入 sbin 目录下,执行当前目录下的 ./start-all.sh
7).搭建客户端
将 spark 安装包原封不动的拷贝到一个新的节点上,然后,在新的节点上提交任务即可。
注意:
- 8080 是 Spark WEBUI 界面的端口,7077 是 Spark 任务提交的端口。
- 修改 master 的 WEBUI 端口:
- 修改 $SPARK_HOME/conf/spark-env.sh 即可【建议使用】:
- 修改 start-master.sh 即可。
- 也可以在 Master 节点上导入临时环境变量,只是作用于之后的程序,重启就无效了。
- 删除临时环境变量:
- yarn
Spark 也可以基于 Yarn 进行任务调度,这就是所谓的 Spark on Yarn,Spark 基于 Yarn 进行任务调度只需要在 Spark 客户端做如下配置即可:
同时这里需要在每台 NodeManager 节点中将每台 NodeManager 的虚拟内存关闭,在每台 NodeManager 节点的$HADOOP_HOME/etc/hadoop/yarn-site.xml
中加入如下配置:
<!-- 关闭虚拟内存检查 -->
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
- Spark Pi任务测试
Spark PI案例: - Standalone 提交命令:
./spark-submit --master spark://mynode1:7077 --class
org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.11-2.3.1.jar 100
Spark on YARN 提交命令:
./spark-submit --master yarn --class
org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.11-2.3.1.jar 100
第二节 Spark 基于 Standalone 模式提交任务
Standalone 模式两种提交任务方式
- Standalone-client 提交任务方式
- 提交命令
./spark-submit --master spark://mynode1:7077
--class org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.11-2.3.1.jar 100
或者
./spark-submit --master spark://mynode1:7077
--deploy-mode client
--class org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.11-2.3.1.jar 100
- 执行原理图解
- 执行流程
- client 模式提交任务后,会在客户端启动 Driver 进程。
- Driver 会向 Master 申请启动 Application 启动的资源。
- Master 收到请求之后会在对应的 Worker 节点上启动 Executor
- Executor 启动之后,会注册给 Driver 端,Driver 掌握一批计算资源。
- Driver 端将 task 发送到 worker 端执行。worker 将 task 执行结果返回到 Driver 端。
- 总结
client 模式适用于测试调试程序。Driver 进程是在客户端启动的,这里的客户端就是指提交应用程序的当前节点。在 Driver 端可以看到 task 执行的情况。生产环境下不能使用 client 模式,是因为:假设要提交 100 个 application 到集群运行,Driver 每次都会在 client 端启动,那么就会导致客户端 100 次网卡流量暴增的问题。client 模式适用于程序测试,不适用于生产环境,在客户端可以看到 task 的执行和结果
- Standalone-cluster 提交任务方式
- 提交命令
./spark-submit --master spark://mynode1:7077
--deploy-mode cluster
--class org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.11-2.3.1.jar 100
- 执行原理图解
- 执行流程
- cluster 模式提交应用程序后,会向 Master 请求启动 Driver.
- Master 接受请求,随机在集群一台节点启动 Driver 进程。
- Driver 启动后为当前的应用程序申请资源。
- Driver 端发送 task 到 worker 节点上执行。
- worker 将执行情况和执行结果返回给 Driver 端。
- 总结
Driver 进程是在集群某一台 Worker 上启动的,在客户端是无法查看 task 的执行情况的。假设要提交 100 个 application 到集群运行,每次 Driver 会随机在集群中某一台 Worker 上启动,那么这 100 次网卡流量暴增的问题就散布在集群上。 - 总结 Standalone 两种方式提交任务,Driver 与集群的通信包括:
- Driver 负责应用程序资源的申请
- 任务的分发。
- 结果的回收。
- 监控 task 执行情况。
第三节 Spark 基于 Yarn 模式提交任务
Yarn 模式两种提交任务方式
1. yarn-client 提交任务方式
- 提交命令
./spark-submit
--master yarn
--class org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.11-2.3.1.jar 100
或者
./spark-submit
--master yarn–client
--class org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.11-2.3.1.jar 100
或者
./spark-submit
--master yarn
--deploy-mode client
--class org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.11-2.3.1.jar 100
- 执行原理图解
执行流程
- 客户端提交一个 Application,在客户端启动一个 Driver 进程。
- 应用程序启动后会向 RS(ResourceManager) 发送请求,启动 AM(ApplicationMaster) 的资源。
- RS 收到请求,随机选择一台 NM(NodeManager) 启动 AM。这里的 NM 相当于 Standalone 中的 Worker 节点。
- AM 启动后,会向 RS 请求一批 container 资源,用于启动 Executor.
- RS 会找到一批 NM 返回给 AM , 用于启动 Executor。
- AM 会向 NM 发送命令启动 Executor。
- Executor 启动后,会反向注册给 Driver,Driver 发送 task 到 Executor , 执行情况和结果返回给 Driver 端。
- 总结
Yarn-client 模式同样是适用于测试,因为 Driver 运行在本地,Driver 会与 yarn 集群中的 Executor 进行大量的通信,会造成客户机网卡流量的大量增加. - ApplicationMaster 的作用:
- 为当前的 Application 申请资源
- 给 NameNode 发送消息启动 Executor。
注意:ApplicationMaster 有 launchExecutor 和申请资源的功能,并没有作业调度的功能。
2. yarn-cluster 提交任务方式
- 提交命令
./spark-submit
--master yarn
--deploy-mode cluster
--class org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.11-2.3.1.jar 100
或者
./spark-submit
--master yarn-cluster
--class org.apache.spark.examples.SparkPi ../examples/jars/spark-examples_2.11-2.3.1.jar 100
- 执行原理图解
- 执行流程
- 客户机提交 Application 应用程序,发送请求到 RS(ResourceManager) , 请求启动 AM(ApplicationMaster)。
- RS 收到请求后随机在一台 NM(NodeManager) 上启动 AM(相当于 Driver端)。
- AM 启动,AM 发送请求到 RS,请求一批 container 用于启动 Executor。
- RS 返回一批 NM 节点给 AM。
- AM 连接到 NM , 发送请求到 NM 启动 Executor。
- Executor 反向注册到AM所在的节点的 Driver。Driver 发送 task 到 Executor。
总结
Yarn-Cluster 主要用于生产环境中,因为 Driver 运行在 Yarn 集群中某一台 nodeManager 中,每次提交任务的 Driver 所在的机器都是随机的,不会产生某一台机器网卡流量激增的现象,缺点是任务提交后不能看到日志。只能通过 yarn 查看日志。ApplicationMaster 的作用:
- 为当前的 Application 申请资源
- 给 NameNode 发送消息启动 Excutor。
- 任务调度。
- 停止集群任务命令:yarn application -kill applicationID
第四节 Spark 补充 Transformation 算子
transformation
- join , leftOuterJoin , rightOuterJoin , fullOuterJoin
作用在 K , V 格式的 RDD 上。根据 K 进行连接,对(K,V)join(K,W) 返回(K,(V,W)) - join 后的分区数与父 RDD 分区数多的那一个相同。
- union
合并两个数据集。两个数据集的类型要一致。 - 返回新的 RDD 的分区数是合并 RDD 分区数的总和。
- intersection
取两个数据集的交集,返回新的 RDD 与父 RDD 分区多的一致 - subtract
取两个数据集的差集,结果 RDD 的分区数与 subtract 前面的 RDD 的分区数一致。 - mapPartitions
与 map 类似,遍历的单位是每个 partition 上的数据。 - distinct(map+reduceByKey+map)
- cogroup
当调用类型(K,V)和(K,W)的数据上时,返回一个数据集(K,(Iterable<V>,Iterable<W>)),子 RDD 的分区与父 RDD 多的一致。
第五节 Spark 补充 Action 算子
action
- foreachPartition
遍历的数据是每个 partition 的数据。 - collectAsMap
对 K,V 格式的 RDD 数据回收转换成 Map<K,V> - takeSample(boolean,num,seed)
takeSample 可以对 RDD 中的数据随机获取 num 个,第一个参数是有无放回,第二个参数是随机获取几个元素,第三个参数如果固定,那么每次获取的数据固定。 - top(num)
对 RDD 中的所有元素进行由大到小排序,获取前 num 个元素返回。 - takeOrdered(num)
对 RDD 中的所有元素进行由小到大的排序,获取前 num 个元素返回。
本节作业
- Spark 集群搭建步骤和注意问题?
- Spark 基于 Standalone 任务提交两种模式流程及特点?
- Spark 基于 Yarn 任务提交两种模式流程及特点?
- 所有算子代码敲一遍。