一. Spark 的闭包处理
RDD, resilient distributed dataset
,弹性(容错)分布式数据集。
分区列表, function,dep Option(分区类, Pair[Key,Value]),首选位置。
运行job时,spark将rdd打碎变换成task,每个task由一个executor执行。
执行之前,spark会进行task的闭包(closure)计算。
闭包是指针对executor可见的变量和方法,以备在rdd的foreach中进行计算。
闭包就是串行化后并发送给每个executor.
local模式下,所有spark程序运行在同一JVM中,共享对象,counter是可以累加的。
原因是所有executor指向的是同一个引用。
cluster模式下,不可以,counter是闭包处理的。
每个节点对driver上的counter是不可见的。
只能看到自己内部串行化的counter副本。
二. Spark的应用的 部署模式
1. 部署模式概述
spark-submit --class xxx xx.jar --deploy-mode (client | cluster)
--deploy-mode
指定部署driver程序在client主机上还是在worker节点上。
[client]
- driver运行在client主机上。
- client可以不在cluster(集群)中。
[cluster]
driver
程序提交给spark cluster
的某个worker
节点来执行。- worker是cluster中的一员。
- 导出的jar需要放置到所有worker节点都可见的位置(如
hdfs
)才可以。
不论哪种方式,rdd的运算都在worker执行
2. deploy mode部署模式验证
部署模式划分
1 | # 客户端 client 模式 |
小技巧: 导出 maven 中所有的依赖库到文件中
1 | # maven 命令,下载指定job 的所有依赖的 jar 包到 当前的 ./lib 文件夹 |
配置spark on yarn执行模式
- 使用 spark on yarn 不需要启动 spark!! job直接执行在 yarn 上
- yarn 模式使用 yarn模式来作为 master, 而 yarn 已经配置了 HA 了
配置 jars 文件的目录
- 将spark的jars文件放到hdfs上.
$>hdfs dfs -mkdir -p /user/ap/spark/jars
[ap@cs1]~/apps/spark%> hdfs dfs -put jars/ /user/ap/spark - 配置spark属性文件
[/spark/conf/spark-default.conf]
spark.yarn.jars hdfs://mycluster/user/ap/spark/jars/*
配置完这些之后: 提交任务的时候就会出现这个, 意思是, 找到了 jar 包, 就不复制了
1
2 > INFO Client: Source and destination file systems are the same. Not copying hdfs://mycluster/user/ap/spark/jars/JavaEWAH-0.3.2.jar
>
遇到问题: 内存不够
解决: 配置
yarn-site.xml
1 | <property> |
配置机架感知
核心是自己实现一个类, 然后再 配置文件中声明 机架感知的实现类是哪个
具体使用自行查资料
1 | # [core-site.xml] |
1 | package com.rox.hdfs.rackaware.MyRackAware |
代码解释
- 通过Socket把打印的数据, 发送到指定机器
cs5
上 - 在
cs5
上, 开启nc
端口, 监听消息 standalone
和yarn
模式分别打成jar包
, 在spark 环境中执行
1 | package com.rox.spark.scala |
三. Spark 集群的运行方式
主要是cluster manager
的区别。
[local]
- …
[standalone]
- 使用SparkMaster进程作为管理节点, 需要开启Spark 集群
[mesos]
- 使用mesos的master作为管理节点。
[yarn]
使用hadoop的ResourceManager作为master节点。
不用开启 spark 集群。因为是依托
yarn 集群
来执行spark
application, 高可用也是依托于 yarn 的高可用, 程序在执行时, 会拷贝 一些spark 依赖环境到 hdfs 上, 事后会删除