Druid.io系列(九):数据摄入

druid数据摄入 数据摄入 Druid的数据摄入有两种方式,一种是流式数据源,一种是静态数据源 数据源种类 静态数据源:数据已经生产完毕,不会有新数据产生的数据源,静态数据通常表现为离线数据,静态服务可以通过实时节点摄入,也可以通过索引服务启动一个任务摄入。 流式数据源:指的是持续不断地生产数据的数据源。如日志,消息队列等。对于流式数据的摄取,Druid提供了两种方法,分别是Push(推送)和Pull(拉取... 阅读详情


时间:2018-06-11 21:57:58      阅读:36      评论:0      收藏:0      [点我收藏+]

标签:file   pre   ash   ons   replica   topic   datetime   数据源   query   

1. 概述

Druid的数据摄入主要包括两大类: 
1. 实时输入摄入:包括Pull,Push两种 
- Pull:需要启动一个RealtimeNode节点,通过不同的Firehose摄取不同种类的数据源。 
- Push:需要启动Tranquility或是Kafka索引服务。通过HTTP调用的方式进行数据摄入 
2. 离线数据摄入:可以通过Realtime节点摄入,也可以通过索引节点启动任务摄入

本文演示环节主要基于上一章部署的集群来进行

2. 实时数据摄入

2.1 Pull

由于Realtime Node 没有提供高可用,可伸缩等特性,对于比较重要的场景推荐使用 Tranquility Server or 或是Tranquility Kafka索引服务

2.2 Push

Indexing service在前文已经介绍过了,Tranquility 是一个Scala库,它通过索引服务实现数据实时的摄入。它之所以存在,是因为Indexing service API属于低层面的。Tranquility是对索引服务进行抽象封装, 对使用者屏蔽了 创建任务,处理分区、复制、服务发现和shema rollover等环节。

通过Tranquility 的数据摄入,可以分为两种方式

Tranquility Server:发送方可以通过Tranquility Server 提供的HTTP接口,向Druid发送数据。
Tranquility Kafka:发送发可以先将数据发送到Kafka,Tranquility Kafka会根据配置从Kafka获取数据,并写到Druid中。
2.2.1 Tranquility Server配置

配置流程如下 
1. 开启Tranquility Server,在数据节点上编辑conf/supervise/data-with-query.conf 文件,将Tranquility Server注释放开

# Uncomment to use Tranquility Server                                                                                                                                                          
!p95 tranquility-server bin/tranquility server -configFile conf/tranquility/server.json 
2. 拷贝quick里面的server.json

root@druid:~/imply-2.3.8# cp conf-quickstart/tranquility/server.json conf/tranquility/
3. 启动服务

root@druid:~/imply-2.3.8# bin/supervise -c conf/supervise/data-with-query.conf
启动信息如下:

[Fri Dec  8 15:41:39 2017] Running command[tranquility-server], logging to[/root/imply-2.3.8/var/sv/tranquility-server.log]: bin/tranquility server -configFile conf/tranquility/server.json
4. 发送数据

bin/generate-example-metrics | curl -XPOST -H‘Content-Type: application/json‘ --data-binary @- http://localhost:8200/v1/post/tutorial-tranquility-server
如果成功会打印出,表名产生了25条数据到druid里

{"result":{"received":25,"sent":25}}
5. 查询数据

root@druid:~/imply-2.3.8/bin#./plyql -h localhost -p 8082 -q "SELECT server, SUM("count") AS "events", COUNT(*) AS "rows" FROM "tutorial-tranquility-server" GROUP BY server;"

┌──────────────────┬────────┬──────┐
│ server           │ events │ rows │
├──────────────────┼────────┼──────┤
│ www1.example.com │ 1      │ 1    │
│ www2.example.com │ 5      │ 4    │
│ www3.example.com │ 7      │ 2    │
│ www4.example.com │ 5      │ 2    │
│ www5.example.com │ 7      │ 7    │
└──────────────────┴────────┴──────┘
6. 重启Tranquility Server:

bin/service –restart tranquility-server
 

2.2.2 Tranquility Kafka配置

配置流程如下 
1. 开启Tranquility Kafka,在数据节点上编辑conf/supervise/data-with-query.conf 文件,将Tranquility Kafka注释放开

# Uncomment to use Tranquility Server                                                                                                                                                          
!p95 tranquility-server bin/tranquility server -configFile conf/tranquility/server.json 
2. 拷贝quick里面的kafka.json

root@druid:~/imply-2.3.8# cp conf-quickstart/tranquility/kafka.json conf/tranquility/
详细配置可参考:http://druid.io/docs/0.12.1/tutorials/tutorial-kafka.html

3. 在kafa集群中创建topic

root@druid:/opt/PaaS/Talas/lib/Kafka/bin#./kafka-topics.sh --create --zookeeper native-lufanfeng-2-5-24-138:2181,native-lufanfeng-3-5-24-139:2181,native-lufanfeng-4-5-24-140:2181 --replication-factor 1 --partitions 1 --topic tutorial-tranquility-kafka
4. 启动服务

root@druid:~/imply-2.3.8# bin/supervise -c conf/supervise/data-with-query.conf
启动信息如下:

[Tue Dec 12 10:43:28 2017] Running command[tranquility-kafka], logging to[/root/imply-2.3.8/var/sv/tranquility-kafka.log]: bin/tranquility kafka -configFile conf/tranquility/kafka.json
5. 使用kafka自带的工具发送数据

root@druid:/opt/PaaS/Talas/lib/Kafka/bin# ./kafka-console-producer.sh --broker-list native-lufanfeng-2-5-24-138:9092,native-lufanfeng-3-5-24-139:9092,native-lufanfeng-4-5-24-140:9092 --topic tutorial-tranquility-kafka
{"unit": "milliseconds", "http_method": "GET", "value": 107, "timestamp": "2017-12-12T05:55:59Z", "http_code": "200", "page": "/list", "metricType": "request/latency", "server": "www1.example.com"}
{"unit": "milliseconds", "http_method": "GET", "value": 19, "timestamp": "2017-12-12T05:55:59Z", "http_code": "200", "page": "/list", "metricType": "request/latency", "server": "www1.example.com"}
{"unit": "milliseconds", "http_method": "GET", "value": 135, "timestamp": "2017-12-12T05:55:59Z", "http_code": "200", "page": "/list", "metricType": "request/latency", "server": "www5.example.com"}
{"unit": "milliseconds", "http_method": "GET", "value": 103, "timestamp": "2017-12-12T05:55:59Z", "http_code": "200", "page": "/list", "metricType": "request/latency", "server": "www4.example.com"}
{"unit": "milliseconds", "http_method": "GET", "value": 93, "timestamp": "2017-12-12T05:55:59Z", "http_code": "200", "page": "/", "metricType": "request/latency", "server": "www3.example.com"}
{"unit": "milliseconds", "http_method": "GET", "value": 89, "timestamp": "2017-12-12T05:55:59Z", "http_code": "200", "page": "/list", "metricType": "request/latency", "server": "www2.example.com"}
{"unit": "milliseconds", "http_method": "GET", "value": 7, "timestamp": "2017-12-12T05:55:59Z", "http_code": "200", "page": "/", "metricType": "request/latency", "server": "www5.example.com"}
{"unit": "milliseconds", "http_method": "GET", "value": 65, "timestamp": "2017-12-12T05:55:59Z", "http_code": "200", "page": "/", "metricType": "request/latency", "server": "www3.example.com"}
此时观察kafka-server.log的日志会发现类似于如下输出

2017-12-12 06:21:37,241 [KafkaConsumer-CommitThread] INFO  c.m.tranquility.kafka.KafkaConsumer - Flushed {tutorial-tranquility-kafka={receivedCount=0, sentCount=8,droppedCount=8, unparseableCount=0}} pending messages in 0ms and committed offsets in 0ms. 
在datasource中,windowPeriod设置成了P10M,timestamp不在当前时间10M内的数据都会被过滤,由于上面的数据的timestamp和执行时间相差了大概26分钟左右,所以都会被drop调,为了达到演示效果,可以对bin/generate-example-metrics-main 的脚本进行调整。代码如下:

# Copyright 2017 Imply Data, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import argparse
import json
import random
import sys
from datetime import datetime
from kafka import KafkaProducer
from kafka import KafkaClient

hosts="native-lufanfeng-2-5-24-138:9092,native-lufanfeng-3-5-24-139:9092,native-lufanfeng-4-5-24-140:9092"
# hosts="10.48.253.104:9092"
topic=‘tutorial-tranquility-kafka‘

class KafkaSender():

    def __init__(self):
        self.client=KafkaClient(hosts)
        self.producer=KafkaProducer(bootstrap_servers=hosts)
        self.client.ensure_topic_exists(topic)
    def send_messages(self,msg):
        self.producer.send(topic,msg)
        self.producer.r

def main():
  parser = argparse.ArgumentParser(description=‘Generate example page request latency metrics.‘)
  parser.add_argument(‘--count‘, ‘-c‘, type=int, default=25, help=‘Number of events to generate (negative for unlimited)‘)
  args = parser.parse_args()

  count = 0
  sender = KafkaSender()
  while args.count < 0 or count < args.count:
    timestamp = datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ")

    r = random.randint(1, 4)
    if r == 1 or r == 2:
      page = ‘/‘
    elif r == 3:
      page = ‘/list‘
    else:
      page = ‘/get/‘ + str(random.randint(1, 99))

    server = ‘www‘ + str(random.randint(1, 5)) + ‘.example.com‘

    latency = max(1, random.gauss(80, 40))

    record = json.dumps({
      ‘timestamp‘: timestamp,
      ‘metricType‘: ‘request/latency‘,
      ‘value‘: int(latency),

      # Additional dimensions
      ‘page‘: page,
      ‘server‘: server,
      ‘http_method‘: ‘GET‘,
      ‘http_code‘: ‘200‘,
      ‘unit‘: ‘milliseconds‘
    })
    sender.send_messages(record)
    print ‘Send:%s Successful!‘ % record
    count += 1

try:
  main()
except KeyboardInterrupt:
  sys.exit(1)
3. 离线数据摄入

3.1 静态文件摄入

使用自带的摄入机制,可以在数据节点摄入本地文件,方法如下:

bin/post-index-task --file quickstart/wikiticker-index.json
wikiticker-index.json 文件中既包括datasource的定义,也包括数据文件位置的配置

3.2 HDFS文件摄入

配置过程可参考:http://druid.io/docs/0.12.1/ingestion/batch-ingestion.html

4. 配置参考

通用配置:https://github.com/druid-io/tranquility/blob/master/docs/configuration.md 
数据摄入通用配置:http://druid.io/docs/latest/ingestion/index.html 
Tranquility Kafka:https://github.com/druid-io/tranquility/blob/master/docs/kafka.md

5. 其他注意事项

5.1 数据分片

Druid的分片基本都是通过配置tunningConfig来配置的,实时,批量配置的方式会存在一定的差异

实时加载包括下面两种类型 
- Linear分片: 
- 添加新节点时,原节点的配置不需要调整 
- 当存在分片时数据也能被查询 
- Numbered分片 
- 所有分片存在时,才能查询 
- 需要制定分片总数

本地文件加载包括下面两种类型 
- 按照Partition大小分片 
- 设置总的分片数

Hadoop文件加载包括下面两种类型 
- 哈希分片 
- 范围分片

5.2 高基数维度优化

对于需要统计维度基数的需求,如果某个维度的基数很大,可能会存在下列问题。维度基数统计主要包括下面两种类型 
- Cardinality: 基于HyperLogLog算法,只在查询阶段做了优化,不能减少存储容量,基数大时,效率可能会有问题 
- HyperUnique: 在摄入阶段进行优化,对于不需要对高基数维度进行过滤,分组的业务场景可以使用该类型

Druid.io系列(九):数据摄入

标签:file   pre   ash   ons   replica   topic   datetime   数据源   query   

原文地址:https://www.cnblogs.com/lenmom/p/9168965.html
Druid学习笔记(2)Druid架构剖析 1. 前言Druid 的目标是提供一个能够在大数据集上做实时数据摄入与查询的平台,然而对于大多数系统而言,提供数据的快速摄入与提供快速查询是难以同时实现的两个指标。例如对于普通的RDBMS,如果想要获取更快的查询速度,就会因为创建索引而牺牲掉写入的速度,如果想要更快的写入速度,则索引的创建就会受到限制。而Druid却可以完美的对两者进行结合,本文将对Druid如何实现这种结合做一个简单的介绍。2. 阅读详情

相关推荐

TranquilityServerAPI:初始服务器运行的主要宁静后端api

宁静服务器API #格式化 对于所有HTTP Parmas,变量名称必须为大写,以便req.params.MemberID /guild/:MemberID/:GuildID/:GuildInvite #发布星期一 允许多个数据流的脚本 let template =`[removed] pm.getData(函数(错误,数据){var data_t = {标签:Object.entries(data.response.times).map((item)=> item [1]),数据集:[],} ; data.response.all.forEach(e => {data_t.datasets.push(e);}); var ctx = document.getElementById('myChart')。getContext('2d'); var chart

Druid 数据摄入

1. 概述     Druid的数据摄入主要包括两大类,流式数据摄入和静态数据摄入 1.1 对于流式数据的摄入,Druid提供了两种方式,分别是push和pull,     采用pull方式摄取数据,需要启动一个实时节点,通过不同的firehose摄入不同的流式数据,firehose可以被认为Druid接入不同数据源的适配器。例如从kafka摄入数据,就用kafkaFirehose,从Rab...

程序员学习圈 1128

从仿真到器件:铌酸锂电光调制器Comsol建模避坑指南

本文详细介绍了铌酸锂电光调制器在Comsol中的建模全流程,涵盖晶体切向选择、材料参数配置、多物理场耦合等关键技术。通过实战案例和调试技巧,帮助工程师避开常见建模陷阱,提升仿真精度与效率,特别适用于高速光通信系统的器件设计与优化。

m2n3b4v5c6的博客 422

快速学习-Druid数据摄入之Tranquility

第7章 Druid数据摄入之Tranquility 在上面的内容中,我们学习了如何通过索引服务器摄取数据,然而索引服务器的API太过底层,运用起来比较麻烦。Tranquility对索引服务的API进行了封装,可以方便创建任务,处理分片,复制、服务器发现以及无缝的数据结构调整。 向Druid发送数据,需将Tranquility库依赖到程序中。 地址:https://github.com/druid-...

逍遥云恋 1125

使用fairseq从头开始训练一个中英神经机器翻译模型

前言 由于毕设是做神经机器翻译相关,所以先尝试一下神经机器翻译的整个流程是非常有必要的。故将在news-commentary-v15语料上训练有监督中英NMT模型的整个流程,包括工具和数据的准备、数据的预处理、训练及解码等过程,以及过程中遇到的问题和解决方案记录在此,以供后期回顾,也希望能够给予别人一些帮助。附本人博客 1 相关工具及目录结构 1.1 相关工具 除jieba是使用pip install安装外,其他几个工具都是建议直接克隆库到自己的用户目录中,方便使用其脚本(moses/subword-nmt

qq_42734797的博客 2万+

【实战指南】OpenClaw 使用 Bird Skill 接入 X(Twitter)的终极省心方案:告别每次都要手动喂 Cookie 的痛苦

OpenClaw 使用 Bird Skill 接入 X(Twitter)的终极省心方案:告别每次都要手动喂 Cookie 的痛苦

hampeter的博客 1802

Druid.io——概述

概述 1、Druid是什么? Druid是一个分布式的支持实时分析的数据存储系统(Data Store)。在处理数据的规模、数据处理的实时性方面,比传统的OLAP系统有了显著的性能改进,而且拥抱主流的开源生态,包括Hadoop等。Druid通常作为强大的分析交互系统的后端存储组件...

choumo7895的博客 262

【TestNG自动化测试框架详解】

TestNG是一款设计测试用例执行流程的测试框架。

weixin_43936332的博客 1542

大数据之Druid-IO介绍

一、Druid介绍 Druid是一个为大型冷数据集上实时探索查询而设计的开源数据分析和存储系统,提供极具成本效益并且永远在线的实时数据摄取和任意数据处理。Druid 是一个开源的,分布式的,列存储的,适用于实时数据分析的存储系统,能够快速聚合、灵活过滤、毫秒级查询、和低延迟数据导入。   Key Features Designed for Analytics - Druid is ...

252

iOS应用突然无法从App Store获取到内购(IAP)产品列表的解决

问题现象 Apple开发中,在应用中嵌入内购(IAP)功能的小伙伴们可能会发现,吃着火锅唱着歌,突然App就无法获取到产品列表了,而且产品请求操作并不会返回任何错误。 此时检查发现,并没有对App的内购逻辑做任何改动。 那么,这是什么原因导致的呢? Let’s find out!???? 问题分析 1. 排除其它原因 首先,你先得排除不是你IAP内购逻辑变更或其他原因导致的。 在SKProductsRequestDelegat代理实现的productsRequest方法里下断点: func produc

享受开发,颠倒银河 6144

2025美赛C题奥运奖牌榜模型(附代码+全保姆教程)Models for Olympic Medal Tables

伟大教练”效应的测量方法定义奖牌变化率:−−​如果变化率显著为正,且超出历史平均增长率,则认为存在“伟大教练”效应。使用统计方法(如t检验)验证教练到来是否带来显著性差异。

博客 6373

Druid实战--数据摄入案例

Durid摄入数据的方式 通过imply的UI界面配置摄入数据规范Ingestion Spec 手动创建摄入数据规范Ingestion Spec,通过http请求执行 说明:下面以摄入kafka的数据为例进行步骤解析,kafka的数据格式json {"current_timestamp":"1560321490664","age12":"22","name":"wan...

阿华田的博客 1720

富芮坤fr8008gp 240X280 lvgl项目启动

fr8008gp_240X280_lvgl项目启动

cheng___yi的博客 1758

druid.io出现的问题及解决方法

近期由于公司需要,研究了druid.io,下面是我遇到的一些问题以及解决办法,当做记录。 使用的druid.io版本为0.12.3 1、使用druid-hdfs-storage扩展将hdfs用于深度存储。使用Map / Reduce作业从hadoop批量加载数据。 公司已有的集群是CDH-5.10.1版本,该版本的cdh使用hadoop2.6.0,druid.io的0.12.3版本中自带的h...

youyoufusheng的博客 1435

【赛题解析&命令脚本配置】2024年第十七届山东省技能大赛 | 网络系统管理”赛项-模块B:Linux服务部署 & ⑤客户端OutsideCli和InsideCli工作任务

【赛题解析&命令脚本配置】2024年第十七届山东省技能大赛 | 网络系统管理”赛项-模块B:Linux服务部署 & ⑤客户端OutsideCli和InsideCli工作任务 | 【赛题解析&命令脚本配置】2024年第十七届山东省技能大赛 | 网络系统管理”赛项-模块B:Linux服务部署 & ⑤客户端OutsideCli和InsideCli工作任务

君逍遥o 320

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Druid(Druid.io)简单使用

Druid简单使用 一、Druid服务进程 Historical进程:Historical进程用于处理历史数据的存储和查询(历史数据包括所以已经被committed的流数据)。Historical进程从深度存储(Deep Storage)中下载Segment数据,同时支持对这些数据的查询操作。Historical进程不支持写入操作。 MiddleManager进程:MiddleManager负责将...

凌晨1点21分的专栏 1561

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

4-Druid数据摄入-1

http://druid.io/docs/0.10.1/ingestion/index.html 一、数据格式 【1】Data Formats http://druid.io/docs/0.10.1/ingestion/data-formats.html (1)摄入规范化数据:JSON、CSV、TSV  (2)自定义格式 Regex parser or the JavaScript

hjw199089的博客 3503

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Druid(Druid.io)介绍

Druid(Druid.io)简介 一、简介 Druid 的目标是提供一个能够在大数据集上做实时数据摄入与查询的平台,然而对于大多数系统而言,提供数据的快速摄入与提供快速查询是难以同时实现的两个指标。而Druid却可以完美的对两者进行结合,本文将对Druid如何实现这种结合做一个简单的介绍。 Druid.io是一个开源的,分布式的,列式存储的,适用于实时数据分析的OLAP系统。它能够快速聚合...

凌晨1点21分的专栏 1303

Druid.io——架构

Druid采用多进程,分布式的架构;其架构易于运维及部署,便于部署在云环境中。每个Druid进程都可以被独立地配置和横向扩展,这种设计一方面赋予了Druid集群最大的灵活性和可扩展性,另一方面以提供了更高的容错性:一个组件的中断不会立即影响其他组件。 架构概述 1、架构图 2、...

choumo7895的博客 337

Druid Kafka indexing service (Druid 导入 Kafka 数据)

druid配置kafka

祥哥 330

Druid.io实时大数据原理介绍

Druid.io是“神马”?Druid.io是一个开源的,分布式的,列式存储的,适用于实时数据分析的OLAP系统。它能够快速聚合、灵活过滤、毫秒级查询、和低延迟数据导入。2011年,MetaMarkets公司为了解决广告交易中海量实时数据的分析问题,在尝试各种SQL和NoSQL方案后,决定自行设计并创建Druid并于2013年开源。Druid被设计成支持PB级别数据量每天处理数十亿流式事件。Dru...

hellobabygogo3的专栏 5002

大数据Druid部署、Push数据摄入实例

Druid 单机部署 有很多文章都介绍了Druid,大数据实时分析,在此我就不多说了。本文主要描述如何部署Druid的环境,Imply提供了一套完整的部署方式,包括依赖库,Druid,图形化的数据展示页面,SQL查询组件等,Push摄入数据Tranquility Server配置。 一、环境安装前准备: Java 8 https://download.oracle.com/otn-pub/jav...

liruizi的博客 2056

Druid学习

1 基础介绍 1.1 特点 支持流式数据的摄入以及现场聚合 内存化 字典 位图 编码 index (哪些部分聚合,如何内存化、如何建立索引) 水平扩展??? 实时分析: 历史数据以segment的形式组织。 轻聚合的数据存储在哪? Hbase还是hdfs??? 聚合是实时聚合??? 1.2 基本概念 1.2.1 数据格式 时间列、维度列、指标列 1.2.2 数据摄入 实时...

酒中仙的专栏 846

druid.io 去重计数

   在大数据分析中,对数据进行计数去重是比较常见的需求,而druid.io中提供了多种去重计数的aggregtions函数,对于这些去重的aggregtions也不尽相同。druid中提供的去重aggregation如下:    1、DataSketches aggregtions :     yahoo提供的分析包,此算法也是采用最大估计的算法,在数据摄入阶段(ingestion time...

Mr__XiaoBai的专栏 8564

druid.io之merge task

在开发过程中,由于刚刚使用druid.io时,数据量比较小,所以如果按照小时来存储结果,发现每个segments只有几兆的大小,这种大量的小文件不适合在HDFS集群上进行深度存储,同时也会降低查询性能等等,所以迫切需要一种方案对segment进行数据合并,在查询druid.io的配置参数时,发现druid.io的协调节点上可以开启参数 druid.coordinator.merge.on 每隔一点...

梦想成真那天 1150

Druid 架构详解

1. 前言     Druid 的目标是提供一个能够在大数据集上做实时数据摄入与查询的平台,然而对于大多数系统而言,提供数据的快速摄入与提供快速查询是难以同时实现的两个指标。例如对于普通的RDBMS,如果想要获取更快的查询速度,就会因为创建索引而牺牲掉写入的速度,如果想要更快的写入速度,则索引的创建就会受到限制。而Druid却可以完美的对两者进行结合,本文将对Druid如何实现这种结合做一个简单...

程序员学习圈 2068
上一篇: 3-Druid单机测试与数据加载方法
下一篇: druid overlord集群datasouce接入
王树民
博客等级 码龄10年 912粉丝 560原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值