(本内容仅跟网易公司内部用户与私有部署用户相关)

若用户使用的是有数大数据平台impala数据源,则可以针对「数据底表」进行优化操作。

一、分区筛选

若用户使用的是有数大数据平台impala数据源,则可以针对「分区筛选」进行优化操作。 用户使用的数据表中含有分区时,添加分区筛选则默认选中最近分区,只扫描指定分区的数据,不再扫描全表,极大提高查询性能。具体操作步骤如下:

1. 数据连接开启数仓信息同步:

数据底表 - 图1

2. 模型侧加上分区筛选器:

数据底表 - 图2

3. 分区筛选器作用于报告时,模型中没有隐藏的分区字段,生成的图表默认带上该分区字段的分区筛选器并默认选择最近分区(若模型隐藏分区字段,则不会在报告上加筛选器):

数据底表 - 图3

二、使用Parquet存储格式

什么是“Parquet存储格式”?

Parquet为高性能列式存储格式,由于OLAP查询的特点,列式存储可以提升其查询性能。同时Parquet格式支持压缩,可以降低数据存储量,并且在查询时减少磁盘IO。因此使用Parquet存储可以提升其查询性能,从而提高报告性能。

具体操作

1. 在猛犸数据管理中,新建离线表时,存储格式选择PARQUET

数据底表 - 图4

2. 使用SQL,在创建表时,使用STORED AS PARQUET

CREATE TABLE dm_some_hive_table (
  some_field STRING COMMENT 'a field',
  ...
)
STORED AS parquet #存储使用parquet

三、使用分区表

什么是“分区表”

表分区是一种数据组织方案,在此方案中,表数据根据一个或多个表列中的值划分到多个称为“数据分区” 的存储对象中。每个数据分区都是单独存储的。分区表在查询时结合分区筛选,对于大数据量查询有较大性能提升,建议总数据量百万以上的表,尽量都用分区表。

具体操作

1. 在猛犸数据管理新建离线表时,开启分区表选项,并设定分区字段

数据底表 - 图5

2. 使用SQL,在创建表时,使用PARTITIONED BY

CREATE TABLE dm_some_hive_table (
  some_field STRING COMMENT 'a field',
  ...
)
PARTITIONED BY (`ds` string COMMENT '按照天进行分区')
STORED AS parquet

四、减少(分区)小文件数量

什么是“小文件”

Hive/Spark等运行SQL任务,在将运算好的数据写回HDFS时,有时候会产生大量小文件,相关信息可以在猛犸表详情查看:

数据底表 - 图6

如果是分区表,则可以在“分区信息”看到具体分区的文件数:

数据底表 - 图7

大量的小文件在查询时,增加元数据同步压力,也增加HDFS NameNode访问压力,尤其在并发查询稍多时,查询性能会直线下降且十分影响整个查询引擎集群的查询处理。

如何减少

目前通常数据底表大多是离线表(T+1时效),每天使用猛犸任务调度执行。因此可以在任务末尾使用distribute by cast(rand() * 10 as int);语句,可以降低分区文件数量,对文件数过多的底表的查询性能有较大优化。 示例:

insert overwrite
  table dm.dm_youdata_online_domain_kpi_info_p 
  partition (ds = '${azkaban.flow.1.days.ago}') 
select
  m.domain_id as id,
  m.name as name
from dim.dim_online_entity_domain_content
left join (
    select
      domain_id,
      visit_date
    from
      dw.dw_online_entity_domain_visit_record
    where
      ds = '${azkaban.flow.1.days.ago}'
) n on m.domain_id = n.domain_id 
group by 
    m.domain_id,
    m.name
  distribute by cast(rand() * 10 as int); ###

处理建议

  • 代码片段中的10可以按需调整,一般如果单分区中数据量较大(相应存储量大)时,该数值可以增大,但不建议超过100;
  • 在有数中使用的表的生成任务中加一下即可;
  • 如果表本身文件数不多且无分区(例如维表)或历史分区中的文件数较少,则可以不用处理;

五、表统计信息

在有数大数据平台自助分析模块,对非分区表执行“compute stats”,分区表执行“compute incremental stats后面接分区”来添加表的统计信息。