1.老生常谈,sql调优必看执行计划,无论是hive还是impala。查看impala的执行计划可以说比较详细,分为三个粒度,分别是:explain、summary、profile。
(1) impala-shell中执行explain sql,会打印sql语句的执行计划,每一步的解释如下图所示:
优点:查看执行计划,调整sql语句
缺点:不清楚sql的执行详情,调整sql语句只能凭经验
(2) 在sql执行完成后,执行summary可以 看到这条sql语句执行时所消耗的时间和资源的情况,还有Impala预估的资源使用
执行summary语句后打印情况如下图:
优点:明确sql每个阶段的执行时间以及资源占用情况,和具体的关联方式
缺点:执行复杂的sql可能会耗费长时间,只能在sql执行后查看明细
(3)sql执行完成后,执行profile,产生一个详细的报告显示低水平的最新查询被执行。此信息仅在查询完成后才可用。它显示物理细节,如读取字节数、最大内存使用量等每个节点的物理细节,部分显示如下图:
优点:使用此信息来确定如果查询是I/O密集型或CPU绑定的,是否有网络条件实施的瓶颈,是否放缓是影响而不是其他的一些节点,并检查推荐配置设置,如短路本地读取效果
缺点:打印输出的明细数据量非常大,不太容易查看
根据以上三类语句,基本上可以分析清楚sql的执行情况,以及每个阶段所消耗的执行时间和资源情况,就可以找出拖累整体运行效率的执行片段,定位到具体环节,针对此过程进行优化就会大大的提高整体sql脚本的执行效率。
参照网址:https://docs.cloudera.com/documentation/enterprise/5-16-x/topics/impala_kudu.html#kudu_dml
在数据处理过程中,会出现如下情况: 第一次写入数据为10条 由于当第一次计算错误。 第二次计算将新结果写入时,用upsert只会更新和添加与第一次主键重复或者新增的数据,比如更新了8条,那么表里会有两条脏数据,没法处理。 这种情况有两种方式处理: 第一,当数据为中间结果表,量级小时可以采取的措施要么进行drop或者delete,清空或者重建表重新插入。 第二,在新数据插入/更新之前,将表中的数据进行标记删除,之后插入的数据会更新标记,此操作相对合理 (另一种方式可以借助 Parquet 列式存储格式的hive表,Impala+Parquet 查询性能也是非常快,并且可以使用overwrite,避免产生数据垃圾)
在执行ETL操作前,尽可能执行compute stats 表名,不然impala执行sql生成的计划执行数评估的内存不准确,容易评估错误导致实际执行不了
查看kudu表分区下所占的存储空间 和表总的存储空间
a.查看表整体所占用的存储空间,如下图:
b.查看表分区所占的存储空间
Cloudera Manager -->进入Kudu --> 进入Web UI–如下图:
进入Tablet Servers之后就能查看集群节点的Tablet Servers详情列表,如下图
进入任意一个Tablet Servers后,能够查到具体的表对应的分区大小,如下图: