Druid.io系列(六):问题总结

Unity FPS射击控制系统:数据驱动的武器行为解耦方案 在Unity第一人称射击(FPS)开发中,射击系统常因输入、状态、行为耦合导致连发异常、换弹冲突与网络同步失准。其本质是缺乏对‘武器行为’(如后坐力曲线、弹药逻辑)与‘射击控制’(如输入合法性校验、冷却调度)的正交分离。本方案基于ScriptableObject实现WeaponData数据资产化,配合ShootingController状态机服务,达成输入解耦、运行时参数可调、协程受控、网络预测友好等工程目标。适用于中大型FPS项目架构升级与数据驱动转型,尤其解决Unity InputSystem与物理反馈 阅读详情

我们在生产环境中使用Druid也遇到了很多问题,通过阅读官网文档、源码以及社区提问解决或部分解决了很多问题,现将遇到的问题、解决方案以及调优经验总结如下:

问题一:Hadoop batch ingestion失败,日志错误为“No buckets?…“

解决方案:这个问题当初困扰了我们大概一周的时间,对于大部分刚接触Druid人来说基本都会遇到时区问题。

其实问题很简单,主要在于集群工作时区与导入数据时区不一致。由于Druid是时间序列数据库,所以对时间非常敏感。Druid底层采用绝对毫秒数存储时间,如果不指定时区,默认输出为零时区时间,即ISO8601中yyyy-MM-ddThh:mm:ss.SSSZ。我们生产环境中采用东八区,也就是Asia/Hong Kong时区,所以需要将集群所有UTC时间调整为UTC+08:00;同时导入的数据的timestamp列格式必须为:yyyy-MM-ddThh:mm:ss.SSS+08:00

问题二:Druid与Hadoop在Jackson上出现版本冲突,日志错误信息:
这里写图片描述

解决方案:当前版本的Druid是用Hadoop-2.3.0版本进行编译的,针对上述出现的问题,要么更换Hadoop版本为2.3.0(我们生产环境就是这么做的),要么按照该文章中的方法解决:
https://github.com/druid-io/druid/blob/master/docs/content/operations/other-hadoop.md

问题三:Segment的建议大小在300-700MB之间,我们目前是一个小时聚合一次,每小时的原始数据大概在50G左右,生成的Segments数据在10G左右,Segments过大影响查询性能,该如何处理?

解决方案:
目前有两种途径:

  1. 减小SegmentGranularity
    按小时粒度聚合,可以考虑减少到分钟级别,比如20分钟。
  2. 在TunningConfig中增加partitionsSpec,官方解释如下:
    这里写图片描述

问题四:索引任务在handoff失败后很长时间内无法释放,同时一直waiting for handoff,错误日志信息如下:
2016-05-26 22:05:25,805 ERROR i.d.s.r.p.CoordinatorBasedSegmentHandoffNotifier [coordinator_handoff_scheduled_0] Exception while checking handoff for dataSource[hm_flowinfo_analysis] Segment[SegmentDescriptor{interval=2016-05-26T21:00:00.000+0800/2016-05-26T22:00:00.000+0800, version=’2016-05-26T21:00:00.000+0800’, partitionNumber=0}], Will try again after [60000]secs

