Spark概论:
- spark是一个快速的统一的大数据处理分析引擎
- 基本特点:
- 速度快基于内存计算
- 简单易用:支持多语言开发,将数据处理模式封装成80多个方法供开发者调用
- 通用性:
- 支持批处理:核心是RDD,SparkSql
- 支持流处理:Spark Streaming
- 支持交互式分析:Spark shell
- 支持机器学习:MLLib
- 支持图处理:GraphX
- 运行在多种平台上
安装:
- 安装scala及其配置环境
- spark配置、环境变量、子节点
- 可以使用zookeeper配置spark的高可用
- ./sbin/start-all.sh
spark-shell
- 交互式数据处理的工具
- shell中自动帮我们实例化了SparkContext(sc)对象和SparkSession(spark)对象
- 接受scala代码,完成数据处理
- spark-shell --master spark://master:7077
- 如果不加--master url等于是用单机启动sparkshell
- 按tab键可以提示
Spark核心:
- 运行方式:
- intellj本地运行
- sparksubmit集群运行:spark-submit --master spark://seven1:7077 --class com.zhiyou.bd23.WordCount sparktest23.jar
- 打jar包
- 上传到linux上运行
- sparksubmit指令运行
- 本地集群运行
- 概念:
- Application:
- 一个完整的数据处理过程就是一个application
- 包含1个driver
- 包含多个executor
- Driver:
- 负责每个rdd(数据集)的生产DAG图
- 当对rdd进行取值(读值)操作的时候,会触发job,开始执行计算
- 对DAG图解析生成DAG调度
- 根据DAG调度,向集群管理者申请资源,当获取到资源后开始接受资源的调配
- 调配集群中的资源后开始接受对接资源的调配
- 调配集群中的资源运行起Excutor程序,并维护和Excutor之间的连接
- 根据DAG调度,有序的向Executor派发Task任务,交由Executor执行
- 执行期间接受Executor汇报来的执行进度和执行状态
- 执行失败,执行失败的恢复和容错机制
- Execitor:
- 接受Driver发送来的Task任务,执行Task
- 向Driver汇报执行进度和执行状态
- rdd的方法:
- Transformation:
- 对数据的转换、过滤、处理
- 还有些聚合处理
- 不会触发job,不会对数据读值,只是对数据进行转换处理
- transformatiom的返回值方法一般是rdd
- action:
- 一定会触发job,对数据集进行读值操作
- action的方法的返回值都不是rdd
- Transformation:
- Job:
- 每一次action方法调用,都会触发一个Job
- 一个Job中会有多个task
- DAG图
- 每一个Job都会生成一个DAG图
- 一个DAG图中会包含多个Stage,Stage和Stage之间的划分依据是:shuffle
- 一个Stage下面可以包含多个task
- stage的划分:根据宽依赖/shuffle来作为划分边界
- 父子依赖关系:
- 窄依赖:子rdd一个分区的数据只来源于父rdd的一个分区
- 宽依赖:子rdd的一个分区数据来源于多个父rdd的分区
- Task:
- 数据处理的最小单位
- 一般的算子就是Task
- RDD:
- 弹性分布式数据集
- 不可变
- 迭代计算
- clustermanager:
- 分布式计算框架主节点:
- spark:master
- yarn:resourcemanager
- 分布式计算框架主节点:
- work node:
- 分布式计算框架子节点:
- spark:worker
- yarn:nodemanager
- 分布式计算框架子节点:
开发步骤:
- 创建SparkConf,设置master和appname
- 创建SparkContext
- 加载数据源获取RDD
- 对rdd调用各种Transformation方法对数据集进行处理转换
- 调用action触发计算job的执行(对结果数据进行取值处理)
- 完成计算关闭SparkContext
- 代码上:
- Driver:
- 构建SparkContext对象用以和集群进行互通
- 通过sparkcontext加载获取rdd
- 记录对rdd的各种转换操作以待编译成DAG图
- 在对rdd调用Action方法时触发job
- Exector:对rdd调用Transformation方法或作者Action方法时所传送的算子(函数)
API:
- SparkContext:
- 有半生类和半生对象,可以使用new实例化也可以调用半生对象的方法实例化
- 给运行环境中添加资源文件或jar:addjar,addfile
- 构造加载RDD:
- 从文件加载:
- newAPIHadoopFile:hdfs上的各种格式文件
- newAPIHadoopRDD:HBase
- textfile
- sequencefile
- wholefile
- 把内存中的集合转换成rdd:defaultParallelism
- 从文件加载:
- 声明累加器:
- 声明广播变量:
- RDD:
- 转换方法:
- map:
- 以rdd中的每一个元素为处理单元,对数据进行转换操作
- 一个输入对应一个输出
- mapPartitions:
- rdd的每个分区只有一个算子
- 输入和输出的rdd的记录可能会不一样
- mapPartitionsWithIndex:
- 功能和mapPartition一样
- 会多获取到一个partition的编号
- flatMap:
- 类似于hivesql的explode,对集合进行展平操作
- 列转行
- action:
- foreach
- foreachPartition
- collect:把数据从executor传到driver上组成一个Array
- map:
- 过滤:
- filter
- 也可以使用mapPartition实现过滤
- 去重:distinct
- 分组:groupBy
- 排序
- topN
- 缓存
- 重分区
- 集合操作:
- 交集
- 并集/合集
- 减集
- 笛卡尔乘积
- 聚合
- PairRDDFunction