一.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找到哪一步耗時最長,針對性優化