1、关于Spark的调优部分
1)更好的序列化实现:在Spark中,需要序列化的地方包括写入磁盘、Worker之间传输RDD等。默认的Java序列化性能比较低,所以将序列化的方式修改为kryo;
2)配置多个临时文件的目录:在并发性高的情况下,对一个文件的操作会影响整体的性能,为此可以创建多个文件夹,用于存放临时文件;
3)启用推测执行机制:类似于Hadoop中的Task任务处理,在某个Task处理速度明显慢时,会启用其它节点执行任务,有一个执行完就销毁掉另一个未执行完的节点;
4)GC调优:原则上是减少Full GC,在调优之前,必须先检查代码部分
2、Spark的CheckPoint机制
CheckPoint的机制是建立一个检查点,类似于快照。
在Spark的RDD依赖中,若依赖的关系太长,同时没有将中间结果存储,会导致计算出错时从头再来。为此Spark中可以利用缓存机制将部分中间结果缓存起来,此时一定程度上解决了数据丢失问题。但是若存储的内存或磁盘出错,也会导致重新计算,此时出现了checkpoint机制,就是将比较重要的中间数据做一个检查点存储到一个高可用的地方。
补充:在SparkStreaming中,也存在checkpoint机制。在需要对历史数据进行累计处理,可以设置一个检查目录,在该目录中,存储历史数据。
3、Spark的数据倾斜
出现情况:join(一大一小的情况)或者groupBy(某个key出现的次数过多)
解决:使用广播变量,将小的数据转换Map进行广播,广播会将Map发送到每个节点中,合并时利用该Map进行,可以减轻数据倾斜;
groupBy出现的可以将key后添加固定格式的随机数来减轻数据倾斜
4、SparkStreaming与Storm
相同点:都是分布式、容错、可扩展的处理系统
不同点:
Storm是实时数据计算,最快的处理可达10毫秒,对于数据的处理核心支持两个级别:最多一次(可能会丢失)、最少一次(保证数据不丢失)
SparkStreaming是小批量计算,处理老版本只能到达秒级,新版本可以到达毫秒级。并且数据的处理只处理一次。由于Spark平台的良好整合性,可以借助于Spark的其它模块,在开发效率上占有一定的优势。;
5、SparkStreaming的原理
SparkStreaming是将流式处理分解成一系列的短小的批处理作业,即按照batch size(如1秒)分成一段一段的数据DStream(discretized-离散化 Stream),每一段数据都转换为RDD,然后将针对SparkStreaming中的Dstream的Transformations操作转换为针对Spark RDD的Transformations操作,将RDD经过操作变成中间结果保存在内存中(也可以保存到磁盘)。
三种处理:只能处理最新的,处理历史数据(checkpoint)和最新的,处理一段时间内的(滑动窗口机制)
6、Spark的模式(简单介绍,具体请参考 https://www.jianshu.com/p/65a3476757a5 )
大致上分为三种:本地单机模式、Spark自带Cluster Manager的集群模式、借助于Yarn管理的集群模式。
本地单机模式:主要是为了测试代码的逻辑;
Spark自带Cluster Manager的集群模式:启动之前必须先启动Spark的Master和Worker守护进程;
基于Yarn的Resource Manager的集群模式:使用Yarn作为Spark的Cluster Manager,来为Spark的应用程序分配资源,并且启动之前需要启动Hadoop的各种服务。
提示:SparkSQL中的DataFrame,SparkStreaming中的DStream底层都是RDD
补充:SparkSQL的介绍
SparkSQL提供了一个成为DataFrame(数据框),底层是RDD,类似于关系型数据库中的表。
引入了新的RDD类型SchemaRDD;可以混合不同来源的数据,例如将HiveQL的数据和MySQL的数据进行join;在把执行语句解析后,变成RDD的计算。