Apache Druid日志实时分析

news2024/9/24 23:29:50

业务分析

​ 秒杀业务中,通常会有很多用户同时蜂拥而上去抢购热卖商品,经常会出现抢购人数远大于商品库存。其实在秒杀过程中,热卖商品并不多,几乎只占1%,而99%的流量都源自热卖商品,很有可能因为这1%的热卖商品导致服务器宕机,因此针对热卖商品我们要做特殊处理。

​ 热卖商品我们这里称为热点商品,针对热点商品的处理,有这么几种思路,一是优化,二是限制,三是隔离。

​ 优化:优化热点数据最有效的办法就是缓存热点数据。

​ 限制:限制其实是一种削峰手段,我们可以把热点商品抢单采用队列来存储用户抢单信息,将热点抢单限制在一个队列里,防止热点商品抢单占用太多的资源服务,而使得其他服务无法获取抢单机会。

​ 隔离:隔离其实就是将热点商品和非热点商品进行数据源的隔离、操作流程的隔离,不要因为1%的热点数据影响到另外的99%数据。我们可以把热点商品数据存储到缓存中和非热点数据分开,抢单程序也可以和非热点抢单分开。

在这里插入图片描述

​ 热点数据又分为离线热点数据和实时热点数据,离线热点数据主要是分析过往热点商品信息,这个统计起来并无难度,可以直接从历史数据库中查询分析。但根据用户抢单实时数据进行分析是一个很困难的事,首先要存储大量的访问信息,同时还能高效的实时统计访问日志信息,从中获取热点商品信息。

Apache Druid介绍

介绍

​ Apache Druid 是一个分布式的、支持实时多维 OLAP 分析的数据处理系统。它既支持高速的数据实时摄入,也支持实时且灵活的多维数据分析查询。因此 Druid 最常用的场景是大数据背景下、灵活快速的多维 OLAP 分析。 另外,Druid 还有一个关键的特点:它支持根据时间戳对数据进行预聚合摄入和聚合分析,因此也有用户经常在有时序数据处理分析的场景中用到它。

OLTP与OLAP的区别:

OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理。

OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的分析查询结果。

OLAP和OLTP区别:

在这里插入图片描述

OLTP就是面向我们的应用系统数据库的,OLAP是面向数据仓库的。

Apache Druid 特性:
在这里插入图片描述

亚秒响应的交互式查询,支持较高并发。
支持实时导入,导入即可被查询,支持高并发导入。
采用分布式 shared-nothing 的架构,可以扩展到PB级。
支持聚合函数,count 和 sum,以及使用 javascript 实现自定义 UDF。
支持复杂的 Aggregator,近似查询的 Aggregator 例如 HyperLoglog 以及 Yahoo 开源的 DataSketches。
支持Groupby,Select,Search查询。

开源OLAP数据处理系统性能方面我们做个对比:

在这里插入图片描述

Apache Druid 架构设计

Druid自身包含下面4类节点:

1.Realtime Node:即时摄入实时数据,生成Segment(LSM-Tree实现与Hbase基本一致)文件。
2.Historical Node:加载已生成好的数据文件,以供数据查询。
3.Broker Node:对外提供数据查询服务,并同时从Realtime Node和Historical Node查询数据,合并后返回给调用方。
4.Coordinator Node:负责Historical Node的数据负载均衡,以及通过Rule管理数据生命周期。

同时,Druid集群还包含以下3类外部依赖:

1.元数据库(Metastore):存储druid集群的元数据信息,如Segment的相关信息,一般使用MySQL或PostgreSQL
2.分布式协调服务(Coordination):为Druid集群提供一致性服务,通常为zookeeper
3.数据文件存储(DeepStorage):存储生成的Segment文件,供Historical Node下载,一般为使用HDFS

在这里插入图片描述

数据摄入

​ Apache Druid同时支持流式和批量数据摄入。通常通过像 Kafka 这样的消息总线(加载流式数据)或通过像 HDFS 这样的分布式文件系统(加载批量数据)来连接原始数据源。

在这里插入图片描述

Apache Druid安装

Apache Druid的安装方面,我们可以参考官方文档实现。

JDK:java8(8u92+)

在这里插入图片描述

下载地址:https://druid.apache.org/downloads.html

在这里插入图片描述

解压该压缩包:

tar -xf apache-druid-0.17.0-bin.tar.gz
cd apache-druid-0.17.0

包文件如下:

在这里插入图片描述

启动单机版Apache Druid:

./bin/start-micro-quickstart

启动后,访问:http://192.168.211.137:8888

在这里插入图片描述

数据摄入

离线数据摄入

从一个文件中将数据加载到Apache Druid,参考地址:https://druid.apache.org/docs/latest/tutorials/tutorial-batch.html,如下操作:

