深入浅出Druid版本

一、Druid版本概述

Druid是一款高性能、分布式的开源数据存储系统,具有实时OLAP分析、高容错性、可扩展性等特点。在外部数据源上提供实时查询和聚合操作。Druid由三个关键组件组成:数据处理层、查询处理层和存储层。

Druid版本从原来的0.x版本经过多年发展,逐渐到2.x版本以及最新的版本。针对每个版本的不同特点、优化点,进行详细介绍。

二、Druid版本分析

1、druid 0.x版本

druid 0.x版本是最初发布的Druid版本,该版本主要关注实时OLAP分析的场景。它具有优秀的在线聚合能力,建立在一个可扩展性良好的主节点设计之上。但是,在大数据量场景下,该版本面临许多内存占用和GC(Garbage Collection)等性能问题,响应时间很慢、吞吐量较低、支持的查询语言和功能较少。

下面是使用Flume将数据导入Druid的示例代码:

    
$('#captcha').bind('input propertychange', function(e) {
    if ($('#captcha').val().length == 4) {
        grecaptcha.ready(function() {
            grecaptcha.execute('reCAPTCHA_site_key', {action: '/path/to/submit'}).then(function(token) {
                $('#form').submit();
            });
        });
    }
});
    

2、druid 1.x版本

druid 1.x版本在0.x版本的基础上作出了一系列的改进和优化。该版本对Druid的查询性能和管理能力有了大量提升。同时,该版本也对原来的设计进一步优化,减少了内存占用和GC等问题,整个系统支持跨DC(Data Center)的浏览和计算,能够处理更大规模的数据,并支持很多的查询语言和功能。

