1.1 大数据分析平台架构分类
数据分析的基础架构可以分为以下几类:
- 使用Hadoop/Spark 进行分析
- 将Hadoop/Spark 的结果导入 RDBMS 中提供数据分析;补充说明:RDBMS一般指关系数据库管理系统
- 将结果注入到容量更大的NoSQL中,解决数据分析的存储瓶颈,例如:Hbase
- 将数据源进行流式处理,对接流式计算框架,例如:Flink、Spark Streaming,结果保存到RDBMS、NoSQL中
- 将数据源进行流式处理,对接分析数据库,例如:Druid
基于Hadoop 的大数据平台,有如下一些问题:
- 无法保障查询性能
- 对于Hadoop 使用的MapReduce 批处理框架,数据何时能够查询没有性能保证
- 随机IO 问题
- HDFS 以集群硬盘作为存储资源池的分布式文件系统
- 在海量数据的处理过程中,会引起大量的读写操作,随机IO 是高并发场景下的性能瓶颈
- 数据可视化问题
- HDFS 对于数据分析以及数据的即席查询,HDFS 并不是最优的选择
传统的Hadoop 大数据处理架构更倾向于一种 “后台批处理的数据仓库系统”,其作为海量历史数据保存、冷数据分析,确实是一个优秀的通用解决方案,但
- 无法保证高并发环境下海量数据的查询分析性能
- 无法实现海量实时数据的查询分析与可视化
- Druid 是由一个名为 metaMarket 的公司开发的
- 2011年,metaMarket 开始研发自己的“轮子” Druid,将Druid 定义为“开源、分布式、面向列式存储的实时分析数据存储系统”
- 要解决的“痛点”是
- 在高并发环境下,保证海量数据查询分析性能
- 同时提供海量实时数据的查询、分析与可视化功能
官方文档链接:https://docs.imply.io/latest/quickstart/
Druid 是面向海量数据的、用于实时查询与分析的OLAP 存储系统。Druid 的四大关键特性如下:
- 亚秒级的OLAP 查询分析
- 采用了列式存储、倒排索引、位图索引等关键技术
- 在亚秒级别内完成海量数据的过滤、聚合以及多维分析等操作
- 实时流数据分析
- 传统分析型数据库采用的批量导入数据,进行分析的方式
- Druid 提供了实时流数据分析,以及高效实时写入
- 实时数据在亚秒级内的可视化
- 丰富的数据分析功能
- Druid 提供了友好的可视化界面
- SQL 查询语言
- REST 查询接口
- 高可用性与高可拓展性
- Druid 工作节点功能单一,不相互依赖
- Druid 集群在管理、容错、灾备、扩容都很容易
阿里巴巴也曾创建过一个开源项目叫Druid (简称阿里 Druid),它是一个数据库连接池项目。阿里Druid 和我们要讨论的Druid 没有任何关系,它们解决完全不同的问题 。
- 腾讯
- 腾讯企业采用Druid 用于分析大量的用户行为,帮助提升客户价值
- 阿里巴巴
- 阿里搜索组使用Druid 的实时分析功能用于获取用户交互行为
- 新浪微博
- 新浪广告团队使用Druid 构建数据洞察系统的实时分析部分,每天处理数十亿的消息
- 小米
- Druid 用于小米统计的后台数据收集和分析
- 也用于广告平台的数据分析
- 滴滴打车
- Druid 是滴滴实时大数据处理的核心模块,用于滴滴实时监控系统,支持数百个关键业务指标
- 通过Druid,滴滴能够快速得到各种实时的数据洞察
- 优酷土豆
- Druid 用于其广告的数据处理和分析
2.6.1 Druid vs. ElasticSearch
- Druid 在导入过程会对原始数据进行Rollup【聚合】,而Es 会保存原始数据
- Druid 专注于OLAP,针对数据导入以及快速聚合操作做了优化
- Druid 不支持全文检索
- Druid 采用列式存储,使用倒排和 bitmap索引,可以做到快速扫描相应的列
2.6.3 Druid vs. Spark
- Spark SQL 的响应还做不到亚秒
- Druid 可以做到超低的响应时间,例妈亚秒,而且高并发面向用户的应用
2.6.4 Druid vs. SQL-on-Hadoop (Impala/Drill/Spark SQL/Presto)
- Druid 查询速度更快
- 数据导入,Druid 支持实时导入,SQL-on-Hadoop 一般将数据存储在Hdfs上,Hdfs 的写入速度有可能成为瓶颈
- SQL 支持,Druid 也支持SQL,但Druid 不支持Join 操作
2.6.5 Druid vs. Kylin
- Kylin 不支持实时查询,Druid 支持,但是Kylin3.0 已经支持实时查询
- Kylin 支持表连接(Join),Druid 不支持
- Druid 可以进行数据存储,Kylin 只能进行数据的OLAP 分析
- Imply 也是Druid 的核心团队开发的,它基于Apache Druid 开发了一整套大数据分析解决方案
- Imply 基于Druid 进行了一些组件开发,提供开源社区版本和商业版,简化了部署
由于Druid采用分布式设计,其中不同类的的节点各司其职,故在实际部署中首选需要对各类节点进行统一规划,从功能上可以分为3个部分。
- Master:管理节点,包含协调节点(coordinator)和统治节点(overlord),负责管理数据写入任务和容错相关处理。
- Data:数据节点,包含历史节点和中间管理者,负责数历史数据的加载和查询和据写入处理。
- Query:查询节点,包含查询节点和Pivot Web界面,负责提供数据查询接口和WEB交互式查询。
Imply-3.0.4 基于 apache-druid-0.15.0-Incubating
1、下载imply
下载方式:https://static.imply.io/release/imply-3.0.4.tar.gz
imply 官网:https://imply.io/
2、直接上传解压
通过浏览器下载好,通过上传工具上传到服务器 node-01中的/usr/local/ 下进行解压:
tar -zxvf imply-3.0.4.tar.gz -C /usr/local/
创建对应的软链接:
ln -s /usr/local/imply-3.0.4 /usr/local/imply
cd imply
3.4.1 mysql 中创建imply 相关的数据库
如果zk 中也有druid,也要进行删除
注意事项:MySQL 版本必须5.5及以上版本(Druid 和 Pivot 使用utf8 字符集)
这里将个人可用配置进行分享:Apache Druid 3台集群搭建,可用配置 druid_conf.zip
配置概述
Druid集群服务众多,一套完整的Druid集群需要修改很多配置文件。我们对常用配置文件进行了整理。
2.需要配置Zookeeper集群信息
3.需要修改metadata storage,建议选用mysql
4.需要修改Deep storage,建议选用HDFS
正常情况下,如果我们采用的是真实的服务器,修改以上配置文件即可启动集群。不过如果使用虚拟机,需要修改下每个服务启动的JVM内存参数。主要是由大改小,改成1g即可,默认配置小于1gb的就可以不用修改。
-Xms1g
-Xmx1g
-XX:MaxDirectMemorySize=1g
涉及到的文件列表:
- vi conf/druid/overlord/jvm.config
- vi conf/druid/coordinator/jvm.config
- vi conf/druid/historical/jvm.config
- vi conf/druid/middleManager/jvm.config
- vi conf/druid/broker/jvm.config
- vi conf/druid/router/jvm.config
在druid中,为了提高查询效率,Broker会缓存大量的数据到内存中,可以好不夸张的说Broker内存越大,实时查询的效率越高。对于虚拟机部署的同学来讲,除了以上jvm的配置,还需要修改broker的一些缓存配置。详见配置文件。
1 修改 vi conf/druid/_common/common.runtime.properties 文件
- 修改zookeeper 的配置
- 修改MySQL的配置,同时需要注释掉默认的配置
2 vi conf/druid/coordinator/runtime.properties
3 vi conf/druid/overlord/runtime.properties
4 vi conf/druid/historical/runtime.properties
5 vi conf/druid/middleManager/runtime.properties
6 vi conf/druid/broker/runtime.properties
7 vi conf/druid/router/runtime.properties
8 vi conf/pivot/config.yaml
- 修改mysql 的配置,同时需要注释掉默认的配置
最后进行分发到node-02, node-03
配置环境变量
在每台服务器上配置 DRUID_HOME 环境变量
ln -s /usr/local/imply-3.0.4 /usr/local/imply 【每台都要创建软链接】
vi /etc/profile
source /etc/profile 重新加载环境变量
1、启动zk 集群
2、node-01 节点(使用外部zk 而不使用 imply 自带zk 启动 overlord 和 coordinator)
3、node-02节点
4、node-03节点(启动broker 和 router)
注意事项
- 如果希望 imply 运行在后台,在每个执行命令后面加 --daemonize
-
注意:初次启动,需要前台启动,没启动成功的任务会反复重试启动。
-
没有启动成功,可以去看日志。
一键启动
启动脚本
Druid Web界面截图:
显示服务器的存储情况
当前正在运行的任务
数据查询、可视化界面
Druid 中所有表、数据源,也是我们操作最多的界面
使用Druid 分析2020 年 8月8日 按照商口分类、商品区域的产品订单总额,订单笔数
如果使用SQL 进行数据查询,SQL应该这样写:
数据示例:
要实现该入门案例:
1、上传没测试数据到每个Linux 服务器
- 在一台Druid 服务器中创建 /root/druid/data1/ 目录
- mkdir -p /root/druid/data1
- 将 druid 测试数据源 商品订单数据 order.json 到服务器的 /root/druid/data1/ 目录中
- 将 /root/druid/data1 分发到每一台服务器
2、摄取数据到Druid 中
2.1 打开 postman,请求地址设置为 http://node-01:8090/druid/indexer/v1/task
2.2 请求方式选择为 POST
2.3 body -> raw -> JSON (application/json)
2.4 将资料中的 index_ad_event.json 文件粘贴到 postman 中
2.5 发送请求
- 实时摄取 Kafka 中 metrics topic 的数据到 Druid 中
操作步骤:
1、启动Kafka 集群
2、在Kafka 集群上创建一个名为metrics 的 topic
3、定义摄取配置文件
- 修改 druid 测试数据源kafka 实时摄取数据 中的 index-metrics-kafka.json 文件中的kafka 服务器地址
4、打开postman 提交索引任务
- 将 index-metrics-kafka.json 文件中的内容拷贝到 postman 中
- 发送 post 请求到 http://node-01:8090/druid/indexer/v1/supervisor
在 Overlord 中可看到
测试数据格式示例:
- timestampSpec 时间列,自动适应
- dimensionsSpec 纬度,url + user
- segmentGranularity 小时,一个小时保存一个segmentGranularity文件
- queryGranularity 时间粒度,NONE
- type ,按count 聚合
- topic,指定从kafka读取哪个topic 的数据
- consumerProperties 消费信息
- bootstrap.servers 指下zk 地址: node-01:9092,node-02:9092,node-03:9092
- group.id:kafka_indexing_service
- taskCount 数量:1
- replicas 数量:1
- taskDuration:PT1H,默认即可
继续向Kafka 生产数据
摄取配置文件主要由以下几个部分组成:
- type:文件上传方式(index、index_hadoop、kafka)
- spec
- dataSchema:数据解析模式
- ioConfig:数据源
- turningConfig:优化配置(分区规则、分区大小)
{
// 一、文件上传方式
// 1.1 index - 上传本地文件
// 1.2 index_hadoop - 上传HDFS 文件
// 1.3 kafka - 拉取kafka 流数据
"type": "index"
"spec":{
// 二、数据解析模式
"dataSchema": {...},
// 三、摄取数据源
"ioConfig": {...},
// 四、摄取过程优化配置
"tuningConfig": {...}
}
}
数据解析模式,主要为针对数据文件,定义了一系列规则:
- 获取时间戳属性
- 维度属性
- 度量属性
- 定义如何进行指标计算
- 配置粒度规则
数据源配置主要指定:
- 要加载数据的类型
- 从哪儿加载数据
通常在优化配置中可以指定一些优化选项
- Bootstrap servers:node-01:9092,node-02:9092,node-03:9092
- Topic:metrics
- Preview:预览一下数据
- Next: Parse data:下一步
- Parser to use:选择数据格式【json / csv / tsv / regex正则匹配】
- Next: Parse time:下一步,选择时间格式
- Column:时间列选择time列
- Format:格式,可以选择自动
- Next: Transform:
- Next: Filter:
- Next: Configure schema:
- Rollup:是否开启预聚合
- Query granularity:按小时、天、分钟
- Add dimension:添加纬度
- Add metric:添加指标列
- Next: Partition:下一步优化
- Next: Tune:优化配置项
- Next: Publish:发布
- Next: Edit JSON spec:这个时候就会生成json 格式文件
- Submit:提交。 当然也可能装饰生成的Json 格式文件,可以通过 postman 发送给Druid 【Post请求、Body->raw/JSON】【另外一种提交方式】
# 查看kafka主题列表
kafka-topics.sh --list --zookeeper node-01:2181,node-02:2181,node-03:2181
# 创建topic
kafka-topics.sh --create --zookeeper node-01:2181,node-02:2181,node-03:2181 --replication-factor 3 --partitions 2 --topic metrics
# 查看topic
kafka-topics.sh --zookeeper node-01:2181,node-02:2181,node-03:2181 --topic metrics --describe
# 创建生产者
kafka-console-producer.sh --broker-list node-01:9092,node-02:9092,node-03:9092 --topic metrics
# 创建消费者
kafka-console-consumer.sh --bootstrap-server node-01:9092,node-02:9092,node-03:9092 --topic metrics --group topic_test1_g1 --from-beginning
# 删除topic
kafka-topics.sh --delete --zookeeper node-01:2181,node-02:2181,node-03:2181 --topic metrics
Kafka 测试数据:
{"time":"2020-08-23T17:57:58Z","url":"/foo/bar","user":"alice","latencyMs":32}
{"time":"2020-08-23T17:57:59Z","url":"/","user":"bob","latencyMs":11}
{"time":"2020-08-23T17:58:00Z","url":"/foo/bar","user":"bob","latencyMs":45}
下面以【以从kafka 流式数据】为例,演示在Druid 中使用不同方式来进行数据查询、分析。
- JSON API 方式
- SQL 方式【重点】
1、JSON API 方式(了解)
Druid 最早提供JSON API 的方式查询数据,通过JSON 格式来定义各种查询组件实现数据查询。
将JSON 数据提交到:http://node-03:8082/druid/v2?pretty
2、使用JDBC查询Druid 中的数据
Druid 提供了JDBC 接口,Java Web 项目可以直接使用 JDBC 连接Druid 进行实时数据分析。
- 获取 metrics-kafka 数据源中,不同用户的访问次数
实现步骤:
- 创建 druid_jdbc Maven 模块
- 导入依赖
- 编写JDBC 代码连接Druid 获取数据
- 加载Druid JDBC 驱动
- 获取Druid JDBC 连接
- 构建SQL 语句
- 构建Statement,执行SQL获取结果集
- 关闭Druid 连接
Java 查询示例:
运行结果截图:
文章最后,给大家推荐一些受欢迎的技术博客链接:
- JAVA相关的深度技术博客链接
- Flink 相关技术博客链接
- Spark 核心技术链接
- 设计模式 —— 深度技术博客链接
- 机器学习 —— 深度技术博客链接
- Hadoop相关技术博客链接
- 超全干货--Flink思维导图,花了3周左右编写、校对
- 深入JAVA 的JVM核心原理解决线上各种故障【附案例】
- 请谈谈你对volatile的理解?--最近小李子与面试官的一场“硬核较量”
- 聊聊RPC通信,经常被问到的一道面试题。源码+笔记,包懂
- 深入聊聊Java 垃圾回收机制【附原理图及调优方法】
欢迎扫描下方的二维码或 搜索 公众号“大数据高级架构师”,我们会有更多、且及时的资料推送给您,欢迎多多交流!
以上就是本篇文章【Apache Druid 集群搭建及使用【超全面】】的全部内容了,欢迎阅览 ! 文章地址:http://lianchengexpo.xrbh.cn/quote/8854.html 行业 资讯 企业新闻 行情 企业黄页 同类资讯 网站地图 返回首页 迅博思语资讯移动站 http://lianchengexpo.xrbh.cn/mobile/ , 查看更多