Spark 相关

匿名 (未验证) 提交于 2019-12-03 00:22:01

一、Spark SQL相关

1.spark sql 要比shark 快的几点:

A.内存列存储,有点像parquet或者orc等列式存储格式,存储效率高

B.字节码生成技术,主要是避免了虚函数的调用,转变成了scala函数映射,在sql语句执行的时候,具体方法执行(例如 sort中的compare)会调用虚函数,虚函数调用会导致指令集预读失效,因为虚函数后面的指令集不是马上要执行的,导致cpu需要被暂停一下,这里给出相关的网址:Spark SQL Codegen介绍

C.scala代码优化

A:内存列存储(In-Memory Columnar Storage)












B:字节码生成技术(bytecode generation,即CG)


复制代码


在这个查询里,如果采用通用的SQL语法途径去处理,会先生成一个表达式树(有两个节点的Add树,参考后面章节),在物理处理这个表达式树的时候,将会如图所示的7个步骤:
  • 调用虚函数Add.eval(),需要确认Add两边的数据类型
  • 调用虚函数a.eval(),需要确认a的数据类型
  • 确定a的数据类型是Int,装箱
  • 调用虚函数b.eval(),需要确认b的数据类型
  • 确定b的数据类型是Int,装箱
  • 调用Int类型的Add
  • 返回装箱后的计算结果

其中多次涉及到虚函数的调用,虚函数的调用会打断CPU的正常流水线处理,减缓执行。




然后,通过调用,最终调用:



最终实现效果类似如下伪代码:



复制代码


对于Spark1.1.0,对SQL表达式都作了CG优化,具体可以参看codegen模块。CG优化的实现主要还是依靠scala2.10的运行时放射机制(runtime reflection)。对于SQL查询的CG优化,可以简单地用下图来表示:



C:scala代码优化

2.Spark SQL应用

苏宁大数据应用

出处了一篇苏宁Spark SQL的应用文章,其中两个地方比较有意思:

a. spark sql + jdbc 来代替sqoop,这可能跟它的业务需求有关,原始DB里的数据不需要存储到hdfs、hive或者hbase中,直接就使用spark sql+jdbc进行数据的清洗和计算了

b. driver 并行优化,提前使用action操作来触发数据的加载操作

文章来源: Spark 相关
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!