一.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找到哪一步耗时最长,针对性优化