1)点击Load data->Local disk->Connect data

在这里插入图片描述

2)选择要导入的数据

我们要导入的数据在/usr/local/server/apache-druid-0.17.0/quickstart/tutorial/wikiticker-2015-09-12-sampled.json.gz,需要把该文件的相对路径填写到右边表单中,再点击Apply,如下图:

在这里插入图片描述

3)解析数据

在上一个步骤上点击Next:Parse data,此时会解析导入的数据,如下图:

在这里插入图片描述

4)解析时间

在上一个步骤上点击Next: Parse time,Apache Druid要求每条数据都有一个time列,如果我们导入的数据没有该列,Apache Druid会自动帮助我们创建该列,如下图:

在这里插入图片描述

5)数据分区设置

点击下一步一直到Partition,我们根据需要设置数据分区方式,如下图:

在这里插入图片描述

讲解:

Type:数据粒度使用的类型
Segment granularity:分片文件每个segment包含的时间戳范围
Force guaranteed rollup:是否启用批量推送模式
Partitioning type:分区类型
Max rows per segment:用于分片。确定每个段中的行数。

更多参数如下图:

在这里插入图片描述

6)设置数据源

Publish设置,注意设置数据源名字,这里类似数据库中数据库名字。

在这里插入图片描述

7)提交配置

最后一步需要提交配置,如下图,点击submit即可。

在这里插入图片描述

实时数据摄入

​ 前面的案例是离线数据的摄入,接着我们实现实时数据摄入,我们以收集用户访问商品详情页的访问记录为例,如下图:

参考地址:https://druid.apache.org/docs/latest/tutorials/tutorial-kafka.html

在这里插入图片描述

1)load data

在这里插入图片描述

2)配置Kafka源

在这里插入图片描述

3)配置数据源名字

其他的步骤和之前文件摄入一样,直到配置数据源名字,我们配置数据源名字叫itemlogs,最后一步submit和之前一样,如下图:

在这里插入图片描述

在这里插入图片描述

查询效果如下:

1586916777015

Druid SQL

简介

​ Apache Druid SQL是一个内置的SQL层,是Druid基于JSON的查询语言的替代品,由基于Apache Calcite的解析器和规划器提供支持。Druid SQL将SQL转换为Broker本机Druid查询,然后将其传递给数据进程。除了在Broker上转换SQL的(轻微)开销之外,与本机查询相比,没有额外的性能损失。

语法

每个Druid数据源都显示为“Druid”模式,这也是默认模式,Druid数据源引用为druid.dataSourceName或者简单引用dataSourceName。

可以选择使用双引号引用数据源和列名等标识符。要在标识符中转义双引号,请使用另一个双引号,例如"My ““cat”” identifier",所有标识符都区分大小写。

文字字符串应引用单引号,如’foo’,文字数字可以用100(表示整数),100.0(表示浮点值)或1.0e5(科学记数法)等形式编写。时间戳可以写成TIMESTAMP ‘2000-01-01 00:00:00’。时间算法,可以这样写INTERVAL ‘1’ HOUR,INTERVAL ‘1 02:03’ DAY TO MINUTE,INTERVAL ‘1-2’ YEAR TO MONTH,等等。

Druid SQL支持具有以下结构的SELECT查询:

[ EXPLAIN PLAN FOR ]
[ WITH tableName [ ( column1, column2, ... ) ] AS ( query ) ]
SELECT [ ALL | DISTINCT ] { * | exprs }
FROM table
[ WHERE expr ]
[ GROUP BY exprs ]
[ HAVING expr ]
[ ORDER BY expr [ ASC | DESC ], expr [ ASC | DESC ], ... ]
[ LIMIT limit ]
[ UNION ALL <another query> ]

查询所有:

SELECT * FROM "itemlogs"

查询count列:

SELECT "count" FROM "itemlogs"

查询前5条:

SELECT * FROM "itemlogs" LIMIT 5

分组查询:

SELECT ip FROM "itemlogs" GROUP BY ip

排序:

SELECT * FROM "itemlogs" ORDER BY __time DESC

求和:

SELECT SUM("count") FROM "itemlogs"

最大值:

SELECT MAX("count") FROM "itemlogs"

平均值:

SELECT AVG("count") FROM "itemlogs"

查询6年前的数据:

SELECT * FROM "wikiticker" WHERE "__time" >= CURRENT_TIMESTAMP - INTERVAL '6' YEAR

去除重复查询:

SELECT DISTINCT "count" FROM "accessitem"

JDBC查询Apache Druid

​ Apache Calcite是面向Hadoop新的查询引擎,它提供了标准的SQL语言、多种查询优化和连接各种数据源的能力,除此之外,Calcite还提供了OLAP和流处理的查询引擎。

