4六、Spark SQL工做原理剖析以及性能優化

1、工做原理剖析java

一、圖解mysql

image


2、性能優化sql

1、設置Shuffle過程當中的並行度:spark.sql.shuffle.partitions(SQLContext.setConf())

2、在Hive數據倉庫建設過程當中,合理設置數據類型,好比能設置爲INT的,就不要設置爲BIGINT。減小數據類型致使的沒必要要的內存開銷。

三、編寫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),能夠配置列存儲的單位。

六、廣播join表:spark.sql.autoBroadcastJoinThreshold,默認10485760 (10 MB)。在內存夠用的狀況下,能夠增長其大小,概參數設置了一個表在join的時候,
最大在多大之內,能夠被廣播出去優化性能。

7、鎢絲計劃:spark.sql.tungsten.enabled,默認是true,自動管理內存。


最有效的,其實就是第四點、緩存表和廣播join表,也是很是不錯的!


3、hive on sparkapache

一、概述windows

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還有不少不完善的地方。


二、hive on spark環境搭建緩存

一、安裝包apache-hive-1.2.1-bin.tar.gz

二、在/usr/local目錄下解壓縮

三、進入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

五、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;

七、啓動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++這種工具,來進行文本替換,比較方便。

八、啓動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,更名或者刪除

九、啓動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;
相關文章
相關標籤/搜索