解决方案:
这个问题在Druid使用中非常常见,在社区提问的相似问题也很多,问题原因主要集中在Historical Node没有内存去加载Segment。排查此类问题的方法总结如下:

  1. 首先引用开发者对该问题的解答
    I guess due to the network storage the segment is not being pushed to deep storage at all.
    Do you see a segment metadata entry in DB for above segment ?
    If no, then check for any exception in the task logs or overlord logs related to segment publishing.
    If the metadata entry is present in the db, make sure you have enough free space available on the historical nodes to load the segments and there are no exceptions in coordinator/historical while loading the segment.

  2. 以及对handoff阶段工作流的简单解释
    The coordinator is the process that detects the new segment built by the indexing task and signals the historical nodes to load the segment. The indexing task will only complete once it gets notification that a historical has picked up the segment so it knows it can stop serving it. The coordinator logs should help determine whether or not the coordinator noticed the new segment, if it tried to signal a historical to load it but failed, if there were rules preventing it from loading, etc. Historical logs would show you if a historical received the load order but failed for some reason (e.g. out of memory).

  3. 所以,综合上述两方面,此问题的根本原因总结如下
    Indexing task如果长时间没有释放,是因为没有收到Historical Nodes加载成功后的返回信息。CoordinatorBasedSegmentHandoffNotifier类主要负责注册等待Handoff的Segments以及检查待Handoff的Segments的状态。
    注册等待Handoff的Segments主要使用内部的ConcurrentMap保存Segments的相关信息;
    检查待Handoff的Segments的状态主要通过:
    (1)首先通过Apache curator向Zookeeper上查询Coordinator实例;
    (2)CoordinatorClient内部封装了一个HttpClient,向存活的Coordinator实例发送HttpGet请求,获取当前集群中所有Segments的load信息List;
    (3)对比内部缓存的ConcurrentMap与List,成功Handoff则删除信息,失败则会打印出上述log,同时Coordinator会每隔一分钟去元信息库中同步已发布的Segments,所以Handoff失败也会每隔一分钟去重试。

最终解决方案总结如下

  1. 检查元信息库是否已注册此Segment的信息,如果没有,那么检查task logs(Middle Manager)或者Overlord关于此Segment发布时的log,是否有异常抛出;

  2. 如果元信息库中已注册该Segment,那么检查Coordinator是否已检测到此Segments已生成,如果Coordinator试图通知Historical Nodes去加载但是失败了,检查是否有rules 阻止加载此Segments等;以及检查在Coordinator中通知load此Segment的Historical Nodes在加载该Segment的过程中是否出现了异常。

问题五:在0.9.1.1版本中新引入的Kafka Indexing Service,如果设置了过短的Kafka Retention时间,同时Druid消费速度又小于Retention速率,那么会出现offset过期,即还未来得及消费的数据已经被Kafka删除了,在Peon日志会一直出现offsetOutofRangeException,并且后续的所有任务全部失败。

解决方案:
这个问题出现的情况比较极端,由于我们使用场景数据量大,同时集群带宽资源不足,所有Kafka Retention时间设置为2小时,不过Kafka提供auto.offset.reset这个策略已应对offset过期的问题,但是在spec文件中配置了{“auto.offset.reset” : “latest” },表示如果offset过期则自动rewind到最新的offset,通过跟踪Overlord日志以及Peon日志发现,Overlord日志中该配置项已生效,但是在Peon日志中该配置项被设置为“None”,“None”表示offset过期不作任何处理,只抛出异常,即offsetOutofRangeException。在Peon中不生效是因为在代码中写死了该项,主要是为了满足Exactly-once Semantics,不过开发者在写死的同时,并未考虑到如何解决这种死循环的问题。

对于该问题,开发者给出的回答如下:
Because of your 2 hour data retention, I guess you’re hitting a case where the Druid Kafka indexing tasks are trying to read offsets that have already been deleted. This causes problems with the exactly-once transaction handling scheme, which requires that all offsets be read in order, without skipping any. The Github issue https://github.com/druid-io/druid/issues/3195 is about making this better – basically you would have an option to reset the Kafka indexing to latest (this would involve resetting the ingestion metadata Druid stores for the datasource).
In the meantime, maybe it’s possible to make this happen less often by either extending your Kafka retention, or by setting your Druid taskDuration lower than the default of 1 hour.

