简介:
spark是一个内存计算框架 , 解决了mapreduce在迭代与交互方面的不足
迭代: 多轮算法计算形式,pagerank,逻辑回归等
交互: 实时数据,数据仓库查询等
spark重要概念:
RDD:
弹性分布式数据集, 弹性(数据多节点分片)分布式(集群节点)数据集(默认加载至内存)
操作:
转换(transformation) rdd->newrdd
# 注意此类操作不会提交作业
map(func) 形成新的RDD集
filter(func) 过滤结果成为新的RDD集
flatmap(func) 映射为多于0的输出元素
groupbykey(key) 以Key为组的数据集
reducebykey(func) 以Key为组的数据集在经过func的处理
join(newrdd) 连接两个数据集 k,v k,w => k,(v,w)
sortbykey(desc) 排序数据集
动作(action) 结果处理
# 注意此类操作将提交作业
reduce(func) func函数输入两个返回一个结果
collect 返回操作后的数据元素
count 元素个数统计
countByKey 按Key统计每组的数目
saveastextfile 以文件形式保存计算结果集
saveassequencefile 以序列文件保存计算结果集
操作分类:
value:
1->1:
map, flatmap, mappartitions, glom
n->1:
union类型一致合并, cartesian分区笛卡尔积
n->n:
groupby
n属于m:
filter, distinct, subtract, sample, takesample
cache:
cache仅内存, persist可决定缓存位置
key-value:
1->1:
mapValues
union:
combineByKey, reduceByKey, partitionBy分区策略, cogroup协同划分
join:
join(cogroup,flatMapValues), leftOutJoin, rightOutJoin
action:
无输出:
foreach
HDFS:
saveAsTextFile, saveAsObjectFile
Scala:
collect, collectAsMap, reduceByKeyLocally, count, lookup, top(top,take,takeOrdered,first), reduce, fold, aggregate
DataType:
spark编程概念:
共享变量:
广播变量(boarkcast不可修改) .value
累加器(accumulator可累加) .value
初始化:
构建SparkContext(集群地址,作业名称,sparkhome,作业依赖项)
RDD类型:
并行集合与hadoop数据集
并行集合: scala集合,可分片slice(parallelize)
hadoop集合: 文本,序列(K,V),inputformat
(之后均可做map/reduce操作)
Cache:
RDD转换后可缓存persist,cache,可容错
cache级别: 仅内存,内存磁盘,内存序列化kryo,内存磁盘序列化,仅磁盘,
spark基本架构:
应用程序间环境隔离 , 资源管理(YARN , Mesos) + 应用程序管理 . 程序运行过程中对RDD分片的优化(窄fusion , 宽全局barrier)
spark运行流程:
提交应用 -> DAG依赖流程化 -> 执行DAG至完成 -> 销毁运行环境
提交应用:
构建运行环境: 粗(一次YARN,Mesos).细(多次Mesos)
启动RDD管理器 BlockManager
DAG依赖流程化:
分解宽窄依赖: 归组
fusion优化,不需要物化
执行DAG至完成:
数据本地化: 基架感知
推测执行: 另起资源比较
销毁运行环境:
回收资源
spark on YARN:
客户端 提交任务 至 ApplicationMaster 申请资源 向 Nodemanager
SAM 内部有 ClusterScheduler(cpu核数) 有了资源 启动 StandaloneExecutorBackend(container大小) 注册 akka 等待任务 之后执行 完毕回收资源
Mesos介绍:
集群资源管理器 twitter,douban
客户端scheduler -> MesosSchedulerDriver -> MesosMaster(zk) -> MesosSlave(Executor)
master: 核心, 资源接入,分配Allocator,其他框架的管理
salve: 接收命令,报告状态(任务,资源)
framework scheduler: MesosSchedulerDriver第三方实现接入mesos, 双层调度(资源给框架,框架自定任务) ---> 类似hadoop jobtrack
framework executor: MesosExecutorDriver第三方执行实现 ---> 类似hadoop tasktrack
第三方框架注册流程:
第三方实现MesosSchedulerDriver,启动SchedulerProcess服务,MasterDetector对象(探测master通知schedulerprocess),sp会向master发送注册消息,sp确认,framework确认
mesos资源分配: 主资源公平调度算法,多维度资源,授权接入框架
设计: 资源拒绝(slave), 资源过滤(salve), 资源回收(master)
mesos容错设计:
master: zk
salve: 心跳,快照运行目录
mesos vs YARN:
设计目标一致: 通用集群资源管理方案
容错一致: zk,多主
在线升级: YARN的salve不支持
调度模型一致: 双层
调度算法: YARN除了DRF还支持容量与失败
资源隔离一致: cgroups
支持框架一致: mapreduce,strorm,spark等
资源分配颗粒度: YARN不支持动态资源分配
网络库:
rpc serialization
libprocess protocal buffer
avro avro
Thrift idl
socket kryo
libprocess设计: 消息(类型) -> 消息队列 -> 消息处理分发器(dispatcher) -> 消息处理 高效,易用
spark工作机制:
应用运行提交:
spark任务调度分配:
spark io: 序列化(进程actor,NIO,netty,磁盘kyro)
压缩(snappy,LZF)
spark net:RPC, RMI, WEB Service, EJB
AKKA
spark 容错: 血统, checkpoint
spark编程:
下载源码包 , 安装maven , ./make-distribution.sh --skip-java-test构建本地模式
安装sbt打包工具
编写代码:
python:
from pyspark import SparkContext
scala:
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.SparkConf
编写sbt依赖文件:
name := "Simple Project"
version := "1.0"
scalaVersion := "2.10"
libraryDependencies += "org.apache.spark" %% "spark-core" % "1.1.0"
sbt打包: sbt package
提交应用: /bin/spark-submit --class "SimpleApp" --master local test/target/scala-2.10/simple-project_2.10-1.0.jar