谈谈对spark的理解
https://www.cnblogs.com/gaoxing/p/4916785.html
Spark的优势
- 运行速度快:相对于Hadoop而言,Spark基于内存的运算要快100倍以上,基于硬盘也要快10倍以上。Spark实现了高效的DAG执行引擎,可以节约内存来高效处理数据流。
- 简单,易用:Spark支持Java、Python和Scala的API,还有超过80种的高级算法,用户可以快速构建不同的应用。
- 通用:一站式的解决方案,Spark可以用于批处理、交互式查询(Spark SQL),实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX)。这些不同类型的处理可以在同一个应用中无缝使用。
- 兼容性:Spark可以方便的与其他开源产品进行融合。如,Spark可以使用Hadoop的YARN和Mesos作为它的资源管理和调度器,并且可以处理所有Hadoop支持的数据,包括HDFS、HBase和Cassandra等。
Spark的工作流程
- client提交任务到master
- master将任务放入到队列中,获取appid,返回给client
- Driver端创建sc实例,等待资源分配
- 一旦有了资源,启动executor并反向和driver进行注册
- driver端开始运行代码,对到action算子就生成DAG有向无环图
- 将生成好的DAG有向无环图提交给DAGScheduler
- 从最后一个rdd开始遍历,如果是窄依赖就在当前阶段上RDD+1,如果是宽依赖就在stage上+1
- 找到所有的rstage后,遍历所有的stage,根据不同的stage创建不同的task,将这些task组成一个taskSet提交到TaskScheduler中
- taskScheduler是一个接口,使用Standalone模式,使用SchedulerBackEnd组件将任务提交到集群
- executor是一个线程池,task任务放入线程池中运行,将task任务用taskRunner包装运行
SparkStreaming和kafka对接
两种方式Receiver和Direct(直连)
Receiver:拉取固定时间间隔的数据(放到Executor内存中),
使用kafka高级API,
自动维护偏移量,
简单,数据达到固定时间才会进行处理,效率低且容易丢失数据
Direct(直连):相对于Executor直接连接到kafka的分区上(内部使用迭代实现),
使用kafka底层的API,
需要手动维护偏移量,
效率高,不会丢失数据
Spark优化
https://my.oschina.net/134596/blog/3037246
Scala版wordcount
object WordCount {
//本地单机运行
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setMaster("local")
conf.setAppName("wc")
val sc = new SparkContext(conf)
val rdd1: RDD[String] = sc.textFile("wordcount.txt")
val rdd2: RDD[String] = rdd1.flatMap(_.split(" "))
val rdd3: RDD[(String, Int)] = rdd2.map((_,1))
val rdd5: RDD[(String, Int)] = rdd3.reduceByKey(_+_)
rdd5.foreach(println)
}
}
SparkStreaming执行流程
SparkStreaming是将流式计算分解成一系列短小的批处理作业。这里的批处理引擎是Spark,也就是把SparkStreaming的输入数据按照batch size分成一段一段的数据,每一段数据都转换成DStream,然后将SparkStreaming中对DStream的Transforming操作转变为针对Spark中对RDD的Transformation操作,将操作变成中间结果保存在内存中。
Spark on yarn的工作流程
https://blog.csdn.net/weixin_40319752/article/details/81433062
来源:oschina
链接:https://my.oschina.net/u/4427158/blog/3164259