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 的实现

spark 相关的更多相关文章

  1. hadoop和spark相关参数的配置

    背景 MapReduce和Spark对外提供了上百个配置参数,用户可以为作业定制这些参数以更快,更稳定的运行应用程序.本文梳理了最常用的一些MapReduce和Spark配置参数. MapReduce ...

  2. spark相关脚本解析

    spark-shell/spark-submit/pyspark等关系如下: #spark-submit 逻辑: ########################################### ...

  3. Spark相关下载

    HBase: http://hbase.apache.org/ Hadoop hadoop.apache.org spark http://spark.apache.org/

  4. Spark相关

    非常好的spark分析博客,我们team的,哈哈:http://jerryshao.me/ spark programming guide: https://github.com/mesos/spar ...

  5. Spark相关错误汇总

    前面介绍了Spark开发环境的搭建,下面将在实际开发过程中遇到的一些问题汇总一下: 1.Exception in thread "main" com.typesafe.config ...

  6. Hadoop/Spark相关面试问题总结

    面试回来之后把其中比较重要的问题记了下来写了个总结: (答案在后面) 1.简答说一下hadoop的map-reduce编程模型 2.hadoop的TextInputFormat作用是什么,如何自定义实 ...

  7. spark相关介绍-提取hive表(一)

    本文环境说明 centos服务器 jupyter的scala核spylon-kernel spark-2.4.0 scala-2.11.12 hadoop-2.6.0 本文主要内容 spark读取hi ...

  8. Spark相关知识点(一)

    spark工作机制,哪些角色,作用. spark yarn模式下的cluster模式和client模式有什么区别.

  9. Hadoop相关日常操作

    1.Hive相关 脚本导数据,并设置运行队列 bin/beeline -u 'url' --outputformat=tsv -e "set mapreduce.job.queuename= ...

随机推荐

  1. 一切皆文件-文件是对IO的最简抽象

    引用<Linux Kernel Development>原书里面的一句话 in Unix, everything is a file.This simplifies the manipul ...

  2. Windows彻底卸载系统自带的office

    由于自带office导致按照新的office会提示要先卸载原来32位的office,又在控制面板或软件管理工具中找不到office,用如下方法删除 1.在C盘删除office文件夹 2.删除注册表 1 ...

  3. mac使用brew安装配置常见测试工具

    Homebrew 包管理工具可以让你安装和更新程序变得更方便,目前在 OS X 系统中最受欢迎的包管理工具是 Homebrew. 安装 在安装 Homebrew 之前,需要将 Xcode Comman ...

  4. 2018年暑假ACM个人训练题6 解题报告

    A:水题 https://www.cnblogs.com/yinbiao/p/9311834.html B:考察进制的转化 https://www.cnblogs.com/yinbiao/p/9311 ...

  5. webapi 获取json数据

    一般的我们可以直接使用参数来接受,这个就不多介绍了 [HttpGet] public IHttpActionResult Test2([FromUri]string name) { object ob ...

  6. Java中,如何跳出当前的多重嵌套循环

    在最外层循环前加一个标记如A,然后用break A;可以跳出多重循环.(Java中支持带标签的break和continue语句)

  7. LeetCode20.有效的括号 JavaScript

    给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 注意空字符串可被认 ...

  8. spring boot从redis取缓存发生java.lang.ClassCastException异常

    目录树 异常日志信息 错误原因 解决方法 异常日志信息 2018-09-24 15:26:03.406 ERROR 13704 --- [nio-8888-exec-8] o.a.c.c.C.[.[. ...

  9. 工具 | Axure基础操作 No.2

    不废话了,直接如之前一样上操作图才是正道. 1.设置文本类型为密码或者文件类型 可以在属性中也选择最大长度制定长度. 如果设置类型为文件,在浏览器中就会自动变成选择本地文件的按钮. 2.文本框提示文字 ...

  10. Java设计模式六大原则-1

    Java设计模式六大原则-1 做Java程序开发的每天都在使用JDK,Spring,SpringMvc,Mybatis,Netty,MINA等框架,但很少有人懂得背后的原理.即使打开跟下原码也是一头雾 ...