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

猜你喜欢

转载自www.cnblogs.com/take-a-note/p/11516639.html
今日推荐