hive,spark sql優化

一.hive sql優化

1.發生數據傾斜,如何解決?

什麼是數據傾斜? 

由於數據分佈不均勻,造成數據大量的集中到一點,造成數據熱點

1.1 原因
1)、key分佈不均勻
2)、業務數據本身的特性
3)、建表時考慮不周
4)、某些SQL語句本身就有數據傾斜
1.2 表現
任務進度長時間維持在99%(或100%),查看任務監控頁面,發現只有少量(1個或幾個)reduce子任務未完成。因爲其處理的數據量和其他reduce差異過大。
單一reduce的記錄數與平均記錄數差異過大,通常可能達到3倍甚至更多。 最長時長遠大於平均時長。

1.3 解決方法

1)  打散 分佈不均的key 值 ,例如使用  COALESCE(我是key值, concat('!!!',rand()))  或者 對key值進行hash轉換

2)  對數據量較大的表進行拆分:分區,增量

終極套路:使用Bucket 桶表,可理解爲在分區的基礎上再做更細的分區表。

tips:需提前準備好桶表;用於分桶的字段值增長量不能過大

可參考:https://blog.csdn.net/u013850277/article/details/65937122?utm_source=itdadao&utm_medium=referral

3) 將數據量小的表進行 廣播機制,hive 裏關鍵字 是 /*+MAPJOIN(process_header,monthly_header表縮寫) */

spark中 是 broadcast。可理解爲提前將小表數據 廣播到每個executor的內存中。

2.表存儲格式對性能的影響

hive表的 存儲鴿子大概有:TextFile,SequenceFile,RCFile,ORC,Parquet。

每種格式的優缺點可參考:https://blog.csdn.net/sinat_17697111/article/details/81907185

在公司常見有SequenceFile和ORC。查看錶創建語句 show create table

SequenceFile:行存儲,意味你select * 和select 某一列 性能差不多

ORCFile:數據按行分塊 每塊按照列存儲。所以在使用此格式時,儘量select 少的字段,可提高查詢性能,在spark sql中較明顯。

二.spark sql優化

Hive on Mapreduce場景
Hive的出現可以讓那些精通SQL技能、但是不熟悉MapReduce 、編程能力較弱與不擅長Java語言的用戶能夠在HDFS大規模數據集上很方便地利用SQL 語言查詢、彙總、分析數據,畢竟精通SQL語言的人要比精通Java語言的多得多
Hive適合處理離線非實時數據

SparkSQL場景
Spark既可以運行本地local模式,也可以以Standalone、cluster等多種模式運行在Yarn、Mesos上,還可以運行在雲端例如EC2。此外,Spark的數據來源非常廣泛,可以處理來自HDFS、HBase、 Hive、Cassandra、Tachyon上的各種類型的數據。
實時性要求或者速度要求較高的場所

Hive缺陷
MapReduce:
Map任務結束後,要寫磁盤
一個MapReduce任務結束後,需要將中間結果持久化到HDFS
DAG生成MapReduce任務時,會產生無謂的Map任務
Hadoop在啓動MapReduce任務要消耗5-10秒,需要多次啓動MapReduce任務

 

SparkSQL在架構上和Hive類似,只是底層把MapReduce替換爲Spark

除了替換底層執行引擎,SparkSQL還做了3個方面的優化

可以基於內存的列簇存儲方案
對SQL語句提供基於代價優化
數據共同分片

優化建議:

1.使用臨時視圖減少落盤, 不落盤是spark的一個優勢,中間步驟 全部用 temporary view 代替臨時table ,減少讀寫hdfs的操作

2.spark下建表 文件格式選擇,spark默認爲textfile,可根據需求使用squenceFile  or ORCFile

3.select 指定字段,代替select *

4.spark其他技術,如broadcast, bucket

5.通過查看sparkUI找到哪一步耗時最長,針對性優化

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章