所以,对于此问题,目前并没有彻底的解决方案,不过以下方案可以部分或暂时性解决:

  1. 尽量增大Kafka Retention时间,我们设置2小时确实过于极端

  2. 减少taskDuration;

  3. 在上述两个都无法彻底解决问题的情况下,可以清空元信息库中druid_dataSource表,这张表中记录了所有消费的Kafka topic对应的partition以及offset信息,同时重启MiddleManager节点。
    不过,在0.9.2-milestone版本中,该特性应该会进一步改进,以下引入自Github :
    The Kafka indexing service can get into a stuck state where it is trying to read the Kafka offset following the last one recorded in the dataSource metadata table but can’t read it because Kafka’s retention period has elapsed and that message is no longer available. We probably don’t want to automatically jump to a valid Kafka offset since we would have missed events and would no longer have ingested each message exactly once, so currently we start throwing exceptions and the user needs to acknowledge what happened by removing the last committed offset from the dataSource table.
    It would be nice to include an API that will help them by either removing the dataSource table entry or setting it to a valid Kafka offset, but would still require a manual action/acknowledgment by the user.

如何使用 Python 爬虫获取猫眼电影数据:电影评分与评论分析 随着互联网的快速发展,越来越多的人开始使用各种在线平台来了解电影信息,猫眼电影作为一个非常流行的在线电影票务平台,提供了详细的电影评分、评论和票房数据。本篇博客将详细介绍如何使用 Python 爬虫技术获取猫眼电影平台上的电影数据,重点关注电影评分和用户评论的爬取,分析其背后的数据处理和反爬虫技术。如果你对数据分析、电影评论分析等话题感兴趣,可以根据本文的示例进一步深入挖掘更多的数据,为决策提供支持,或为电影产业的相关研究提供有价值的分析依据。有些猫眼电影的页面数据是动态加载的,使用。 阅读详情

相关推荐

OsgEarth实战:飞机模型动态轨迹与雷达扫描效果实现详解

本文详细介绍了如何使用OsgEarth实现飞机模型动态轨迹与雷达扫描效果。通过实战案例,讲解了模型加载、路径规划、动态轨迹绘制、飞行姿态计算以及雷达扫描效果的实现方法,并提供了性能优化技巧,帮助开发者高效完成三维可视化项目开发。

weixin_29214199的博客 303

druid.io中kafka-index-service移交多次失败的问题排查与处理

问题日志如下: 2020-02-02T23:41:03,855 INFO [publish-0] io.druid.indexing.kafka.KafkaIndexTask - Persisting Sequences Metadata [[]] 2020-02-02T23:41:03,856 INFO [publish-0] io.druid.segment.realtime.appender...

梦想成真那天 611

CA51F3系列(国产)+低功耗模式

CA51F351P6芯片是基于1T 8051内核的8位微控制器,通常情况下,运行速度比传统的8051芯片快10倍,性能更加优越。内置8K Flash程序存储器,可多次重复编程的特性给用户开发带来了极大的方便。不仅保留了传统8051芯片的基本特性,还集成了12Bit ADC、LCD/LED驱动、Touch Key、16Bit PWM、 UART、RTC、低电压检测(LVD)等功能模块。支持IDLE、STOP和低速运行三种省电模式以适应不同功耗要求的应用。

WANGJIHUIwang的博客 572

druid kafka index service still waiting for hand off segments

    在向overlord提交kafka index service task之后,数据可实时接收,并且在druid segments中的目录下segments已生成落盘,并且coordinator已向metastore中注册segments信息,而在task 日志中,出现以下错误。    此时错误为:still waiting for hand off segments, 此错误会造成mid...

Mr__XiaoBai的专栏 1834

玩转Isaac Sim动态控制:从随机舞动到精准操控Franka的5种控制模式实测

本文深入实测了在NVIDIA Isaac Sim仿真平台中,利用Dynamic Control模块对Franka机械臂进行精准操控的五种核心模式:位置控制、单关节位置控制、速度控制、单关节速度控制和力矩控制。通过详细的代码示例和对比分析,阐述了每种模式的适用场景、参数调优技巧及从随机运动到闭环控制的实现路径,为机器人算法验证提供了实用指南。

night的博客 807

