Kylin 下压查询 (Pushdown) 到 Impala

Posted take-a-note

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kylin 下压查询 (Pushdown) 到 Impala相关的知识,希望对你有一定的参考价值。

背景介绍

Kylin 作为OLAP中主流的框架之一,其优势是在于利用Cube对数据做预计算。在离线计算的场景中,数据源为Hive表,使用Spark/MR对源数据进行折叠,将结果存储在HBase中。用户在查询的时候,元数据使用的是折叠后的维度(同步自Hive),实际查询的是HBase的结果。

这就带来了一个问题,某些场景下,用户需要查询折叠前的原始数据作为样本,或者查询未经折叠的列,Kylin就无法很好的支持了。

v2.3.0之前的版本,Kylin measure中有RAW这个函数,支持在HBase中存储原始列的值。但是经过社区的讨论,将RAW隐藏起来了,主要的理由是当cell中列数据过大,容易引起BufferOverflow,这个问题到现在也没有很好解决,只能通过修改RowConstants.ROWVALUE_BUFFER_SIZE的值。
具体讨论如下:
RAW measure in Apache Kylin
[Discuss] Disable/hide "RAW" measure in Kylin web GUI
Grow ByteBuffer Dynamically in Cube Building and Query

因此,寻找一个合适且高效的方法,用来完成特定查询就显得很重要了。

Kylin支持将不在预计算之中的查询下推到Hive中,这种方式很符合目前的使用场景。但是,Hive的计算需要向Yarn申请资源,耗费大量的时间,使得稍微复杂的查询在1min以上。通过调研Kylin查询下压的方式和官网对于配置的介绍,发现理论上支持所有JDBC连接方式的查询引擎,例如Impala和Presto。

因为生产环境没有Presto,只好使用Impala来测试一下了。

相关配置

1.修改kylin.properties
vim $KYLIN_HOME/conf/kylin.properties

#### QUERY PUSH DOWN ###
#
kylin.query.pushdown.runner-class-name=org.apache.kylin.query.adhoc.PushDownRunnerJdbcImpl
#
##kylin.query.pushdown.update-enabled=false
kylin.query.pushdown.jdbc.url=jdbc:impala://<impala-daemon-ip>:21050/default
kylin.query.pushdown.jdbc.driver=com.cloudera.impala.jdbc41.Driver
kylin.query.pushdown.jdbc.username=root
##kylin.query.pushdown.jdbc.password=
#
kylin.query.pushdown.jdbc.pool-max-total=150
kylin.query.pushdown.jdbc.pool-max-idle=100
kylin.query.pushdown.jdbc.pool-min-idle=50

2.下载并添加Impala依赖
Impala JDBC Connector 2.6.12 for Cloudera Enterprise

unzip ClouderaImpala_JDBC_2.6.12.1013.zip
cd ClouderaImpala_JDBC_2.6.12.1013
unzip ClouderaImpalaJDBC41-2.6.12.1013.zip
mv ImpalaJDBC41.jar $KYLIN_HOME/lib

3.重启Kylin

修改代码

1.经过压力测试,发现并发数并不是很理想,通过jstack分析,存在死锁,修改部分代码,死锁消失。目前并发数在每秒50左右(SELECT *)。
(此修改未经过功能测试,仅做参考)
JdbcPushDownConnectionManager

public Connection getConnection() 
    try 
        return dataSource.getConnection();
     catch (SQLException e) 
        throw new RuntimeException(e);
    

2.如果需要支持任意无法匹配的SQL下压,需要修改以下代码
PushDownUtil

private static Pair<List<List<String>>, List<SelectedColumnMeta>> tryPushDownQuery(String project, String sql,
            String defaultSchema, SQLException sqlException, boolean isSelect, boolean isPrepare) throws Exception 
 
        KylinConfig kylinConfig = ProjectManager.getInstance(KylinConfig.getInstanceFromEnv()).getProject(project).getConfig();
 
        if (!kylinConfig.isPushDownEnabled())
            return null;
 
        if (isSelect) 
            logger.info("Query failed to utilize pre-calculation, routing to other engines", sqlException);
            if (!isExpectedCause(sqlException)) 
                logger.info("quit doPushDownQuery because prior exception thrown is unexpected");
//                注释该行,使得所有无法解析的SQL均下压,如果SQL出错,会在下压引擎中报错
//                return null;
            
         else 
            Preconditions.checkState(sqlException == null);
            logger.info("Kylin cannot support non-select queries, routing to other engines");
        

相关资料

Enable Query Pushdown

以上是关于Kylin 下压查询 (Pushdown) 到 Impala的主要内容,如果未能解决你的问题,请参考以下文章

线段树--从入门到入土入门篇:没有pushdown的简单建树&查询&修改(单点+区间)

开源分布式支持超大规模数据分析型数据仓库Apache Kylin实践-下

Kylin实战—— REST API演示和Kylin_JDBC演示代码

Kylin与CDH兼容性剖析

浅析MySQL中的Index Condition Pushdown (ICP 索引条件下推)和Multi-Range Read(MRR 索引多范围查找)查询优化

Mysql 查询优化器之派生条件回移Derived Condition Pushdown详解