Spark 学习笔记
来源:互联网 发布:有道网络已断开 编辑:程序博客网 时间:2024/06/05 08:00
边读边给自己提问题,了解学习原因,多问自己为什么。
1. Spark系统概述
1.1 大数据处理框架
- 集群环境的主要挑战(3个)
- 大数据集群框架
Google的Map Reduce:简单,自动容错(将计算构成一个有向无环图的任务集),批处理,不适合交互式和流式计算(原因不能在并行计算各个阶段进行有效的数据共享)。相关资料可以参考传统Map Reduce框架慢在哪里。
专有数据处理模型:Storm,Impala,GraphLab:重复工作,组合问题,适用范围局限性,资源问题,管理问题
1.2 Spark大数据处理框架
RDD概念(新的抽象性弹性数据集),可以有效的共享数据,且具有类似Map Reduce的操作接口。
- RDD表达能力:实现很多基于迭代算法的计算模型;实现关系型如SQL查询;有效运用利用Map Reduce实现的应用程序;新的流式处理模型
- Spark可以同时进行批处理、交互式处理、流式处理
- Spark兼容性及性能表现(多任务及迭代计算中减少磁盘I/O时间[dueto利用DAG调度执行规划])
2. Spark RDD及编程接口
2.1 相关概念
- 弹性分布式数据集RDD:是一个变量
- 创建操作:初始创建由SparkContext负责,将内存中的集合或者外部文件系统作为输入源
- 转换操作:一个RDD变为另一个RDD
- 控制操作:对RDD进行持久化(可以让RDD保存在磁盘或者内存中,以便后续重复使用,cache)或者分区(根据记录中的键值)。
- 行动操作:有两类,对应两类结果,一是变成scalar集合或标量,另一类将RDD保存到外部文件或数据库系统中
2.2 Spark RDD
RDD需要包括如下五个接口
- RDD分区:利用RDD的成员变量partitions(一个数组)大小查询一个RDD被划分的区数;分区的多少涉及对该RDD进行并行计算的粒度;一个分区计算对应一个单独任务;默认分区大小是该程序所分配到的资源的CPU核的个数
- RDD位置优先:与Spark调度有关,返回的是每一个数据块存储的位置(如机器名或IP地址)
- RDD依赖关系:由于转换操作带来的RDD之间的依赖,分为窄依赖及宽依赖
- RDD分区计算:
- RDD分区函数:
2.3 创建操作
- 集合创建操作:parallelize、makeRDD
- 存储创建操作:
2.4 转换操作
- 基本转换操作:map(一对一影射)、distinct(去重)、flatMap(一对多影射)、repartition、coalesce(将原来的N个区重新划分为M个区)、randomSplit、glom
- 集合RDD转换操作:union、intersection、subtract等
- 键值RDD转换操作:PartitionBy、mapValues、flatMapValues、combineKey
2.5 控制操作
- cache
- persist:可以持久化在磁盘上
- checkpoint:持久化在HDFS
2.6 行动操作
每一次行动操作都会触发一次spark调度并返回相应结果
- 集合标量行动操作:返回数据集数量或者满足条件的数据。first、count、reduce(二元计算)、collect、take、top、takeOrdered、aggregate、fold
- 存储行动操作
3. Spark 运行模式
Spark应用程序的运行模式取决于传递给SparkContext的master环境变量的值,这里我主要学习的是YARN下的Spark运行RunOnYARN。YARN又有两种模式,cluster和client,前者主程序逻辑和任务都运行在YARN集群中,后者主程序运行在本地,具体任务运行在YARN集群中。
不同的运行模式有基本相似的工作流程:将Spark应用分为任务调度和任务执行。具体说来就是以SparkContext为程序运行的总入口,初始化sc过程中,Spark会分别创建作业调度和任务调度两级模块。作业调度先划分(shuffle)调度阶段,再为每个阶段构建具体任务,然后以任务组的形式提交给任务调度模块,而任务调度模块则负责任务启动、监控和汇报。不同运行模式的差别主要体现在这一模块。
3.1YARN client 模式
提交前需要:
export SPARK_HOME=/path/to/your/sparkexport PATH=$SPARK_HOME/bin:$PATH
<pre name="code" class="plain">$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \#主程序类 --master yarn \ # YARN模式 --deploy-mode client \ # yarn-client --driver-memory 4g \ # 负责任务调度 --executor-memory 2g \ # 负责具体的任务执行 --executor-cores 1 \ # 每个executor中最多同时可以有1个task运行 --queue <queuename> \ # 指定提交队列,默认为default lib/spark-examples*.jar \# 指定程序jar位置executor的数量可以手动指定也可以选择动态分配。动态分配可以使的 Spark 的应用在有后续积压的在等待的 task 时请求 executor,并且在空闲时释放这些 executor。
这时需要增加的环境配置有:
--conf "spark.dynamicAllocation.minExecutors=1" \ #指定动态Executor时候最小的Executor数量,最小默认是1个 --conf "spark.dynamicAllocation.maxExecutors=50" \ #指定动态Executor时候最大的Executor数量,最小默认是1个,最大默认为50
在动态分配模式有时候会引发奇怪的错误或者让程序的变得很慢,可以考虑采用指定executor数量的方式,这样的话,需要对自己的程序更关注程序的优化,尽量避免大量Executor长时间空闲的情况出现。这时需要参数指定executor的数量,以及关闭动态分配executor选项。
--conf "spark.dynamicAllocation.enable=false" \ #关闭动态executor模式 --conf "spark.shuffle.service.enabled=false" \ #动态executor需要的服务,需要和上面的spark.dynamicAllocation.enable同时关闭关于动态分配可以参考:
SPARK_Dynamic_Allocation及官方文档
0 0
- spark学习笔记:Spark Streaming
- Spark学习笔记:初识Spark
- Spark学习笔记--Spark基础知识
- spark学习笔记:初识spark
- Spark 学习笔记
- Spark学习笔记
- Spark学习笔记
- Spark 学习笔记
- spark源码学习笔记
- spark学习笔记二
- Spark学习笔记(一)
- Spark学习笔记
- Spark学习笔记0
- Spark学习笔记
- spark学习笔记
- Spark学习笔记一
- spark 学习笔记
- spark 学习笔记
- 使用expdp导出远端的数据库
- c语言中一些整型常量的范围
- 剑指offer系列之53:字符流中第一个不重复的字符
- 什么是CSR ? 什么是公钥和私钥?
- HTML文件结构
- Spark 学习笔记
- 某些mysql like查询也是可以使用到索引的
- 沿海信标台站的坐标系统的问题
- 基于Mesos和Docker的分布式计算平台
- Ubuntu下配置C++编辑器VIM
- Linux安装mysql5.5(ubuntu14.04)
- Opencv学习笔记(六)SURF学习笔记
- 【SDCC讲师专访】首席架构师徐海峰眼中的架构和出色的架构师
- android canvas.drawText()的研究