返回

谁是你的真命天子?主流开源分析引擎横向对比!

见解分享

在浩瀚数据分析宇宙中:揭开开源分析引擎之谜

在数据分析的浩瀚宇宙中,开源分析引擎犹如璀璨星辰,熠熠生辉,照亮了数据分析的未来。它们不断推动着该领域的发展,成为企业和组织从数据中挖掘价值的利器。

开启探索之旅

面对琳琅满目的开源分析引擎,我们踏上了一段激动人心的探索之旅,揭开它们的神秘面纱,寻找最契合你需求的“真命天子”。

Apache Druid:闪电般的查询速度

Apache Druid以其令人难以置信的查询速度和无与伦比的可扩展性而傲视群雄,成为实时数据分析领域的领军者。它能够实时摄取和处理海量数据,并以毫秒级响应时间提供查询结果,满足企业对实时数据洞察的迫切需求。

// 使用 Druid 摄取实时数据
import io.druid.data.input.impl.InlineInputRowParser;
import io.druid.data.input.impl.TimestampSpec;
import io.druid.query.Query;
import io.druid.query.Result;
import io.druid.query.aggregation.AggregatorFactory;
import io.druid.query.aggregation.CountAggregatorFactory;
import io.druid.query.spec.MultipleIntervalSegmentSpec;
import io.druid.query.spec.QuerySegmentSpec;
import io.druid.query.timeseries.TimeseriesQuery;
import org.apache.druid.client.DruidServerClient;
import org.apache.druid.client.cache.Cache;
import org.apache.druid.client.cache.LRUCache;
import org.apache.druid.client.cache.MapCache;
import org.apache.druid.java.util.common.DateTimes;
import org.apache.druid.java.util.common.guava.Sequence;
import org.apache.druid.java.util.common.guava.Sequences;

import java.util.Arrays;
import java.util.List;

public class DruidRealTimeExample {

    public static void main(String[] args) {
        // 创建一个 Druid Server 客户端
        DruidServerClient client = new DruidServerClient("http://localhost:8082", "druid/v2");

        // 定义要摄取的数据
        List<InlineInputRowParser.ParseSpec> parseSpecs = Arrays.asList(
                new InlineInputRowParser.ParseSpec("timestamp", "long"),
                new InlineInputRowParser.ParseSpec("temperature", "float")
        );

        // 创建一个时间戳规范,指定数据中的时间戳列
        TimestampSpec timestampSpec = new TimestampSpec("timestamp", "auto", null);

        // 创建一个输入行解析器,使用解析规范和时间戳规范
        InlineInputRowParser parser = new InlineInputRowParser(parseSpecs, timestampSpec);

        // 创建一个摄取任务
        InsertTask task = new InsertTask(
                "my-data-source",
                parser,
                new ListFormatInputRowParser(parser)
        );

        // 使用客户端提交摄取任务
        client.submitTask(task);

        // 创建一个查询,使用时间间隔和聚集函数
        QuerySegmentSpec intervalSpec = new MultipleIntervalSegmentSpec(Arrays.asList(
                new Interval("2022-01-01T00:00:00Z", "2022-01-01T23:59:59Z")
        ));
        AggregatorFactory aggregatorFactory = new CountAggregatorFactory("count");
        TimeseriesQuery query = new TimeseriesQuery(
                "my-data-source",
                intervalSpec,
                aggregatorFactory,
                Arrays.asList("temperature"),
                0,
                0
        );

        // 执行查询并打印结果
        Sequence<Result> results = client.query(query);
        for (Result result : Sequences.toList(results, Arrays.asList())) {
            System.out.println(result.getValue());
        }
    }
}

Apache Pinot:低延迟在线查询

Apache Pinot同样是一款实时分析引擎,但它与Druid略有不同。Pinot更加专注于为在线服务提供低延迟查询,非常适合对延迟敏感的应用程序。此外,Pinot还提供强大的SQL支持,便于用户进行复杂的数据查询。

