spark 相关

Spark为什么会比mapreduce快?

1.Spark减少了中间过程的磁盘读写,数据很多时候不需要落地,从而提升了效率。

2.Spark基于内存的读写,减少了磁盘IO、node数据交互的通信时间。

3.Spark并非mapreduce心跳的模式,任务调度性能比mapreduce快,适合迭代计算。

4.JVM的优化:Hadoop每次MapReduce操作,启动一个Task便会启动一次JVM,基于进程的操作。而Spark每次MapReduce操作是基于线程的,只在启动Executor是启动一次JVM,内存的Task操作是在线程复用的。

基于内存的迭代式计算

DAG :它可以把整个执行过程做一个图,然后进行优化

 

Spark存在的问题以及改进思路

1.依然是暴力扫描-需要索引。

如果数据总量几百亿,但很多时候我们只想对其中的含有某些关键词的数据进行分析,Spark依然要从头到尾扫描这几百亿的数据,太浪费资源,我们需要对每个维度的值创建一层索引,通过索引我们可以将不想关的记录直接跳跃过去,只对满足匹配条件的结果进行计算。这样即使总量有百亿,但经过匹配后的记录数可能仅仅是几千万,对这几千万的数据进行统计分析与对整体的100亿的数据进行统计分析,性能肯定要快上千倍万倍。

2.大部分的列均有重复值,Spark没有针对这种情况进行优化。

Spark目前的分组统计和排序计算直接读取数据的真实值,这样计算量以及磁盘IO都很大。
在真实的数据中,数据肯定是有重复的,我们可以对数据排重后按照数据大小进行编号,我们在这里称之为标签。

1)排序和分组仅仅使用标签进行计算。
2)用标签来代替原始值后,原始值仅仅存储一份,索引体积变小。
3)标签根据列的数据重复程度不同,标签的长度可以是1bits~32bits,内存中对应byte,short,int类型,因绝大部分数据都有重复,故short类型居多,占用存储空间也小。
4)使用原始数据的真实值(字符串),进行大小比较太耗费CPU资源,相比于完全数值型的标签,标签计算占用的cpu更少。
5)大多数的计算只需要使用标签,而不需要使用标签对应的原始值,仅仅在计算完毕后,将一少部分标签转换为真实值,给用户即可。

3.部分格式支持列存储,但尚有优化空间。
有相当一部分的场景我们只需要获取TOP N 条结果,以下面这条SQL为例
select a,b,c,d,e,f,g,h,i,j,k,l,m,x from testtable order by x desc limit 10
我们只需要获取前10个最大值的x列即可,目前Spark的处理方式是 将a,b,c,d,e,f,g,h,i,j,k,l,m,x 这14个列的值全部都读取出来,然后在按照x排序取出TOP N,其实最简单的变换下思路即可,我们先只取出x列,其他的13个列的数据并不读取,按照x列排序得到TOP N结果后,在将剩余的N个结果的13个值附加进来即可,这种先排序,后附加其他列的方式,相对于Spark那种将14个列全部读取出来,IO一下降低了13倍。

 与数据库思想的碰撞

DAG<--->执行计划
有了 rdd 之间的依赖关系,就是可以得到计算的 logical plan and physical plan, 然后去执行计算.
 
RDD<-->view:
rdd 和view 都是需要的时候再计算的模式,这样就可以有了计算的pipeline,也完全是数据库pipeline 的实现


原文地址:https://www.cnblogs.com/qiuhong10/p/7762878.html