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

猜你喜欢

转载自blog.csdn.net/sinat_17697111/article/details/83793663