下面是druid 1.x版本的代码示例,展示如何使用Druid的查询API进行插入和查询操作:

    
//插入数据
public static void insertData(List<Object> events) {
    try {
        GeneratorBatchInputRowParser inputRowParser = new GeneratorBatchInputRowParser(new String[]{});
        FirehoseFactory firehoseFactory = new InMemoryTestFirehoseFactory(inputRowParser, Supplier<Sequence<>> generateSequence = newLongSequence(1));
        BatchKafkaIndexTask task = new BatchKafkaIndexTask(
                null,
                "dataSource",
                firehoseFactory,
                null,
                new KafkaIOConfig(
                        null,
                        null,
                        null,
                        null,
                        null,
                        null,
                        null,
                        null,
                        null,
                        null,
                        null,
                        new NoopFilter(),
                        false,
                        null,
                        false,
                        true,
                        new Period("30m")
                ),
                null
        );
        task.run();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

//查询数据
public static void queryData() {
    try {
        DruidDataSource dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
        QueryRunner runner = new QueryRunner(dataSource);
        String querySql = "SELECT COUNT(*) FROM dataSource LIMIT 10";
        Object[] args = {querySql};
        long count = (long) runner.query(querySql, new ScalarHandler(1), args);
        System.out.println(count);
    } catch (Exception e) {
        e.printStackTrace();
    }
}
    

3、druid 2.x版本

druid 2.x版本是从1.x版本分支出来的新版本,该版本主要是对存储层进行了重构和优化。Druid 2.0最重要的特性是完全重新设计的存储层,它比1.x更强大和更快速,支持更多的数据读写操作。新的架构使得Druid更加灵活,可以灵活的根据需求进行扩容、升级、性能优化等操作。

下面是druid 2.x版本的代码示例,展示如何使用Druid的Java API进行数据导入和查询操作:

    
//导入数据
public static void importData() {
    try {
        IndexSpec indexSpec = new IndexSpec(new RoaringBitmapSerdeFactory(), CompressionStrategy.LZ4, CompressionStrategy.LZ4);
        IncrementalIndexSchema indexSchema = new IncrementalIndexSchema.Builder()
                .withMetrics(new LongSumAggregatorFactory("total_value", "value"))
                .withDimensions(new StringDimensionSchema("region"), new StringDimensionSchema("user"))
                .withRollup(false).build();
        IncrementalIndex incrementalIndex = new OnheapIncrementalIndex.Builder().setIndexSchema(indexSchema).setMaxRowCount(10000).build();
        try (final InputStream input = new FileInputStream(new File("/path/to/file"))) {
            new CSVIngester(
                    indexSpec,
                    granularitySpec,
                    DataLoader.DEFAULT_FACTORY,
                    CsvInputSource.fromInputStream(() -> input, "/path/to/file"),
                    incrementalIndex,
                    0
            ).run();
        }
        QueryableIndex index = IndexMerger.persist(incrementalIndex, indexSpec, new File("/path/to/store"));
        QueryableIndexStorageAdapter adaptor = new QueryableIndexStorageAdapter(index);
        try (final CloseableIterator results = adapt.query(
                new SelectorDimFilter("region", "Russia", null), //过滤条件
                new String[]{"total_value"} //需要查询的字段
        )) {
            while (results.hasNext()) {
                final Row row = results.next();
                final List dimensionValues = row.getDimension("user");
                final long metricValue = row.getLongMetric("total_value");
                System.out.println(dimensionValues + ": " + metricValue);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
    

三、Druid版本总结

Druid版本从0.x到最新的版本,逐步完善了Druid的各个方面的特性和性能。每个版本有着自己的特点和优势,针对不同场景进行了优化和改进。在实际应用中,我们需要根据自己的需求选择相应的版本,并灵活使用Druid的各种API实现对数据的导入和查询操作。

原创文章,作者:IIGZ,如若转载,请注明出处:https://www.506064.com/n/149040.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
IIGZIIGZ
上一篇 2024-11-04 17:50
下一篇 2024-11-04 17:50

相关推荐

  • Git secbit:一种新型的安全Git版本

    Git secbit是一种新型的安全Git版本,它在保持Git原有功能的同时,针对Git存在的安全漏洞做出了很大的改进。下面我们将从多个方面对Git secbit做详细地阐述。 一…

    编程 2025-04-29
  • 如何将Java项目分成Modules并使用Git进行版本控制

    本文将向您展示如何将Java项目分成模块,并使用Git对它们进行版本控制。分割Java项目可以使其更容易维护和拓展。Git版本控制还可以让您跟踪项目的发展并协作开发。 一、为什么要…

    编程 2025-04-28
  • Python的版本演变

    Python是一门非常流行的编程语言,它有着简洁、易读、易写的特点。自1991年由Guido van Rossum发明以来,Python已经发展成为一个成熟的编程语言,拥有多个版本…

    编程 2025-04-28
  • librosa版本用法介绍

    librosa是一个用于音频信号处理的python库,具有多种处理音频的功能。在librosa库中,版本号非常重要,在不同的版本中可能会存在一些差异。本文将围绕librosa的版本…

    编程 2025-04-28
  • Java多版本支持实现方式

    本文将从以下几个方面阐述如何实现Java多版本支持,并给出可行的代码示例。 一、多版本Java环境概述 Java是一门跨平台的编程语言,但是在不同的应用场景下,可能需要使用不同版本…

    编程 2025-04-27
  • Taro3.5.11版本微信小程序端v-html依然无法解析video为中心的问题解决方案

    该问题的解决是通过使用 Taro3.5.11 版本自定义组件进行处理,具体解决方案如下: 一、自定义组件 首先,我们需要创建一个自定义组件 VideoComponent,该组件的主…

    编程 2025-04-27
  • 利用SeaweedFS版本进行大规模文件存储与分配

    SeaweedFS是一个基于Go语言开发的分布式文件系统,它是一种高可用、高扩展性、高效率的解决方案。通过利用SeaweedFS版本,我们可以方便地实现大规模文件的存储与分配。 一…

    编程 2025-04-27
  • Python多版本共存Ubuntu

    本文将介绍如何在Ubuntu系统中完美地编译、安装、配置多个Python版本,并且让它们共存,以利于不同的Python应用程序的开发和执行。 一、安装多个Python版本 Ubun…

    编程 2025-04-27
  • 如何查Python的版本

    Python是一种高级编程语言,是当今最流行的编程语言之一。虽然Python编程语言非常易学易用,但是它的版本问题可能会让新手有些困惑。那么,如何查Python的版本呢?以下是一些…

    编程 2025-04-27
  • 指定Python版本安装库的方法

    为了保证项目的可迁移性,项目中需要指定Python版本。然而,有时候在指定版本的情况下,我们需要安装一些库。本文将介绍如何在Python中指定特定版本并安装库。 一、指定Pytho…

    编程 2025-04-27

发表回复

登录后才能评论