// 使用 Pinot 摄取实时数据
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import org.apache.pinot.client.Connection;
import org.apache.pinot.client.ConnectionFactory;
import org.apache.pinot.client.ResultSet;
import org.apache.pinot.client.ResultSetGroup;
import org.apache.pinot.client.SegmentMetadata;
import org.apache.pinot.common.request.BrokerRequest;
import org.apache.pinot.common.request.PinotQuery;
import org.apache.pinot.common.utils.request.RequestUtils;

import java.util.List;
import java.util.Map;

public class PinotRealTimeExample {

    public static void main(String[] args) {
        // 创建一个 Pinot 连接
        Connection connection = ConnectionFactory.fromDefault();

        // 创建一个数据表
        connection.execute("CREATE TABLE my_table (timestamp BIGINT, temperature FLOAT)");

        // 摄取数据
        Map<String, Object> data = Maps.newHashMap();
        data.put("timestamp", System.currentTimeMillis());
        data.put("temperature", 25.0);
        connection.upsert("my_table", data);

        // 创建一个查询
        String query = "SELECT * FROM my_table WHERE timestamp >= '2022-01-01T00:00:00Z' AND timestamp < '2022-01-01T23:59:59Z'";
        PinotQuery pinotQuery = new PinotQuery(query);

        // 执行查询并打印结果
        ResultSetGroup resultSetGroup = connection.execute(pinotQuery);
        for (ResultSet resultSet : resultSetGroup) {
            List<SegmentMetadata> segmentMetadataList = resultSet.getSegmentMetadataList();
            for (SegmentMetadata segmentMetadata : segmentMetadataList) {
                System.out.println(segmentMetadata.getSegmentName());
            }
            while (resultSet.next()) {
                System.out.println(resultSet.getString(0) + " " + resultSet.getDouble(1));
            }
        }
    }
}

Apache Kylin:大数据量预计算分析

Apache Kylin是一款专为PB级大数据量身定制的分布式分析引擎。它采用预计算技术,将复杂的数据分析任务分解成多个独立的子任务,并通过并行处理的方式实现高速查询。Kylin非常适合处理大规模的历史数据分析,帮助企业从海量数据中提取有价值的洞察。

// 使用 Kylin 进行预计算分析
import org.apache.kylin.client.Kylin;
import org.apache.kylin.client.KylinConfig;
import org.apache.kylin.client.util.JsonUtil;
import org.apache.kylin.metadata.model.DataModel;
import org.apache.kylin.metadata.model.DataModelManager;
import org.apache.kylin.metadata.model.TableDesc;
import org.apache.kylin.metadata.project.ProjectInstance;
import org.apache.kylin.metadata.project.ProjectManager;
import org.apache.kylin.metadata.cube.model.CubeDesc;
import org.apache.kylin.metadata.cube.model.IndexPlan;
import org.apache.kylin.rest.response.DataResult;

import java.util.List;

public class KylinPrecomputedExample {

    public static void main(String[] args) {
        // 创建一个 Kylin 客户端
        KylinConfig config = new KylinConfig();
        config.setServerUrl("http://localhost:7070");
        Kylin kylin = Kylin.getInstance(config);

        // 创建一个项目
        ProjectManager projectManager = kylin.getProjectManager();
        String projectName = "my_project";
        ProjectInstance projectInstance = projectManager.createProject(projectName, "my_description");

        // 创建一个数据模型
        DataModelManager dataModelManager = kylin.getDataModelManager();
        DataModel dataModel = dataModelManager.createDataModel(projectName, "my_data_model");
        dataModel.init();
        TableDesc tableDesc = dataModel.addTable("my_table");

        // 创建一个立方体
        CubeDesc cubeDesc = dataModel.addCube("my_cube");
        cubeDesc.init();
        IndexPlan indexPlan = cubeDesc.getDefaultIndexPlan();

        // 构建立方体
        kylin.buildCube(projectName, cubeDesc, indexPlan);

        // 运行查询
        Data