1、工做原理剖析java
一、圖解mysql
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;