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. Yii 多表关联relations

    1,首先多表关联是在models/xx.php的relations里配置的.而且是互配,但有区别.格式:'VarName'=>array('RelationType', 'ClassName', ...

  2. 在CentOS实现mysql数据库的自动备份

    数据是一个比较重要的数据,经常需要备份,每次都手动比较麻烦.本脚本主要现实在CentOS中实现对数据库的备份和保留最近十五天的备份文件.避免太多无用陈旧的备份占用空间. #!/bin/bashid=& ...

  3. 检测Android和IOS

    var u=navigator.userAgent; var isAndroid=u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; / ...

  4. 简单使用idea Spring Boot搭建项目

    第一步:使用Spring Initializr创建 第二步:项目配置 第三步:选择项目需要的依赖 第五步: ok 创建完成,修改仓库 maven{ url 'http://maven.aliyun.c ...

  5. [转]Python中下划线以及命名空间的意义

    Python 用下划线作为变量前缀和后缀指定特殊变量/方法. 主要存在四种情形 1. 1. object # public    2. __object__ # special, python sys ...

  6. NopCommerce 3.4中移动端访问抛弃响应式布局

    在Nop3.4中,他抛弃了原来的xxx.Mobile.cshtml的这种写法,而是采用了响应式布局,并且把规则也给改了,你在后台配置不启用响应式布局,在前台你仍然不能写xxx.Mobile.cshtm ...

  7. OSD仿真_MFC程序01

    Windows系统具有强大的绘图功能,可以用来模拟OSD显示.接下来将设计一个简单的模拟显示终端的程序,用于后续显示功能和菜单系统的开发.说明一下,对于Windows下的MFC编程我不怎么了解,只知道 ...

  8. php分页方法

    $page_on=15;//定义每页显示数 $pageNum=$_GET['pageNum']; //当前页数 $result = mysql_query("SELECT * FROM ne ...

  9. Web—02-轻松理解css

    CSS基本语法以及页面引用 CSS基本语法 css的定义方法是: 选择器 { 属性:值; 属性:值; 属性:值;} 选择器是将样式和页面元素关联起来的名称,属性是希望设置的样式属性每个属性有一个或多个 ...

  10. TinyMCE插件:Filemanager [4.x-6.x] 文件名统一格式化

    上传图片程序(filemanager/upload.php) 在if (!empty($_FILES) && $upload_files)中上传图片时,在文件正式上传至服务器前,有一次 ...