46、Spark SQL工作原理剖析以及性能优化
一、工作原理剖析
1、图解
二、性能优化
1、设置Shuffle过程中的并行度:spark.sql.shuffle.partitions(SQLContext.setConf()) 2、在Hive数据仓库建设过程中,合理设置数据类型,比如能设置为INT的,就不要设置为BIGINT。减少数据类型导致的不必要的内存开销。 3、编写SQL时,尽量给出明确的列名,比如select name from students。不要写select *的方式。 4、并行处理查询结果:对于Spark SQL查询的结果,如果数据量比较大,比如超过1000条,那么就不要一次性collect()到Driver再处理。
使用foreach()算子,并行处理查询结果。 5、缓存表:对于一条SQL语句中可能多次使用到的表,可以对其进行缓存,使用SQLContext.cacheTable(tableName),或者DataFrame.cache()即可。
Spark SQL会用内存列存储的格式进行表的缓存。然后Spark SQL就可以仅仅扫描需要使用的列,并且自动优化压缩,来最小化内存使用和GC开销。
SQLContext.uncacheTable(tableName)可以将表从缓存中移除。用SQLContext.setConf(),设置spark.sql.inMemoryColumnarStorage.batchSize参数(默认10000),可以配置列存储的单位。 6、广播join表:spark.sql.autoBroadcastJoinThreshold,默认10485760 (10 MB)。在内存够用的情况下,可以增加其大小,概参数设置了一个表在join的时候,
最大在多大以内,可以被广播出去优化性能。 7、钨丝计划:spark.sql.tungsten.enabled,默认是true,自动管理内存。 最有效的,其实就是第四点、缓存表和广播join表,也是非常不错的!
三、hive on spark
1、概述
Hive On Spark背景知识: sparkSQL与hive on saprk:
Hive是目前大数据领域,事实上的SQL标准。其底层默认是基于MapReduce实现的,但是由于MapReduce速度实在比较慢,因此这两年,陆续出来了新的SQL查询引擎。
包括Spark SQL,Hive On Tez,Hive On Spark等。 Spark SQL与Hive On Spark是不一样的。Spark SQL是Spark自己研发出来的针对各种数据源,包括Hive、JSON、Parquet、JDBC、RDD等都可以执行查询的,
一套基于Spark计算引擎的查询引擎。因此它是Spark的一个项目,只不过提供了针对Hive执行查询的工功能而已。适合在一些使用Spark技术栈的大数据应用类系统中使用。 而Hive On Spark,是Hive的一个项目,它是指,不通过MapReduce作为唯一的查询引擎,而是将Spark作为底层的查询引擎。Hive On Spark,只适用于Hive。
在可预见的未来,很有可能Hive默认的底层引擎就从MapReduce切换为Spark了。适合于将原有的Hive数据仓库以及数据统计分析替换为Spark引擎,作为全公司通用的大数据统计分析引擎。 首先看一下Hive的基本工作原理:
Hive QL语句 =>
语法分析 => AST =>
生成逻辑执行计划 => Operator Tree =>
优化逻辑执行计划 => Optimized Operator Tree =>
生成物理执行计划 => Task Tree =>
优化物理执行计划 => Optimized Task Tree =>
执行优化后的Optimized Task Tree Hive On Spark的计算原理有如下几个要点:
1、将Hive表作为Spark RDD来进行操作:这个是没有疑问的 2、使用Hive原语
对于一些针对RDD的操作,比如groupByKey、sortByKey等。不使用Spark的transformation操作和原语。如果那样做的话,那么就需要重新实现一套Hive的原语,
而且如果Hive增加了新功能,那么又要实现新的Spark原语。因此选择将Hive的原语包装为针对RDD的操作即可。 3、新的物理执行计划生成机制
使用SparkCompiler将逻辑执行计划,即Operator Tree,转换为Task Tree。提交Spark Task给Spark进行执行。SparkTask包装了DAG,DAG包装为SparkWork。
SparkTask根据SparkWork表示的DAG计算。 4、SparkContext生命周期
Hive On Spark会为每个用户的会话,比如执行一次SQL语句,创建一个SparkContext。但是Spark不允许在一个JVM内创建多个SparkContext。
因此,需要在单独的JVM中启动每个会话的SparkContext,然后通过RPC与远程JVM中的SparkContext进行通信。 5、本地和远程运行模式
Hive On Spark提供两种运行模式,本地和远程。如果将Spark Master设置为local,比如set spark.master=local,那么就是本地模式,
SparkContext与客户端运行在一个JVM中。否则,如果将Spark Master设置为Master的地址,那么就是远程模式,SparkContext会在远程的JVM中启动。 远程模式下,每个用户Session都会创建一个SparkClient,SparkClient启动RemoteDriver,RemoteDriver负责创建SparkContext。 Hive On Spark做了一些优化:
1、Map Join
Spark SQL默认对join是支持使用broadcast机制将小表广播到各个节点上,以进行join的。但是问题是,这会给Driver和Worker带来很大的内存开销。
因为广播的数据要一直保留在Driver内存中。所以目前采取的是,类似乎MapReduce的Distributed Cache机制,即提高HDFS replica factor的复制因子,
以让数据在每个计算节点上都有一个备份,从而可以在本地进行数据读取。 2、Cache Table
对于某些需要对一张表执行多次操作的场景,Hive On Spark内部做了优化,即将要多次操作的表cache到内存中,以便于提升性能。但是这里要注意,
并不是对所有的情况都会自动进行cache。所以说,Hive On Spark还有很多不完善的地方。
2、hive on spark环境搭建
1、安装包apache-hive-1.2.1-bin.tar.gz 2、在/usr/local目录下解压缩 3、进入conf目录,mv hive-default.xml.template hive-site.xml,修改hive-site.xml
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://spark1:3306/hive_metadata_2?createDatabaseIfNotExist=true</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
</property>
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse2</value>
</property> 4、在conf目录下
mv hive-env.sh.template hive-env.sh vi ./bin/hive-config.sh
export JAVA_HOME=/usr/java/latest
export HIVE_HOME=/usr/local/apache-hive-1.2.1-bin
export HADOOP_HOME=/usr/local/hadoop 5、cp /usr/share/java/mysql-connector-java-5.1.17.jar /usr/local/apache-hive-1.2.1-bin/lib 6、MySQL
create database if not exists hive_metadata_2;
grant all privileges on hive_metadata_2.* to 'hive'@'%' identified by 'hive';
grant all privileges on hive_metadata_2.* to 'hive'@'localhost' identified by 'hive';
grant all privileges on hive_metadata_2.* to 'hive'@'spark1' identified by 'hive';
flush privileges; 7、启动hive cli,./hive,报错,Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%7D
创建文件夹:/home/grid/apache-hive-1.2.1-bin
/iotmp
将hive-site.xml中所有的${system:java.io.tmpdir}改为上面的目录,这里建议用WinSCP将hive-site.xml拷贝到windows上来,用notepad++这种工具,来进行文本替换,比较方便。 8、启动hive cli,./hive,继续报错,Found class jline.Terminal, but interface was expected
cp /usr/local/apache-hive-1.2.1-bin/lib/jline-2.12.jar /usr/local/hadoop/share/hadoop/yarn/lib
将hadoop原来的老的jline-0.9.94.jar,改名或者删除 9、启动hive cli,/usr/local/apache-hive-1.2.1-bin/bin/hive,成功启动 使用: create table students(name string, age int);
load data local inpath '/usr/local/spark-study/resources/students.txt' into table students; // 使用Hive On Spark非常简单
// 只要用set hive.execution.engine命令设置Hive的执行引擎为spark即可
// 默认是mr
set hive.execution.engine=spark;
// 这里,是完全可以将其设置为Spark Master的URL地址的
set spark.master=spark://192.168.1.107:7077 select * from students;
46、Spark SQL工作原理剖析以及性能优化的更多相关文章
- 4.Apache Spark的工作原理
Apache Spark的工作原理 1 Why Apache Spark 2 关于Apache Spark 3 如何安装Apache Spark 4 Apache Spark的工作原理 5 spark ...
- NameNode和SecondaryNameNode工作原理剖析
NameNode和SecondaryNameNode工作原理剖析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.NameNode中的元数据是存储在那里的? 1>.首先,我 ...
- NameNode与DataNode的工作原理剖析
NameNode与DataNode的工作原理剖析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HDFS写数据流程 >.客户端通过Distributed FileSyst ...
- CDN 工作原理剖析
CDN 工作原理剖析 CDN / Content Delivery Network / 内容分发网络 https://www.cloudflare.com/zh-cn/learning/cdn/wha ...
- Spring Boot 揭秘与实战 源码分析 - 工作原理剖析
文章目录 1. EnableAutoConfiguration 帮助我们做了什么 2. 配置参数类 – FreeMarkerProperties 3. 自动配置类 – FreeMarkerAutoCo ...
- 秋色园QBlog技术原理解析:性能优化篇:缓存总有失效时,构造持续的缓存方案(十四)
转载自:http://www.cyqdata.com/qblog/article-detail-38993 文章回顾: 1: 秋色园QBlog技术原理解析:开篇:整体认识(一) --介绍整体文件夹和文 ...
- SQL Server 2016 查询存储性能优化小结
SQL Server 2016已经发布了有半年多,相信还有很多小伙伴还没有开始使用,今天我们来谈谈SQL Server 2016 查询存储性能优化,希望大家能够喜欢 作为一个DBA,排除SQL Ser ...
- Spark Scheduler内部原理剖析
文章正文 通过文章“Spark 核心概念RDD”我们知道,Spark的核心是根据RDD来实现的,Spark Scheduler则为Spark核心实现的重要一环,其作用就是任务调度.Spark的任务调度 ...
- spark sql运行原理
Spark sql 对SQL语句的处理,先将SQL语句进行解析(parse)形成一个tree,然后使用Rule对Tree进行绑定,优化等处理过程,通过模式匹配对不同类型的节点采用不同操作.查询优化器是 ...
随机推荐
- springboot 接口参数校验
前言 在开发接口的时候,参数校验是必不可少的.参数的类型,长度等规则,在开发初期都应该由产品经理或者技术负责人等来约定.如果不对入参做校验,很有可能会因为一些不合法的参数而导致系统出现异常. 上一篇文 ...
- 【imx6ul应用开发】如何修改串口?
4.1如何修改串口?答:开发板已经调好了串口驱动,调试串口,只需要修改dts文件即可,客户可以根据实际需要,确定硬件管脚具体用哪一个. 打开内核源代码/arch/arm/boot/dts/myb-y6 ...
- 笔记本端查看以前的wifi密码
家里老人忘记密码了.好像是我改了从,我也忘了,手中安卓手机root后也没找到记录密码的文件,水果机懒得弄了,突然想起来电脑还有记录,应该可以找到. 此篇也顺带记录下怎么通过手中笔记本找到以前练过的wi ...
- Requirements management in confluence
https://ja.confluence.atlassian.com/doc/blog/2015/08/how-to-document-product-requirements-in-conflue ...
- linux技能点七 shell
shell脚本:定义,连接符,输入输出流,消息重定向,命令的退出状态,申明变量,运算符,控制语句 定义:linux下的多命令操作文件 连接符: ::用于命令的分隔符,命令会从左往右依次执行 & ...
- H3C 802.11b/g工作频段划分图
- Kali和Metasploitable2的网络配置
Kali和Metasploitable2的网络配置 2017年06月19日 16:00:00 weixin_34275734 阅读数 389 原文链接:https://blog.csdn.net/ ...
- APT 信息收集——shodan.io ,fofa.so、 MX 及 邮件。mx记录查询。censys.io查询子域名。
信息收集 目标是某特殊机构,外网结构简单,防护严密.经探测发现其多个子机构由一家网站建设公司建设. 对子域名进行挖掘,确定目标ip分布范围及主要出口ip. 很多网站主站的访问量会比较大.往往主站都是挂 ...
- Java7与Java8中的HashMap和ConcurrentHashMap知识点总结
JAVA7 Java7的ConcurrentHashMap里有多把锁,每一把锁用于其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率呢.这 ...
- G1垃圾收集器系统化说明【官方解读】
还是继续G1官网解读,上一次已经将这三节的东东读完了,如下: 所以接一来则继续往下读: Reviewing Generational GC and CMS[回顾一下CMS收集器] The Concur ...