Spark_day01

2019-08-04  本文已影响0人  c062197eecd2
1.1 Spark 是什么
为什么会有Spark ?
总结:
  1. Spark 是 Apache 的一个开源框架
  2. Spark 的母公司叫 Databticks
  3. Spark 是为了解决 MapReduce 等过去的计算系统无法在内存中保存中间结果的问题
  4. Spark 的核心是 RDDS ,RDDS 不仅谁一个计算框架,也是一种数据结构.
  5. RDDS即Resilient distributed datasets(弹性分布式数据集)。
1.2 Spark 的特点(优点)

理解 Spark 的特点,从而去理解 为什么要使用 Spark

速度快
易用
通用
兼容
总结
1.3 Spark 组件

理解 Spark 能做什么
理解 Spark 的学习路线

Spark-Core 和 RDDs(弹性分布式数据集 Resilient distributed datasets)
Spark Streaming
MLlib
Graphx
总结
1.4 Spark 和 Hadoop 的差别
Spark 和 Hadoop 的差别

Spark 集群搭建

从Spark 的集群架构开始,理解分布式环境,以及 Spark 的运行原理
理解Spark 的集群搭建,包括高可用的搭建方式

2.1 Spark 集群的结构

通过应用运行流程,理解分布式调度的基础概念

Sprak 如果将程序运行在一个集群中?
名词解释
Driver
Cluster Manager
worker
Executor
运行一个 Spark 程序大致经历如下几个步骤

1.启动 Driver ,创建 SparkContext

  1. Client 提交程序给 Driver ,Driver 向Cluster Manager 申请集群资源
  2. 资源申请完毕,在 Worker 中 启动 Executor
  3. Driver 将程序转化为 Tasks ,分发给 Executor 执行
问题一: Spark 程序可以运行在什么地方?

Spark 可以将任务运行在两种模式下:

Spark 可以使用的集群管理工具有:
问题二: Driver 和 Worker 什么时候启动?

总结

RDD 是什么?

定义:
特点
  1. RDD 是一个编程模型
  1. RDD 是一个编程模型

3.RDD 是混合型编程模型,可以支持迭代计算,关系查询,MapReduce ,流计算
4.RDD 是只读的。
5.RDD 之间有依赖关系,更具执行操作的操作符的不同,依赖关系可以分为 宽依赖 和 窄依赖。


(wordcount.txt)单词统计的 案例程序从结构上可以用上图表示,分为两大部分
存储
计算
总结
4.1 创建RDD
SparkContext 程序的入口
val conf = new SparkConf().setMaster("local[2]")
val sc: SparkContext = new SparkContext(conf)

SparkContext 是 Spark-core 的入口组件,是一个 Spark 的程序的入口,是一个元老级别的API 了.
如果把 一个 Spark 程序分为前后端,那么服务端就是可以运行在 Spark 程序的集群,而 Driver 就是 Spark 的前端,在 Driver 中 SparkContext 是最主要的组件,也是 Driver 在运行时首先会创建的组件,是 Driver 的核心组件。
SparkContext 从提供的 API 来看,主要的作用是来连接集群,创建 RDD ,累加器, 广播变量等 功能。

简单的说,RDD 有三种创建方式
RDD 可以通过本地集合之间创建
RDD 也可以通过读取外部数据集来创建
RDD 也可以通过其他的 RDD 衍生而来

通过本地集合直接创建 RDD
val conf = new SparkConf().setMaster("local[2]")
val sc = new SparkContext(conf)

val list = List(1, 2, 3, 4, 5, 6)
val rddParallelize = sc.parallelize(list, 2)
val rddMake = sc.makeRDD(list, 2)

通过 parallelize 和 makeRDD 这两个 API 可以通过本地集合创建 RDD
这两个 API 本质上是一样的, 在 makeRDD 这个方法的内部, 最终也是调用了 parallelize
因为不是从外部直接读取数据集的, 所以没有外部的分区可以借鉴, 于是在这两个方法都都有两个参数, 第一个参数是本地集合, 第二个参数是分区数

通过读取外部文件创建 RDD
val conf = new SparkConf().setMaster("local[2]")
val sc = new SparkContext(conf)
val source: RDD[String] = sc.textFile("hdfs://node01:8020/dataset/wordcount.txt")
访问方式:

