深入淺出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/zh-tw/n/149040.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
IIGZ的頭像IIGZ
上一篇 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

發表回復

登錄後才能評論