RPA 财务共享中心与RPA赋能

在和集团财务官交流的时候,客户经常会提到FSSC,其中有准备建立FSSC,正在建立FSSC,以及已建成FSSC正使用的,当中会有些对FSSC的疑虑和问题,所以花费些时间对FSSC进行了深入调研,从而也有幸拜读了王兴山、陈剑、梅震、钱自严等专业人士写的几本关于FSSC的书,对FSSC的前因后果有了更深入的认识,同时结合自己在FSSC的一些项目经验,故做了本次分享。 本文章主要分享财务共享中心以及R...

weixin_40244959的博客 2756

Druid.io系列(四):索引过程分析

Druid索引过程分析

njpjsoftdev的博客 1万+

SAE J1850协议:从波形解析到汽车诊断实战

本文深入解析SAE J1850协议在汽车诊断中的应用,重点对比其PWM和VPW两种实现方式的波形特征、帧结构及诊断要点。通过实测案例,详细介绍了如何通过波形分析精准定位通用和福特等美系车型的通信故障,提升汽车电子诊断实战能力。

hill8的博客 965

kafka auto.offset.reset参数解析

kafka auto.offset.reset参数解析1.latest和earliest区别2.创建topic3.生产数据和接收生产数据4.测试代码 auto.offset.reset关乎kafka数据的读取。常用的二个值是latest和earliest,默认是latest。 如果kafka只接收数据,从来没来消费过,程序一开始不要用latest,不然以前的数据就接收不到了。应当先earliest...

爱是与世界平行 1867

2026国内Claude Code保姆级教程:安装、避坑、防串台全优化

安装 Claude Code CLI + 切换 npm 国内镜像优先配置固定关闭:自动联网、自动项目扫描VSCode 内置终端直接用,不装多余插件会话隔离+指令约束,彻底解决 Rust、小程序 跨语言串台。

lpfasd123的博客 2541

【AUTOSAR-COM】-10.5-APP CAN Frame/PDU“发送周期不准“的影响因素

一个Tx PDU在COM模块中的数据流; Tx APP CAN Frame/PDU"发送周期不准"的影响因素;

「汽车电子助手」的博客 2386

druid-配置调优

