Spark总结整理

  • 一、简介
  • 二、spark原理
  • 三、RDD
  • 四、Spark Streaming

一、简介

为什么学spark?
Spark是一种快速、通用、可扩展的大数据分析引擎,是MapReduce的替代方案,而且兼容HDFS、Hive,可融入Hadoop的生态系统,以弥补MapReduce的不足。

spark为什么比mr快?
1_基于内存
2_线程替代进程

spark的启动和web页面?

/export/servers/spark/sbin/start-all.sh 
//若配置HA,backup节点需单独启动一下master

正常启动spark集群后,可以通过访问 http://node01:8080,查看spark的web界面,查看相关信息。

二、spark原理

在这里插入图片描述
名词解释:

  • Driver Program :运⾏main函数并且新建SparkContext的程序。
  • Application:基于Spark的应用程序,包含了driver程序和集群上的executor。
  • Cluster Manager:指的是在集群上获取资源的外部服务。目前有三种类型:
    (1)Standalone: spark原生的资源管理,由Master负责资源的分配
    (2)Apache Mesos:与hadoop MR兼容性良好的一种资源调度框架
    (3)Hadoop Yarn: 主要是指Yarn中的ResourceManager
  • Worker Node:集群中任何可以运行Application代码的节点,在Standalone模式中指的是通过slaves文件配置的Worker节点,在Spark on Yarn模式下就是NodeManager节点。
  • Executor:是在一个worker node上为某应用启动的⼀个进程,该进程负责运行任务,并且负责将数据存在内存或者磁盘上。每个应用都有各自独立的executor。
  • Task :被送到某个executor上的工作单元。

任务调度
在这里插入图片描述

三、RDD

什么是RDD?
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。

怎么理解RDD的五大属性?

  • A list of partitions:一个分区列表;
    每一个RDD都有很多个分区,分区里面才是真正的数据,spark的任务是以分区为单位,一个分区后期就对应一个spark的task,也就是一个分区就对应一个线程。
    通过val rdd1=sc.textFile("/a.txt"),该文件如果block个数小于等于2,产生的rdd的分区数就是为2;该文件如果block个数大于2,产生的rdd的分区数就是与文件的block个数相等。
  • A function for computing each split:作用在每一个分区中函数
    举例: val rdd2=rdd1.map(x=>(x,1))
    在这里作用的每一个分区中的函数是:x=>(x,1)
  • A list of dependencies on other RDDs:一个rdd会依赖于其他多个rdd
    spark任务的容错机制就是根据这个特性而来。
  • Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned):(可选项)对于kv类型的RDD才会有分区函数这个概念(必须要产生shuffle),不是kv类型的rdd分区函数是None
    spark中有2种分区函数:第一种是hashPartitioner(默认值),其本质key.hashcode % 分区数 = 分区号;第二种是RangePartitioner,它是基于一定的范围的分区函数。
  • Optionally, a list of preferred locations to compute each split on(e.g. block locations for an HDFS file):(可选项)一组最优的分区位置,这里就涉及到数据的本地性和数据块位置最优
    spark进行任务分配的时候,优先考虑存有数据的worker节点来进行任务的计算。

创建RDD的三种方式?

val rdd1 = sc.textFile("/a.txt")
val rdd2 = sc.parallelize(List(1,2,3))
val rdd3 = rdd1.flatMap(_.split(","))

RDD的常用算子?
强烈建议每个算子看一下scala源码,有助理解。
在这里插入图片描述
RDD的依赖关系?
在这里插入图片描述
1、窄依赖
指的是每一个父RDD的Partition最多被子RDD的一个Partition使用。
2、宽依赖
指的是多个子RDD的Partition会依赖同一个父RDD的Partition。
3、血统
RDD的Lineage会记录RDD的元数据信息和转换行为,当该RDD的部分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的数据分区。

RDD的缓存机制
1、设置缓存的两种方式

rdd.cache
rdd.persist(org.apache.spark.storage.StorageLevel.DISK_ONLY)

实际上cache底层也是调用了persist方法,是将数据缓存在内存中。
2、什么时候需要设置缓存?
1)某个RDD后期被多次调用
2)某个RDD的结果计算逻辑很复杂
3、清除缓存的方式
1)自动清除:整个程序结束之后,缓存中的所有数据自动清除
2)手动清除:rdd.unpersist(true)

四、Spark Streaming

Spark Streaming简介
1、类似于storm,用于流式数据处理(以批做流),基本原理是把输出数据以某一个很小的时间间隔(秒级)批量处理;
2、高吞吐,容错能力强;
3、编程模型是DStream;
4、其批处理引擎是Spark Core,运算的时候将对DStream的Transformation操作变为针对Spark中对RDD的Transformation操作。
Spark Streaming的数据源&输出
在这里插入图片描述DStream(Discretized Stream)介绍
是Spark Streaming的基础抽象,代表持续性的数据流和经过各种Spark算子操作后的结果数据流。在内部实现上,DStream是一系列连续的RDD来表示。

示例代码

spark实现点击流日志分析(统计PV UV TOPN)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值