首页 SparkSQL

SparkSQL

举报
开通vip

SparkSQL1.SparkSQL1.1.介绍1.1.1.历史sparkSQL的前身是shark。在hadoop发展过程中,为了给熟悉RDBMS但又不理解MapReduce的技术人员提供快速上手的工具,hive应运而生,是当时唯一运行在hadoop上的SQL-on-Hadoop工具。但是,MapReduce计算过程中大量的中间磁盘落地过程消耗了大量的I/O,降低的运行效率,为了提高SQL-on-Hadoop的效率,大量的SQL-on-Hadoop工具开始产生,其中表现较为突出的是:●MapR的Drill●Cloudera的Imp...

SparkSQL
1.SparkSQL1.1.介绍1.1.1.历史sparkSQL的前身是shark。在hadoop发展过程中,为了给熟悉RDBMS但又不理解MapReduce的技术人员提供快速上手的工具,hive应运而生,是当时唯一运行在hadoop上的SQL-on-Hadoop工具。但是,MapReduce计算过程中大量的中间磁盘落地过程消耗了大量的I/O,降低的运行效率,为了提高SQL-on-Hadoop的效率,大量的SQL-on-Hadoop工具开始产生,其中 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 现较为突出的是:●MapR的Drill●Cloudera的Impala●Shark其中Shark是伯克利 实验室 17025实验室iso17025实验室认可实验室检查项目微生物实验室标识重点实验室计划 spark生态环境的组件之一,它修改了下图所示的右下角的内存管理、物理计划、执行三个模块,并使之能运行在spark引擎上,从而使得SQL查询的速度得到10-100倍的提升。但是,随着Spark的发展,对于野心勃勃的Spark团队来说,Shark对于hive的太多依赖(如采用hive的语法解析器、查询优化器等等),制约了Spark的OneStackrulethemall的既定方针,制约了spark各个组件的相互集成,所以提出了sparkSQL项目。SparkSQL抛弃原有Shark的代码,汲取了Shark的一些优点,如内存列存储(In-MemoryColumnarStorage)、Hive兼容性等,重新开发了SparkSQL代码;由于摆脱了对hive的依赖性,SparkSQL无论在数据兼容、性能优化、组件扩展方面都得到了极大的方便,真可谓“退一步,海阔天空”。2014年6月1日,Shark项目和SparkSQL项目的主持人ReynoldXin宣布:停止对Shark的开发,团队将所有资源放sparkSQL项目上,至此,Shark的发展画上了句话,但也因此发展出两个直线:SparkSQL和hiveonspark。1.1.2.*为什么sparkSQL的性能会得到怎么大的提升呢?主要sparkSQL在下面几点做了优化:内存列存储(In-MemoryColumnarStorage)sparkSQL的表数据在内存中存储不是采用原生态的JVM对象存储方式,而是采用内存列存储,如下图所示。该存储方式无论在空间占用量和读取吞吐率上都占有很大优势。对于原生态的JVM对象存储方式,每个对象通常要增加12-16字节的额外开销,对于一个270MB的TPC-Hlineitemtable数据,使用这种方式读入内存,要使用970MB左右的内存空间(通常是2~5倍于原生数据空间);另外,使用这种方式,每个数据记录产生一个JVM对象,如果是大小为200B的数据记录,32G的堆栈将产生1.6亿个对象,这么多的对象,对于GC来说,可能要消耗几分钟的时间来处理(JVM的垃圾收集时间与堆栈中的对象数量呈线性相关)。显然这种内存存储方式对于基于内存计算的spark来说,很昂贵也负担不起。对于内存列存储来说,将所有原生数据类型的列采用原生数组来存储,将Hive支持的复杂数据类型(如array、map等)先序化后并接成一个字节数组来存储。这样,每个列创建一个JVM对象,从而导致可以快速的GC和紧凑的数据存储;额外的,还可以使用低廉CPU开销的高效压缩方法(如字典编码、行长度编码等压缩方法)降低内存开销;更有趣的是,对于分析查询中频繁使用的聚合特定列,性能会得到很大的提高,原因就是这些列的数据放在一起,更容易读入内存进行计算。字节码生成技术(bytecodegeneration,即CG)在数据库查询中有一个昂贵的操作是查询语句中的表达式,主要是由于JVM的内存模型引起的。比如如下一个查询:SELECTabFROMtable在这个查询里,如果采用通用的SQL语法途径去处理,会先生成一个表达式树(有两个节点的Add树,参考后面章节),在物理处理这个表达式树的时候,将会如图所示的7个步骤:1、调用虚函数Add.eval(),需要确认Add两边的数据类型2、调用虚函数a.eval(),需要确认a的数据类型3、确定a的数据类型是Int,装箱4、调用虚函数b.eval(),需要确认b的数据类型5、确定b的数据类型是Int,装箱6、调用Int类型的Add返回装箱后的计算结果,其中多次涉及到虚函数的调用,虚函数的调用会打断CPU的正常流水线处理,减缓执行。Spark1.1.0在catalyst模块的expressions增加了codegen模块,如果使用动态字节码生成技术(配置spark.sql.codegen参数),sparkSQL在执行物理计划的时候,对匹配的表达式采用特定的代码,动态编译,然后运行。如上例子,匹配到Add方法:然后,通过调用,最终调用:对于Spark1.1.0,对SQL表达式都作了CG优化,具体可以参看codegen模块。CG优化的实现主要还是依靠scala2.10的运行时放射机制(runtimereflection)。对于SQL查询的CG优化,可以简单地用下图来表示scala代码优化另外,sparkSQL在使用Scala编写代码的时候,尽量避免低效的、容易GC的代码;尽管增加了编写代码的难度,但对于用户来说,还是使用统一的接口,没受到使用上的困难。1.2.提交应用1.2.1.提交应用利用EclipseIDE工具将scala程序打包部署到spark的集群环境。1.2.2.创建scala 工程 路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理 步骤:1、新创建scala项目2、将spark的jar加入到项目中引入后会报错,由于scala的版本。修改一下即可。3、把jar包去除就可以了4、修改对应的版本,修改为2.10.5或者2.10都可以(scala的版本差异大,兼容性差)1.2.3.创建例子packagecom.scalaimportorg.apache.spark.SparkConfimportorg.apache.spark.SparkContextobjectApp{defmain(args:Array[String]):Unit={valconf=newSparkConf()  //创建SparkConf对象conf.setAppName("first")   //创建应用程序firstconf.setMaster("local[2]")  //创建单个sparkconf.set("spark.shuffle.manager","hash")valsc=newSparkContext(conf)sc.textFile("/root/letter.txt",2).flatMap{x=>x.split("")}.map{x=>(x,1)}.reduceByKey{(x,y)=>xy}.saveAsTextFile("/root/result")sc.stop()}}1.2.4.打jar包scala和java工程打jar包方式相同其中匿名函数也自动会变成一些类,为什么有三个函数呢?main…的。因为我们代码中有三个函数,它就把这三个函数编译成了class。运行时就是一个对象。1.2.5.上传jar包到sparkcd/usr/local/src/spark/spark-1.5.2-bin-hadoop2.6上传first.jar包1.2.6.spark上执行jar包bin/spark-submit.sh用来提交一个应用程序--masterlocal|spark集群的地址,优先级比代码中的低--jars所引用的第三方的jar包(详细路径)jar包会被分发到所有worker节点上--driver-class-path所引用的第三方的jar包(详细路径)仅在dirver节点上--conf配置key=配置的值,优先级比代码中的低如:--confspark.shuffle.manager=hashbin/spark-submit--classcom.scala.Appfirst.jar正确执行,将会在/root产生result目录,目录下有多个文件[root@spark1~]#cd/root/result[root@spark1result]#lltotal8-rw-r--r--.1rootroot40May2803:54part-00000-rw-r--r--.1rootroot24May2803:54part-00001-rw-r--r--.1rootroot 0May2803:54_SUCCESS如果目录存在则报错FileAlreadyExistsException:Outputdirectoryfile:/root/resultalreadyexists先删除,再执行。rm-rfresult使用spark-submit默认不会记录日志,如想启用日志:cpconf/spark-defaults.conf.templateconf/spark-defaults.confviconf/spark-defaults.conf1.3.SparkSQL环境1.3.1.SparkShell支持将RDD再次封装成一个DataFrame对象,而这个对象更类似于关系型数据库中的表。借鉴hive的思想,创造了SparkSQL。bin/spark-shell--master=localbin/spark-shell--master=yarn-client启动spark-shell,链接yarn集群。成功后会创建sqlContext对象。1.3.2.创建DataFrame对象DataFrame就相当于数据库的一张表。它是个只读的表,不能运算过程再往里加元素。
本文档为【SparkSQL】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_266065
暂无简介~
格式:doc
大小:23KB
软件:Word
页数:10
分类:
上传时间:2021-11-15
浏览量:24