​ 如果使用java,可以使用Calcite JDBC驱动程序进行Druid SQL查询。可以下载Avatica客户端jar后,将其添加到类路径并使用连接字符串jdbc:avatica:remote:url=http://192.168.211.137:8082/druid/v2/sql/avatica/

​ 如果是Maven项目,需要引入avatica-core包,如下:

<dependency>
    <groupId>org.apache.calcite.avatica</groupId>
    <artifactId>avatica-core</artifactId>
    <version>1.15.0</version>
</dependency>

使用案例:

public static void main(String[] args) throws Exception{
    //链接地址
    String url = "jdbc:avatica:remote:url=http://192.168.211.137:8082/druid/v2/sql/avatica/";
    AvaticaConnection connection = (AvaticaConnection) DriverManager.getConnection(url);

    //SQL语句,查询2020-4-10 11:50:30之后的访问uri和访问数量
    String sql="SELECT uri,count(*) AS \"viewcount\" FROM(SELECT * FROM \"itemlogs\" WHERE __time>'2020-4-10 11:50:30' ORDER BY __time DESC) GROUP BY uri LIMIT 100";

    //创建Statment
    AvaticaStatement statement = connection.createStatement();

    //执行查询
    ResultSet resultSet = statement.executeQuery(sql);

    while (resultSet.next()) {
        //获取uri
        String uri = resultSet.getString("uri");
        String viewcount = resultSet.getString("viewcount");
        System.out.println(uri+"--------->"+viewcount);
    }
}

知识点:

Druid的时区和国内时区不一致,会比我们的少8个小时,我们需要修改配置文件,批量将时间+8,代码如下:

sed -i "s/Duser.timezone=UTC/Duser.timezone=UTC+8/g" `grep Duser.timezone=UTC -rl ./`

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2077973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SQL】分类统计的薪水

目录 题目 分析 代码 题目 表: Accounts ------------------- | 列名 | 类型 | ------------------- | account_id | int | | income | int | ------------------- 在 SQL 中&#xff0c;account_id 是这个表的主键。 每一行都包含一个银行帐户的月收入的…

深入解析Go语言os/user包:用户和组管理实战指南

深入解析Go语言os/user包&#xff1a;用户和组管理实战指南 引言什么是os/user包&#xff1f;为什么要学习os/user包&#xff1f;本文将介绍的内容 os/user包基础如何导入os/user包获取当前用户信息示例代码 *user.User类型详解常见错误处理小结 用户查询与管理根据用户名查询用…

这本大模型书籍我敢说知道的人不超过1%,大模型入门必备书籍

当然可以&#xff01;我为您推荐一本关于大模型的书籍&#xff1a;《Transformer Tutorials: From Theory to Practice》。虽然这本书不是直接以“大模型”命名&#xff0c;但它涵盖了构建和理解大规模语言模型&#xff08;如GPT系列和BERT&#xff09;所需的关键技术和理论。接…

娱乐社交、游戏行业的最新玩法实践与未来增长趋势解读|网易数智x华为云城市沙龙杭州站邀你前来!

随着5G、AI、区块链等前沿技术的深度融合应用&#xff0c;泛娱乐行业正经历深刻变革的同时&#xff0c;也面临着一系列挑战与问题&#xff0c;面对社交产品监管的加强、海外市场的双重机遇与风险以及增速放缓的游戏行业...... 探求新增长点与新思路成为当下泛娱乐行业从业者的关…

收银系统源码助力零售门店数字化升级

一、国内零售业数字化转型迈入深水区 近年来&#xff0c;我国零售业数字化进程显著加速&#xff0c;从线上电商到新零售模式&#xff0c;再到利用大数据、人工智能等技术优化供应链、提升体验&#xff0c;每一步都见证了行业的深刻变革。随着零售行业进入存量市场竞争&#xf…

nuxt3连接mongodb操作

文章目录 创建一个nuxt3应用添加nuxt后端服务nuxt3路由创建mongo数据连接mongodb数据库补充添加显示(用v-for打印出数组)nuxt-server-insertmongodb删除数据创建一个nuxt3应用 Node.js - v18.0.0 或更新版本推荐使用 Visual Studio Code 以及 Volar 扩展npx nuxi@latest init p…

使用jwt实现登录验证

