Spark 学习笔记

来源:互联网 发布:有道网络已断开 编辑:程序博客网 时间:2024/06/05 08:00

 边读边给自己提问题,了解学习原因,多问自己为什么。

1. Spark系统概述

1.1 大数据处理框架

  1. 集群环境的主要挑战(3个)
  2. 大数据集群框架
 Google的Map Reduce:简单,自动容错(将计算构成一个有向无环图的任务集),批处理,不适合交互式和流式计算(原因不能在并行计算各个阶段进行有效的数据共享)。相关资料可以参考传统Map Reduce框架慢在哪里。 

专有数据处理模型:Storm,Impala,GraphLab:重复工作,组合问题,适用范围局限性,资源问题,管理问题

1.2 Spark大数据处理框架

 RDD概念(新的抽象性弹性数据集),可以有效的共享数据,且具有类似Map Reduce的操作接口。
  1. RDD表达能力:实现很多基于迭代算法的计算模型;实现关系型如SQL查询;有效运用利用Map Reduce实现的应用程序;新的流式处理模型
  2. Spark可以同时进行批处理、交互式处理、流式处理
  3. Spark兼容性及性能表现(多任务及迭代计算中减少磁盘I/O时间[dueto利用DAG调度执行规划])

2. Spark RDD及编程接口

2.1 相关概念

  1. 弹性分布式数据集RDD:是一个变量
  2. 创建操作:初始创建由SparkContext负责,将内存中的集合或者外部文件系统作为输入源
  3. 转换操作:一个RDD变为另一个RDD
  4. 控制操作:对RDD进行持久化(可以让RDD保存在磁盘或者内存中,以便后续重复使用,cache)或者分区(根据记录中的键值)。
  5. 行动操作:有两类,对应两类结果,一是变成scalar集合或标量,另一类将RDD保存到外部文件或数据库系统中

2.2 Spark RDD 

 RDD需要包括如下五个接口

  1. RDD分区:利用RDD的成员变量partitions(一个数组)大小查询一个RDD被划分的区数;分区的多少涉及对该RDD进行并行计算的粒度;一个分区计算对应一个单独任务;默认分区大小是该程序所分配到的资源的CPU核的个数
  2. RDD位置优先:与Spark调度有关,返回的是每一个数据块存储的位置(如机器名或IP地址)
  3. RDD依赖关系:由于转换操作带来的RDD之间的依赖,分为窄依赖及宽依赖
  4. RDD分区计算:
  5. RDD分区函数:

2.3 创建操作

  1. 集合创建操作:parallelize、makeRDD
  2. 存储创建操作:

2.4 转换操作

  1. 基本转换操作:map(一对一影射)、distinct(去重)、flatMap(一对多影射)、repartition、coalesce(将原来的N个区重新划分为M个区)、randomSplit、glom
  2. 集合RDD转换操作:union、intersection、subtract等
  3. 键值RDD转换操作:PartitionBy、mapValues、flatMapValues、combineKey

2.5 控制操作

  1. cache
  2. persist:可以持久化在磁盘上
  3. checkpoint:持久化在HDFS

2.6 行动操作

每一次行动操作都会触发一次spark调度并返回相应结果
  1. 集合标量行动操作:返回数据集数量或者满足条件的数据。first、count、reduce(二元计算)、collect、take、top、takeOrdered、aggregate、fold
  2. 存储行动操作

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
原创粉丝点击