一. 入门
初始
spark基于内存计算(速度快),且会把任务切分成很多块来运行。
借助YARN来调度资源。
2.3版本的,py的spark有很多没有实现。
YARN中给spark提供调度资源的功能,YARN中资源管理的主节点是RS,从节点是NodeManager。(2版本);
资源由YARN管理,任务由application master来管理。
spark读取数据源可以来自hdfs,也可以来自本地。hdfs是基于磁盘进行存储,block块是128M。hdfs的副本存储策略,每个副本128M。
Spark core, Spark Streaming,Spark SQL;
对比下mapreduce:
从内存缓冲区溢写到磁盘,溢写到几个分区,由谁决定?
由reduce的个数来决定。涉及到数据的节点之间的传输。
spark的shffule和mapreduce的不同,也会基于磁盘,但是maptask基于内存而不放在磁盘中。
MapReduce是从磁盘读,然后再写入磁盘。
Spark可以从源头读取数据,经过spark处理结果,可以放入内存中。不必每一次把结果写入到内存中。
spark 核心RDD
RDD弹性分布式数据集;
HDFS也是分布式文件系统,因为其中有最小的存储单元block分布在不同的节点之上。
RDD也有最小单元partition,有多少个组成,和读取的block数量相同。读取的block数有多少,那么就有多少个分区。
RDD的五大特性:
(1) RDD由一系列的partiton组成;
RDD2的partition与1中partition的个数相同。
flatMap作用到RDD1的partition然后生成RDD2的partition。
(2) 算子就是函数,是作用在RDD的partition上的;
当RDD2丢了后,用相同逻辑作用在RDD1上,来进行还原。
(3) RDD之间有依赖官修;
(4) 分区器是作用在k,v格式的RDD上;
分区的作用是溢写磁盘的数据去往哪个分区上。
问题:
- 什么是kv格式的RDD?
RDD中的数据是一个个的tuple2 数据,那么这个RDD就是KV格式的RDD。
(5) 每个partition可以对外提供位置;
partition可以对外提供计算数据的位置,这样有利于数据处理的本地化。(计算移动,数据不移动);
问题:
2. Spark读取HDFS中数据的方法。
读取方法textFile是底层是调用MR读取HDFS文件的方法,首先会split每个split对应一个block,每个split会对应一个block,每个split对应生成RDD的每个partition。
3. 哪里体现了RDD的弹性?
(1) RDD之间有依赖关系;
(2) RDD 的partition可多可少;什么情况下需要少,启动task的时间要大于数据量的时间。
4. 哪里体现分布式?
RDD的partition是分布在多个节点之上的。
Spark运行模式,依靠什么来提供资源。Local,Standalone,Yarn。
Spark任务执行原理:
Driver的功能是往数据所在的节点上发送task。task执行需要资源,work就是负责资源调度的重节点。相当于Yarn的workmanager。Driver和Worker都是JVM进程。
节点的意思就是一台机器。
conf 可以设置SparkApplication的名称,设置spark运行模式,及Spark运行的资源。
资源设置:conf.set
spark的核,某个时刻,核只能处理一个task。
Lineage:
RDD连成的一条线就是DAG有向无环图,RDD之间的一系列依赖关系。
算子
三种算子:transformations,action,持久化。
transformations 懒加载,延迟执行;action算法触发执行。
当action时,当前spark的application就有了一个job。
spark application是由多个job组成的,几个job看有几个action算子去触发。每有一个action算子会触发一个job。
如果给了一个算子类型,能区分出transformation或action吗。看返回的是什么,RDD类型和值的类型。
flatMap是一对多;
filter是一对一的关系。
groupbyKey,对key进行分组。
kv格式的rdd。
package com.bjsxt.scala.spark
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
object Day01 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setMaster("local")
conf.setAppName("test")
val sc = new SparkContext(conf)
sc.setLogLevel("Error")
val lines = sc.textFile("./data/words")
// val result :Array[String] = lines.take(5)
// result.foreach(println)
// val str: String = lines.first()
// println(str)
// val result: Array[String] = lines.collect()
// result.foreach(println)
//
//
// val l: Long = lines.count()
// println(l)
// val result: RDD[String] = lines.sample(true,0.1,100L)
// result.foreach(println)
// val words = lines.flatMap(one=>{one.split(" ")})
// val pairWords = words.map(one=>{(one,1)})
// val reduceResult : RDD[(String,Int)]= pairWords.reduceByKey((v1:Int,v2:Int)=>{v1+v2})
// val transRDD : RDD[(Int,String)] = reduceResult.map(tp=>{tp.swap})
// val result: RDD[(Int, String)] = transRDD.sortByKey(false)
// result.map(_.swap).foreach(println)
// reduceResult.sortBy(tp=>{tp._2},false).foreach(println)
//filter
// val rdd1 = lines.flatMap(one=>{one.split(" ")})
// rdd1.filter(one=>{
// "hello".equals(one)
// }).foreach(println)
//flatMap 一对多
// lines.flatMap(one=>{one.split(" ")}).foreach(println)
//map 一对一
// lines.map(one=>{
one+ "#"
}).foreach(println)
}
}
转成kv用mapToPair;
Spark SQL
处理结构化数据的spark模块。;
sparkSQL的抽象数据类型:DataFrame和DataSet。
Hive是将HiveSQL转换成MapReduce然后提交到集群执行,SparkSQL是将SparkSQL转换伟Spark的RDD,放在集群上来执行。
DataFrame
DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表格。是RDD的扩展,每一列都带有名称和类型,使得spark sql可以拿到结构信息,且可以针对性的做些优化。
DataFrame相当于在RDD上又做了层抽象,比RDD多了二维表格结构及属性信息。
DataFrame懒执行,但性能上比RDD要高。对当前两张表进行连接查询,然后从连接的结果中来过滤数据。查询时,先执行过滤,再去做连接,这样连接的数据量就变少了。
DataSet
是DataFrame的扩展。强类型。可以把类与DataSet对应起来,做一个映射。
复习:
- SparkSQL和Hive对比:
- hive–引擎:把HQL语句翻译成mapreduce程序;
- SparkSQL–引擎:根据SQL生成Spark来进行计算;
- Spark对数据集的抽象:DataFrame和DataSet;
RDD是个抽象类,每种不同的实现的分区规则是不同的。
stage数量等于宽依赖数量+1。
持久化:cache和persuit;
day08:
入口是Spark Session,包含了Spark Context。
真正执行时,是由sparkcontext来做的计算,只不过内部根据当前的结构来做的优化。
- 作者计算机硕士,从事大数据方向,公众号致力于技术专栏,主要内容包括:算法,大数据,个人思考总结等