数据库连接池Druid配置调优 1 maxWait: 从连接池获取连接的超时等待时间,单位毫秒,需要注意这个参数只管理获取连接的超时。 获取连接等待的直接原因: 池子里没有可用连接,具体包括:连接池未初始化,连接长久未使用已被释放,连接使用中需要新建连接, 或连接池已耗尽需等待连接用完后归还。这里有一个很关键的点是 maxWait 未配置或者配置为 0 时, 表示不设等待超时时间(可能与一些人认为 -1 表示无限等待的预期不符合,虽然在 druid 中 maxWait...

louie_zhao的博客 9067

滑块逆向及流程分析

本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!

pyzzd的博客 8006

Druid.io系列6:问题总结

我们在生产环境中使用Druid也遇到了很多问题,通过阅读官网文档、源码以及社区提问解决或部分解决了很多问题,现将遇到的问题、解决方案以及调优经验总结如下:问题一:Hadoop batch ingestion失败,日志错误为“No buckets?…“解决方案:这个问题当初困扰了我们大概一周的时间,对于大部分刚接触Druid人来说基本都会遇到时区问题。其实问题很简单,主要在于集群工作时区与导入数据时...

大树叶 技术专栏 1956

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Druid.io系列

研究下了Druid,找个一个系列的博文,写的很好,非常适合快速入门。 Druid.io系列(一):简介 Druid.io系列(二):基本概念与架构 Druid.io系列(三): Druid集群节点 Druid.io系列(四):索引过程分析 Druid.io系列(五):查询过程 Druid.io系列(六):问题总结

来啊 快活啊 726

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Druid.io系列连载文章

Druid.io系列(一):简介Druid.io系列(二):基本概念与架构Druid.io系列(三): Druid集群节点Druid.io系列(四):索引过程分析Druid.io系列(五):查询过程Druid.io系列(六):问题总结...

大树叶 技术专栏 578

druid.io mysql_Druid:Druid.io 部署&使用文档

参考:1.集群模式下部署Prerequisites : Java 7 or higher & Zookeeper & mysql下载Druid.io :curl -O http://static.druid.io/artifacts/releases/druid-0.9.1.1-bin.tar.gztar -xzf druid-0.9.1.1-bin.tar.gzcd druid-...

weixin_40007515的博客 172

Druid.io系列(一):简介

Druid.io(以下简称Druid)是面向海量数据的、用于实时查询与分析的OLAP存储系统。

njpjsoftdev的博客 8617

Druid.IO简介系列之二:Druid系统架构

Druid采用多进程,分布式的架构;其架构易于运维及部署,便于部署在云环境中。每个Druid进程都可以被独立地配置和横向扩展,这种设计一方面赋予了Druid集群最大的灵活性和可扩展性,另一方面以提供了更高的容错性:避免了个别组件的失效影响了系统的其他模块。 Druid进程类型包括: Historical进程:Historical进程用于处理历史数据的存储和查询(历史数据包括所以已经被commi...

greensea669的博客 682

druid.io之merge task

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

梦想成真那天 1149

Druid.io启用SQL支持

Druid.io的SQL功能虽然在试验阶段,但是也支持了大部分的功能,而且还可以通过 Avatica JDBC查看请求的json,有助于我们理解Druid.io的语法。Druid.io有个比较坑的是,如果没有启用SQL功能,你怎么访问也是没有data返回的,但也不会提示你错误。 1、修改配置文件 为了支持Druid SQL,需要修改common.runtime.properties或者 ...

anchichun6550的博客 298

Druid.io数据仓库实践

flink维表join实践-druid.io前言一、flink读取druid.io数据流插件二、flink对druid.io lookup功能依赖于JdbcTableSourceflink写入druid.io数据插件总结 前言 Druid.io做为目前正在使用的OLAP分析数据库,已在公司大部分业务分析中使用。在Druid.io的官网上了解到,该工具除了分析功能,还可以做为一个数据仓库使用。做为实验,个人调研了flink接入Druid.io数据进行计算再写入driod.io的功能,供建仓库使用,调研内容如

baidu_26507163的博客 565

Druid系列 《二》Druid使用与安装

  2.1加载数据到Druid Druid支持流式(实时)和基于文件(批量)的数据提取方式。最常用的配置是: Files - 通过HDFS、S3、本地文件或者任何支持hadoop文件系统批量加载数据。如果你的数据集已经在这类文件系统中推荐使用这个方法。 Stream push - 使用Tranquility(向Druid发送流的客户端)将实时数据流推送到Druid。如果你的数据集来自于流式...

sinat_32176267的博客 2910

Druid.IO简介系列之一:Druid核心功能及其应用场景

本文翻译自:http://druid.io/docs/latest/design/ Druid是可以在大数据集上面进行交叉分析的高性能OLAP系统。Druid通常作为强大的分析交互系统的后端存储组件,或者为高并发API提供快速的聚合的能力。druid的典型应用场景如下: 点击流分析(Clickstream analytics) 网络流分析(Network flow analytics) 存储服务...

greensea669的博客 1690

Druid.io SQL乱码问题

1、场景 1.1、依赖版本 avatica-core 1.11.0 druid 0.12.0 1.2、问题重现: 使用Avatica JDBC查询语句:SELECT score FROM student WHERE name='小明' 到Druid变成:SELECT score FROM student WHERE name='??'。 2、解决过程 思路:检查请求发送前reques...

anchichun6550的博客 383
上一篇: Druid.io系列(五):查询过程
下一篇: Lucene底层原理和优化经验分享(1)-Lucene简介和索引原理
njpjsoftdev
博客等级 码龄10年 206粉丝 31原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值