支持访问文件夹

sc.textFile("hdfs:///dataset")

支持访问压缩文件

sc.textFile("hdfs:///dataset/words.gz")

支持通过通配符访问

sc.textFile("hdfs:///dataset/*.txt")
注意

如果把 Spark 应用泡在集群上,则 worker 有可能在任何一个节点上运行
所以如果使用 如下形式访问本地文件的话,要确保所有的 worker 中的对应的路径上有这个文件,否则可能会报错,无法找到这个文件。

file:///…​
分区

默认情况下读取 hdfs 中的文件的时候,每个 hdfs 的 block 对应一个 RDD 的 partition ,block 的默认是 128M
通过第二个参数,可以指定分区数量

sc.textFile("hdfs://node01:8020/dataset/wordcount.txt", 20)

如果通过第二个参数指定了分区,这个分区的数量一定不能小于 “block” 的数量

通过其他的 RDD 衍生 新的 RDD
val conf = new SparkConf().setMaster("local[2]")
val sc = new SparkContext(conf)

val source: RDD[String] = sc.textFile("hdfs://node01:8020/dataset/wordcount.txt", 20)
val words = source.flatMap { line => line.split(" ") }

source 是通过读取 HDFS 中的文件所创建的
words 是通过 source 调用算子 map 生成的新 RDD

通常每个 CPU core 对应 2-4 个分区是合理的值
支持的平台

支持Hadoop几乎所有的数据格式,支持HDFS 的访问
通过第三方的这次hi,可以访问Aws 和 阿里云中的文件,可以到对应的平台查看API

总结:

RDD 可以通过三种方式来创建,本地集合创建,外部数据集创建,其他的RDD 衍生。

RDD 算子

理解各个算子的作用
通过理解算子的作用,反向理解 WordCount 程序,以及 Spark的要点

Map算子
sc.parallelize(Seq(1, 2, 3))
  .map( num => num * 10 )
  .collect()
作用

把RDD 中的数据一对一的转为 另外的一种形式

调用
def map[U: ClassTag](f: T ⇒ U): RDD[U]
参数

f → Map 算子是 原RDD → 新RDD 的过程, 这个函数的参数是原 RDD 数据, 返回值是经过函数转换的新 RDD 的数据

注意点

Map 是一对一,如果函数是 String → Array [String ] 则新的 RDD 中每条数据就是一个数组

FlatMap 算子
sc.parallelize(Seq("Hello lily", "Hello lucy", "Hello tim"))
  .flatMap( line => line.split(" ") )
  .collect()
作用

FlatMap 算子和 Map 算子雷士,但是FlatMap 是一对多

调用
def flatMap[U: ClassTag](f: T ⇒ List[U]): RDD[U]
参数

f → 参数是原 RDD 数据, 返回值是经过函数转换的新 RDD 的数据, 需要注意的是返回值是一个集合, 集合中的数据会被展平后再放入新的 RDD

注意点

flatMap 其实是两个操作,是 map + flatten ,也是先转换,后把转换而来的List 展开。

ReduceByKey
sc.parallelize(Seq(("a", 1), ("a", 1), ("b", 1)))
  .reduceByKey( (curr, agg) => curr + agg )
  .collect()
作用

首先按照 Key 分组,接下来把整组的 Value 计算出一个聚合值,这个操作非常类似于 MapReduce 中的 Reduce

调用

def reduceByKey(func: (V, V) ⇒ V): RDD[(K, V)]

参数

func → 执行数据处理的函数, 传入两个参数, 一个是当前值, 一个是局部汇总, 这个函数需要有一个输出, 输出就是这个 Key 的汇总结果

注意点

ReduceByKey 只能作用于 Key-Value 型数据, Key-Value 型数据在当前语境中特指 Tuple2
ReduceByKey 是一个需要 Shuffled 的操作
和其它的 Shuffled 相比, ReduceByKey是高效的, 因为类似 MapReduce 的, 在 Map 端有一个 Cominer, 这样 I/O 的数据便会减少

总结

map 和 flatMap 算是都是转换,只是 flatMap 在转换过后会在执行展开,所以 map 是一对一,flatMap 是一对多
reduceByKey 类似于 MapReduce 中的reduce

上一篇 下一篇

猜你喜欢

热点阅读