datart 服务端聚合以及http 和 file 开启缓存过程

本文介绍了JDBC数据提供器的执行流程,重点讲解了`execute`方法中服务端聚合与本地执行的区别,以及`executeLocalQuery`在内存数据库中的应用。通过`getDataProviderService`和`DataProviderAdapter`,展示了如何处理不同源类型的数据并执行SQL查询。

-执行 execute 或者 /execute/test都会执行到ProviderManager 的run 方法

    public Dataframe run(DataProviderSource source, QueryScript queryScript, ExecuteParam param) throws Exception {
    //source 的 type 为 jdbc 或者http 、file 
        Dataframe dataframe = getDataProviderService(source.getType()).execute(source, queryScript, param);
        excludeColumns(dataframe, param.getIncludeColumns());
        return dataframe;
    }
  • 如果是jdbc 调用JdbcDataProvider#execute

    public Dataframe execute(DataProviderSource source, QueryScript script, ExecuteParam executeParam) throws Exception {
        JdbcDataProviderAdapter adapter = matchProviderAdapter(source);
        //If server aggregation is enabled, query the full data before performing server aggregation
        //如果开启服务端聚合
        if (executeParam.isServerAggregate()) {
        
            return adapter.executeInLocal(script, executeParam);
        } else {
        //如果不开启则调用原始的数据库执行
            return adapter.executeOnSource(script, executeParam);
        }
    }

    public Dataframe executeInLocal(QueryScript script, ExecuteParam executeParam) throws Exception {
        SqlScriptRender render = new SqlScriptRender(script
                , executeParam
                , getSqlDialect());
         //生成原始的sql       
        String sql = render.render(false, false, false);
        //执行sql 获取结果
        Dataframe data = execute(sql);
        if (!CollectionUtils.isEmpty(script.getSchema())) {
            for (Column column : data.getColumns()) {
                column.setType(script.getSchema().getOrDefault(column.getName(), column).getType());
            }
        }
        data.setName(script.toQueryKey());
        return LocalDB.executeLocalQuery(null, executeParam, Dataframes.of(script.getSourceId(), data));
    }
	//此方法仅为jdbc调用
    public static Dataframe executeLocalQuery(QueryScript queryScript, ExecuteParam executeParam, Dataframes dataframes) throws Exception {
    //复用下面一个方法 persistent 传false
        return executeLocalQuery(queryScript, executeParam, dataframes, false, null);
    }

    public static Dataframe executeLocalQuery(QueryScript queryScript, ExecuteParam executeParam, Dataframes dataframes, boolean persistent, Date expire) throws Exception {
        if (queryScript == null) {
            // 直接以指定数据源为表进行查询,生成一个默认的SQL查询全部数据
            queryScript = new QueryScript();
            queryScript.setScript(String.format(SELECT_START_SQL, dataframes.getDataframes().get(0).getName()));
            queryScript.setVariables(Collections.emptyList());
            queryScript.setSourceId(dataframes.getKey());
        }
		//获取url 如果persistent 是true 则 使用h2:file 否则 使用h2:mem
        String url = getConnectionUrl(persistent, dataframes.getKey());
        synchronized (url.intern()) {
        //根据persistent 判断使用那种方式 ,jdbc 只会传false
            return persistent ? executeInLocalDB(queryScript, executeParam, dataframes, expire) : executeInMemDB(queryScript, executeParam, dataframes);
        }
    }
  • 基于mem
  private static Dataframe executeInMemDB(QueryScript queryScript, ExecuteParam executeParam, Dataframes dataframes) throws Exception {
        Connection connection = getConnection(false, dataframes.getKey());
        try {
            for (Dataframe dataframe : dataframes.getDataframes()) {
            //调用h2保存
                registerDataAsTable(dataframe, connection);
            }
            return execute(connection, queryScript, executeParam);
        } finally {
            try {
                connection.close();
            } catch (Exception e) {
                log.error("connection close error ", e);
            }
            for (Dataframe df : dataframes.getDataframes()) {
                unregisterData(df.getId());
            }
        }

    }

流程图