jwt工具类 public class JwtUtil {public static String key"mykey";public static String genToken(String username) {JWTCreator.Builder builder JWT.create();Map<String, Object> headersnew HashMap<>();headers.put("typ","jwt&…

uniapp重新编译在微信开发者工具跳转指定页面

uniapp重新编译在微信开发者工具跳转指定页面 步骤 选择编译模式添加编译模式设置启动页面

rk3588调用NPU、查看npu的使用情况

1、rk3588启用NPU 启用三个内核->RKNNLite.NPU_CORE_0_1_2 rknn_lite RKNNLite(verboseFalse) ret rknn_lite.load_rknn(RKNN_MODEL) ret rknn_lite.init_runtime(core_maskRKNNLite.NPU_CORE_0_1_2) 2、查看NPU使用情况&#xff1a; watch sudo cat /sys/kernel/deb…

LaViT:Less-Attention Vision Transformer的特性与优点

引言 https://arxiv.org/pdf/2406.00427 随着计算机视觉领域的发展&#xff0c;视觉Transformer&#xff08;ViTs&#xff09;逐渐成为一项重要技术。尽管ViTs在捕捉图像中的长距离依赖关系方面表现出色&#xff0c;但其沉重的计算负担和潜在的注意力饱和问题一直是实际应用的…

利用Python对Excel数据进行条件筛选与排序

目录 一、Python与Excel数据处理的基础知识 1.1 Python中的Excel数据处理库 1.2 pandas库简介 二、使用pandas读取Excel数据 三、Excel数据的条件筛选 3.1 单条件筛选 3.2 多条件筛选 3.3 使用query方法 四、Excel数据的排序 4.1 单列排序 4.2 多列排序 五、案例分…

Python自动化:Excel根据IP匹配网段获取所属源端口

需求 现在有两个文件&#xff1a; 1. 【NTP.xlsx】&#xff1a;有name、IP、fenzhihang、vendor、source这五列 2. 【IP.xlsx】&#xff1a;有daqu、fenzhihang、duankou、IP、mask、gateway、subnet、yongtu、miaoshu这九列 现在更新基线&#xff0c;每台设备都需要增加nt…

ET6框架(二)Demo工程的运行及编译

1.工程下载地下&#xff1a; GitHub - egametang/ET at release6.0 2.复制地址后下载&#xff0c;在本人使用时ET已更新到最新9.0的版本&#xff0c;因此下载后需要切换分支到6.0版本 3.下载完工程后可以用 UnityHub打开工程&#xff0c;如没有对应版本可以在&#xff1a;h…

OpenHarmony技术开发:Launcher架构应用启动流程分析

简介 Launcher 作为系统人机交互的首要入口&#xff0c;提供应用图标的显示、点击启动、卸载应用&#xff0c;并提供桌面布局设置以及最近任务管理等功能。 Launcher 采用 扩展的 TS 语言&#xff08;eTS&#xff09;开发&#xff0c;主要的结构如下&#xff1a; product 业务…

安卓13 背光调节非线性问题处理,调节范围不正常问题

总纲 android13 rom 开发总纲说明 目录 1.前言 2.问题分析 3.代码修改 4.彩蛋 1.前言 我们看看现在的版本的亮度图 2.问题分析 当背光亮度设置为0%时,每次按下亮度增加键或者 input keyevent BRIGHTNESS_UP,亮度UI的增幅较大,首次按下后亮度平滑提升至大约55%,随后继…

路旁树木种类巡检检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

路旁树木种类巡检检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着城市化进程的加快&#xff0c;城市绿化…

七、面向对象编程(中级)

文章目录 一、IDEA1.1 IDEA下载安装1.2 IDEA的使用1.3 IDEA常用的快捷键 二、包2.1 包的基本介绍2.2 包的本质分析2.3 包的命名2.4 常用的包2.5 如何引入包 三、访问修饰符四、面向对象的三大特征4.1 封装4.2 继承4.2.1 为什么需要继承4.2.2 继承的基本介绍4.2.3 继承的深入讨论…

【C++题解】1222. 经典递归问题——汉诺塔

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1222. 经典递归问题——汉诺塔 类型&#xff1a;递归、函数 题目描述&#xff1a; 汉诺塔&#xff08;又称河内塔&#xff09;问题是印度的一个古老的传说。开天辟地的神勃拉玛在一…

关于武汉芯景科技有限公司的MCU监控芯片XJ809S开发指南(兼容MAX809S)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、功能 当电源电压低于预设阈值时&#xff0c;芯片会发出复位信号&#xff0c;将微处理器或系统重置到初始状态&#xff0c;防止因电源问题导致的系统错误运行。复位信号在电源电压恢复并稳定后至少保持140ms&#xff0c;确保系统有…

HikariCP源码分析之源码环境搭建

一、fork源码库 为了方便记录以及查看一些历史的提交信息&#xff0c;我先在github上fork了这个源码库。 他的原始源码库位置为HikariCP源码位置 在fork到我的源码库之后&#xff0c;我就可以用git clone拉取下来&#xff0c;然后在我本地打开&#xff0c;做一些修改和笔记。然…