spark sql工做原理、性能优化和spark on hive----转载

1、工做原理剖析html

 

 

2、性能优化java

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表,也是很是不错的!

 

3、hive on sparkmysql

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的计算原理有以下几个要点:
一、将Hive表做为Spark RDD来进行操做:这个是没有疑问的
二、使用Hive原语
对于一些针对RDD的操做,好比groupByKey、sortByKey等。不使用Spark的transformation操做和原语。若是那样作的话,那么就须要从新实现一套Hive的原语,
并且若是Hive增长了新功能,那么又要实现新的Spark原语。所以选择将Hive的原语包装为针对RDD的操做便可。
三、新的物理执行计划生成机制
使用SparkCompiler将逻辑执行计划,即Operator Tree,转换为Task Tree。提交Spark Task给Spark进行执行。SparkTask包装了DAG,DAG包装为SparkWork。
SparkTask根据SparkWork表示的DAG计算。
四、SparkContext生命周期
Hive On Spark会为每一个用户的会话,好比执行一次SQL语句,建立一个SparkContext。可是Spark不容许在一个JVM内建立多个SparkContext。
所以,须要在单独的JVM中启动每一个会话的SparkContext,而后经过RPC与远程JVM中的SparkContext进行通讯。
五、本地和远程运行模式
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作了一些优化:
一、Map Join
Spark SQL默认对join是支持使用broadcast机制将小表广播到各个节点上,以进行join的。可是问题是,这会给Driver和Worker带来很大的内存开销。
由于广播的数据要一直保留在Driver内存中。因此目前采起的是,相似乎MapReduce的Distributed Cache机制,即提升HDFS replica factor的复制因子,
以让数据在每一个计算节点上都有一个备份,从而能够在本地进行数据读取。
二、Cache Table
对于某些须要对一张表执行屡次操做的场景,Hive On Spark内部作了优化,即将要屡次操做的表cache到内存中,以便于提高性能。可是这里要注意,
并非对全部的状况都会自动进行cache。因此说,Hive On Spark还有不少不完善的地方。sql

 

hive on spark环境搭建apache

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;

 

转载于:4六、Spark SQL工做原理剖析以及性能优化windows

相关文章
相关标签/搜索