<think>好的,用户问的是如何配置帆软BI之前提到的大数据平台系统。我需要先回顾之前的对话内容,确认他们提到的架构组件。之前讨论的架构包括数据采集层、存储层、计算层、服务层应用层,其中服务层用了StarRocksHive,应用层有实时看板、Ad-hoc分析等。 用户现在想在应用层使用帆软BI,所以需要将帆软与现有的大数据平台集成。首先,我需要了解帆软BI支持哪些数据源连接方式。通常BI工具可以通过JDBC、ODBC或者直接连接数据库。StarRocks支持MySQL协议,所以帆软可以通过MySQL JDBC来连接StarRocks。Hive的话可能需要Hive JDBC或者通过中间件如Presto来连接。 接下来要考虑的是网络权限配置。确保帆软服务器能够访问StarRocksHive的元数据服务,比如Hive MetastoreHDFS的配置。可能需要配置JDBC驱动到帆软的环境中,并设置正确的连接参数,比如主机名、端口、数据库名称、用户名密码。 然后是数据同步性能优化的问题。如果帆软需要实时数据,直接连接StarRocks会比较合适,因为StarRocks本身支持实时查询。对于历史数据,可能需要定期从Hive同步到StarRocks,或者通过联邦查询直接访问Hive表,但要注意性能问题,比如列裁剪谓词下推是否生效。 另外,用户可能关心如何在帆软中设计报表仪表板,如何利用StarRocks的物化视图来加速查询。需要指导用户在帆软中创建数据集时选择合适的表或视图,并优化查询语句,比如使用聚合结果。 还有安全方面的考虑,比如Kerberos认证。如果大数据平台启用了Kerberos,帆软连接StarRocks或Hive时需要配置相应的认证参数,可能需要使用LDAP或者直接集成Kerberos配置。 最后,可能需要提供一些优化建议,比如连接池配置、查询缓存、分区策略等,以提升整体性能稳定性。同时,用户可能需要知道如何处理常见的连接问题,比如驱动版本不兼容、网络不通、权限不足等。 总结下来,回答需要分步骤说明如何配置帆软BI连接到StarRocksHive,包括数据源配置、驱动安装、参数设置,以及性能优化常见问题处理。同时,相关问题需要覆盖连接测试、权限管理、实时数据同步、性能调优故障排查等方面。</think>以下是配置帆软BI与大数据平台(StarRocks/Hive)集成的详细步骤,涵盖 **数据源连接、权限管理、性能优化** 等核心环节: --- ### **1. 数据源连接配置** #### **1.1 配置StarRocks数据源** - **连接方式**:通过 MySQL JDBC 驱动连接 StarRocks。 - **操作步骤**: ```text 1. 下载 MySQL JDBC 驱动(mysql-connector-java-8.x.jar)。 2. 将驱动复制到帆软BI的 `webapps/webroot/WEB-INF/lib` 目录。 3. 重启帆软BI服务。 4. 在帆软BI控制台中: - 新建数据源 → 选择 "JDBC"。 - 配置连接信息: URL: jdbc:mysql://<starrocks-fe-host>:9030/<database> 用户名: <starrocks_user> 密码: <starrocks_password> - 测试连接并保存。 ``` #### **1.2 配置Hive数据源** - **连接方式**:通过 Hive JDBC 或 Presto 代理查询。 - **方案一:Hive JDBC 直接连接** ```text 1. 下载 Hive JDBC 驱动(hive-jdbc-3.x.jar)及 Hadoop 配置文件(core-site.xml, hdfs-site.xml)。 2. 将驱动配置文件复制到帆软BI的 lib 目录。 3. 在帆软BI中新建 JDBC 数据源: URL: jdbc:hive2://<hive-server2-host>:10000/<database> 用户名: hive 密码: (空) ``` - **方案二:通过Presto代理查询(推荐)** ```text 1. 部署 Presto 并配置 Hive Catalog。 2. 下载 Presto JDBC 驱动(presto-jdbc-36x.jar)。 3. 在帆软BI中新建 JDBC 数据源: URL: jdbc:presto://<presto-coordinator>:8080/hive/<database> 用户名: root ``` --- ### **2. 权限与安全配置** #### **2.1 StarRocks权限管理** - **用户授权**: ```sql -- 创建帆软BI专用用户并授权 CREATE USER 'fr_user'@'%' IDENTIFIED BY 'password'; GRANT SELECT_PRIV ON database.* TO 'fr_user'@'%'; ``` #### **2.2 Hive权限管理** - **Ranger/Sentry策略**: ```text 1. 在 Ranger 中创建策略: - 资源路径: hive_table_name - 用户: fr_user - 权限: SELECT 2. 确保 Hive Metastore HDFS 权限一致。 ``` #### **2.3 Kerberos认证(可选)** - **配置步骤**: ```text 1. 在帆软BI服务器上配置 Kerberos 客户端(krb5.conf, keytab 文件)。 2. 修改 JDBC URL 添加认证参数: StarRocks: jdbc:mysql://host:9030/db?kerberosPrincipal=fr_user@REALM&kerberosKeytab=/path/to/keytab Hive: jdbc:hive2://host:10000/db;principal=hive/host@REALM ``` --- ### **3. 性能优化策略** #### **3.1 查询优化** - **物化视图加速**: ```sql -- 在StarRocks中创建物化视图供帆软BI查询 CREATE MATERIALIZED VIEW sales_summary AS SELECT date, SUM(amount) total_sales FROM sales_table GROUP BY date; ``` - **谓词下推与列裁剪**: ```text 在帆软BI的SQL语句中明确指定过滤条件字段: SELECT date, total_sales FROM sales_summary WHERE date >= '2023-01-01'; ``` #### **3.2 连接池配置** - **帆软BI连接池参数**: ```text 最大连接数: 20 空闲连接超时: 300秒 预加载SQL: SET enable_vectorized_engine = true; ``` #### **3.3 分区与索引** - **Hive表分区**: ```sql -- 按日期分区,减少扫描范围 CREATE TABLE sales ( id INT, amount DECIMAL(10,2) ) PARTITIONED BY (date STRING); ``` - **StarRocks倒排索引**: ```sql -- 对高频过滤字段(如用户ID)创建倒排索引 ALTER TABLE user_table SET ("index.user_id.type" = "bloom_filter"); ``` --- ### **4. 数据同步与调度** #### **4.1 实时数据同步** - **Kafka + Routine Load**: ```text 1. 在StarRocks中创建Routine Load作业消费Kafka数据。 2. 帆软BI直接查询StarRocks实时表。 ``` #### **4.2 离线数据同步** - **Hive → StarRocks 批量导入**: ```sql -- 使用Broker Load定期同步Hive数据 LOAD LABEL example_db.label1 ( DATA INFILE("hdfs://namenode/path/to/hive_data/*") INTO TABLE starrocks_table ) WITH BROKER "broker1" (...); ``` --- ### **5. 典型问题排查** #### **5.1 连接失败** - **解决方案**: - 检查 StarRocks/Hive 服务状态及端口开放情况。 - 验证 JDBC 驱动版本与服务端兼容性(如 MySQL 8.x 驱动需匹配 StarRocks 2.x+)。 #### **5.2 查询性能差** - **优化方向**: - 启用向量化引擎:`SET enable_vectorized_engine = true;` - 检查执行计划:在帆软BI中开启 SQL Profiling,分析扫描行数耗时。 #### **5.3 权限拒绝** - **排查步骤**: - 确认用户在 StarRocks/Hive 中的权限。 - 检查 Ranger/Sentry 策略是否生效。 --- ### **6. 架构集成示意图** ``` +-------------------+ +---------------------+ | 帆软BI(应用层) |<--->| 大数据平台服务层 | +-------------------+ | +-----------------+ | | | StarRocks | | | | Hive/Presto | | | +-----------------+ | +---------------------+ | +----------------------------+ | 计算与存储层 | | +------------------------+ | | | HDFS/Parquet/ORC | | | | Kafka/Flink | | | +------------------------+ | +----------------------------+ ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值