在网上看到的一篇解决hbase性能问题的文章,虽然文章不长,但是我相信作者在此经历的过程和从中学到的知识要比这个深刻的太多了。
原文地址:http://tech.meituan.com/opentsdb_hbase_compaction_problem.html
业务背景
OpenTSDB 是一款非常适合存储海量时间序列数据的开源软件,使用 HBase 作为存储让它变的非常容易扩展。我们在建设美团性能监控平台的过程中,每天需要处理数以亿计的数据,经过几番探索和调研,最终选取了 OpenTSDB 作为数据存储层的重要组件。OpenTSDB 的安装和配置过程都比较简单,但是在实际的业务应用中,还是会出现这样那样的问题,本文详细介绍我们在OpenTSDB 实际使用过程中遇到的 HBase 整点压力过大的问题,期望对大家有些参考意义。
问题的出现
性能监控平台使用 OpenTSDB 负责存储之后不久(创建的表名称是 tsdb-perf),数据平台组的同事发现,tsdb-perf 这个表在最近这段时间每天上午 10 点左右有大量的读操作,造成 HBase 集群压力过大,但是想去分析问题的时候发现读操作又降为 0 了,为了避免类似情况未来突然发生,需要我来排查下原因。
于是我就想:性能监控平台目前只是个内部系统,用户使用量不大,并且只有在用户需要查看数据时去查询,数据读取量不应该造成 HBase 的压力过大。
重现问题
如果要解决这个问题,稳定重现是个必要条件,根据数据平台组同事的反馈,我们做了更详细的监控,每隔两分钟采集性能监控平台所用的 HBase 集群的读操作数量,发现是下面的变化趋势:
从图上不难看出,每到整点开始 tsdb-perf 这个表的读操作飚的很高,大约持续半个小时,之后恢复到 0 。到下个整点又出现类似的问题,并没有像数据平台组同事观察到的突然回复正常了,可能他们连续两次观察的时间点刚好错开了。
于是,真正的问题就变成了:OpenTSDB 到 HBase 的读操作每到整点开始飚的很高,持续大约半小时后回复正常,这种类脉冲式的流量冲击会给 HBase 集群的稳定性带来负面影响。
定位问题所在
事出反常必有妖,OpenTSDB 到 HBase 的大量读操作肯定伴随很大的网络流量,因为两者用 HTTP 通信,我们得仔细梳理下可能造成这种情况的几种原因。性能监控平台的架构图如下:
从架构图可以看出,只有数据聚合服务和报表系统会和 OpenTSDB 交互,聚合服务向里面写数据,报表系统从里面读数据。然后 OpenTSDB 负责把数据发送到 HBase 中。从数据流动的方向来讲,有可能是报表系统导致了大量的读操作,也有可能是聚合服务里面存在不合理的读请求,也有可能是 OpenTSDB 本身存在缺陷。
首先排除的是报表系统导致的大量读操作,因为只会在用户查看某些报表时才会从 OpenTSDB 读取数据,目前报表系统每天的访问量也才几百,不足以造成如此大的影响。
其次,如何确认是否是聚合服务导致了大量的读请求呢?可以从网络流量的视角来分析,如果聚合服务到 OpenTSDB 的流量过大,完全有可能导致 OpenTSDB 到 HBase 的过大流量,但是由于目前聚合服务和 TSDB 写实例是部署在相同的机器上,无法方便的统计到网络流量的大小,于是我们把聚合服务和 TSDB 写实例分开部署,得到下面的流量统计图:
聚合服务只接收来自解析服务的数据包计算完毕之后发送给 TSDB,其网络流量如下图:
TSDB 服务只接收来自聚合服务的数据,然后发送到 HBase,却出现了脉冲式的冲高回落,网络流量如下图:
这样,就可以排除聚合服务造成的问题,出问题的地方就在 OpenTSDB 和 HBase 集群之间,其他业务线并没有造成 HBase 的压力过大,看来问题应该出在 OpenTSDB 里面,如果这个问题是 OpenTSDB 内部存在的,那么其他使用了 OpenTSDB 的系统肯定也存在类似的问题,下面是另外一个组部署的 OpenTSDB 的机器的网络流量图(注意,这台机器上只部署了 OpenTSDB 服务):
这让我更加确信问题是在 OpenTSDB 内部,也就是它的工作机制导致了这种问题。
查找问题原因
于是我先后查阅了 OpenTSDB 的官方文档和 Google Group 讨论组里的大部分帖子,还下载来了 OpenTSDB 的源代码,探个究竟,另外在从读操作从 0 到暴涨的过程中仔细盯着 OpenTSDB 的 stat 页面特别关注下面红色方框中的几个指标:
让我感觉比较诡异的是,与大量读操作同时发生的还有大量的删除操作,官方文档上的这段话很好的解释了我的疑惑:
这段话很好的解释了 OpenTSDB 的 Compaction 机制的工作原理,OpenTSDB 内部的工作原理比这个更复杂,下面我说下我通俗的理解:
为了节省存储空间和提高数据读取速度,OpenTSDB 内部有个数据压缩(即 Compaction)的机制,将设定的某个时间段内某个指标的所有数据压缩成单行,重新写到 HBase;
OpenTSDB 运行时默认把收到的数据(原始数据点)每秒1次的速度批量写到 HBase 上,然后会周期性的触发上面提到的数据压缩机制,把原始数据点拿出来,压缩后重新写回HBase,然后把原始数据点删除,这就虽然我们只往 OpenTSDB 写数据但大量的读和删操作还是会发生的原因;
OpenTSDB 默认的配置是以 3600 秒为区间压缩,实际运行时就是整点触发,这样整点发生的大量读、删操作就可以解释了;
至此,线上 OpenTSDB 实例整点大量读操作造成 HBase 集群压力过大的问题原因基本明了。
如何解决问题
找到问题的原因之后,我们想到了以下 2 种解决方案:
禁用 OpenTSDB 的 Compaction 机制,这样 OpenTSDB 就变成了 1 个纯粹的写实例,数据读取速度会有牺牲,因为每次读取需要扫描更多的数据,这个对于业务数据量很大的系统来说可能并不合适;
想办法让 OpenTSDB 的数据压缩过程缓慢进行,这样到 HBase 的流量压力就会平缓很多,但是这样做还是有风险,因为如果从业务系统到 OpenTSDB 的流量暴涨仍然有可能会 HBase 压力过大,不过这就是另外1个问题了,HBase 需要扩容;
实际操作过程中,我们使用了第 2 种方案,修改 OpenTSDB 的源代码中 src/core/CompactionQueue.java 中的 FLUSH_SPEED 常量为 1,重新编译即可。这样改动的实际影响是:默认压缩速度是 2 倍速,即最多半个小时内完成前 1 个小时数据的压缩,重新写回到 HBase,可以把这个调成 1 倍速,给它 1 个小时的时间来完成前 1 个小时数据的 Compaction,这样到 HBase 的流量会平缓很多。
[/size][/b]经验和教训[/size][/b]
几经辗转,终于找到问题原因所在(离解决问题还有距离),下面是我的几点感受:
解决问题之前,要能够稳定重现,找到真正的问题所在,不能停留在表面,如果不进行几个小时的 HBase 读操作监控,不会发现整点暴涨持续半小时然后回落的问题;
系统的运行环境很复杂,必要的时候要想办法把问题隔离到影响因素更少的环境中,更容易发现问题,比如性能监控平台各组件的混合部署给机器间的流量分析造成了困难;
使用开源软件,最好能深入了解下运行机制,用起来才得心应手,不然出了问题就很麻烦,这次的排查过程让我更加详细的了解了 OpenTSDB 的运行机制;
至此,本文完~
原文地址:http://tech.meituan.com/opentsdb_hbase_compaction_problem.html
业务背景
OpenTSDB 是一款非常适合存储海量时间序列数据的开源软件,使用 HBase 作为存储让它变的非常容易扩展。我们在建设美团性能监控平台的过程中,每天需要处理数以亿计的数据,经过几番探索和调研,最终选取了 OpenTSDB 作为数据存储层的重要组件。OpenTSDB 的安装和配置过程都比较简单,但是在实际的业务应用中,还是会出现这样那样的问题,本文详细介绍我们在OpenTSDB 实际使用过程中遇到的 HBase 整点压力过大的问题,期望对大家有些参考意义。
问题的出现
性能监控平台使用 OpenTSDB 负责存储之后不久(创建的表名称是 tsdb-perf),数据平台组的同事发现,tsdb-perf 这个表在最近这段时间每天上午 10 点左右有大量的读操作,造成 HBase 集群压力过大,但是想去分析问题的时候发现读操作又降为 0 了,为了避免类似情况未来突然发生,需要我来排查下原因。
于是我就想:性能监控平台目前只是个内部系统,用户使用量不大,并且只有在用户需要查看数据时去查询,数据读取量不应该造成 HBase 的压力过大。
重现问题
如果要解决这个问题,稳定重现是个必要条件,根据数据平台组同事的反馈,我们做了更详细的监控,每隔两分钟采集性能监控平台所用的 HBase 集群的读操作数量,发现是下面的变化趋势:
13:00:05 0 13:02:01 66372 13:04:01 96746 13:06:02 101784 13:08:01 99254 13:10:02 2814 13:12:01 93668 13:14:02 93224 13:16:02 90118 13:18:02 11376 13:20:01 85134 13:22:01 81880 13:24:01 80916 13:26:01 77694 13:28:02 76312 13:30:01 73310 13:32:02 0 13:34:01 0 13:36:01 0 13:38:02 0 13:40:01 0 13:42:02 0 13:44:01 0 13:46:02 0 13:48:01 0 13:50:02 0 13:52:01 0 13:54:02 0 13:56:01 0 13:58:02 0 14:00:01 0 14:02:01 36487 14:04:01 43946 14:06:01 53002 14:08:02 51598 14:10:01 54914 14:12:02 95784 14:14:04 53866 14:16:02 54868 14:18:01 54122 14:20:04 0 14:22:01 0 14:24:02 0 14:26:01 0 14:28:01 0 14:30:01 0 14:32:02 0 14:34:01 0
从图上不难看出,每到整点开始 tsdb-perf 这个表的读操作飚的很高,大约持续半个小时,之后恢复到 0 。到下个整点又出现类似的问题,并没有像数据平台组同事观察到的突然回复正常了,可能他们连续两次观察的时间点刚好错开了。
于是,真正的问题就变成了:OpenTSDB 到 HBase 的读操作每到整点开始飚的很高,持续大约半小时后回复正常,这种类脉冲式的流量冲击会给 HBase 集群的稳定性带来负面影响。
定位问题所在
事出反常必有妖,OpenTSDB 到 HBase 的大量读操作肯定伴随很大的网络流量,因为两者用 HTTP 通信,我们得仔细梳理下可能造成这种情况的几种原因。性能监控平台的架构图如下:
从架构图可以看出,只有数据聚合服务和报表系统会和 OpenTSDB 交互,聚合服务向里面写数据,报表系统从里面读数据。然后 OpenTSDB 负责把数据发送到 HBase 中。从数据流动的方向来讲,有可能是报表系统导致了大量的读操作,也有可能是聚合服务里面存在不合理的读请求,也有可能是 OpenTSDB 本身存在缺陷。
首先排除的是报表系统导致的大量读操作,因为只会在用户查看某些报表时才会从 OpenTSDB 读取数据,目前报表系统每天的访问量也才几百,不足以造成如此大的影响。
其次,如何确认是否是聚合服务导致了大量的读请求呢?可以从网络流量的视角来分析,如果聚合服务到 OpenTSDB 的流量过大,完全有可能导致 OpenTSDB 到 HBase 的过大流量,但是由于目前聚合服务和 TSDB 写实例是部署在相同的机器上,无法方便的统计到网络流量的大小,于是我们把聚合服务和 TSDB 写实例分开部署,得到下面的流量统计图:
聚合服务只接收来自解析服务的数据包计算完毕之后发送给 TSDB,其网络流量如下图:
TSDB 服务只接收来自聚合服务的数据,然后发送到 HBase,却出现了脉冲式的冲高回落,网络流量如下图:
这样,就可以排除聚合服务造成的问题,出问题的地方就在 OpenTSDB 和 HBase 集群之间,其他业务线并没有造成 HBase 的压力过大,看来问题应该出在 OpenTSDB 里面,如果这个问题是 OpenTSDB 内部存在的,那么其他使用了 OpenTSDB 的系统肯定也存在类似的问题,下面是另外一个组部署的 OpenTSDB 的机器的网络流量图(注意,这台机器上只部署了 OpenTSDB 服务):
这让我更加确信问题是在 OpenTSDB 内部,也就是它的工作机制导致了这种问题。
查找问题原因
于是我先后查阅了 OpenTSDB 的官方文档和 Google Group 讨论组里的大部分帖子,还下载来了 OpenTSDB 的源代码,探个究竟,另外在从读操作从 0 到暴涨的过程中仔细盯着 OpenTSDB 的 stat 页面特别关注下面红色方框中的几个指标:
让我感觉比较诡异的是,与大量读操作同时发生的还有大量的删除操作,官方文档上的这段话很好的解释了我的疑惑:
If compactions have been enabled for a TSD, a row may be compacted after it's base hour has passed or a query has run over the row. Compacted columns simply squash all of the data points together to reduce the amount of overhead consumed by disparate data points. Data is initially written to individual columns for speed, then compacted later for storage efficiency. Once a row is compacted, the individual data points are deleted. Data may be written back to the row and compacted again later.
这段话很好的解释了 OpenTSDB 的 Compaction 机制的工作原理,OpenTSDB 内部的工作原理比这个更复杂,下面我说下我通俗的理解:
为了节省存储空间和提高数据读取速度,OpenTSDB 内部有个数据压缩(即 Compaction)的机制,将设定的某个时间段内某个指标的所有数据压缩成单行,重新写到 HBase;
OpenTSDB 运行时默认把收到的数据(原始数据点)每秒1次的速度批量写到 HBase 上,然后会周期性的触发上面提到的数据压缩机制,把原始数据点拿出来,压缩后重新写回HBase,然后把原始数据点删除,这就虽然我们只往 OpenTSDB 写数据但大量的读和删操作还是会发生的原因;
OpenTSDB 默认的配置是以 3600 秒为区间压缩,实际运行时就是整点触发,这样整点发生的大量读、删操作就可以解释了;
至此,线上 OpenTSDB 实例整点大量读操作造成 HBase 集群压力过大的问题原因基本明了。
如何解决问题
找到问题的原因之后,我们想到了以下 2 种解决方案:
禁用 OpenTSDB 的 Compaction 机制,这样 OpenTSDB 就变成了 1 个纯粹的写实例,数据读取速度会有牺牲,因为每次读取需要扫描更多的数据,这个对于业务数据量很大的系统来说可能并不合适;
想办法让 OpenTSDB 的数据压缩过程缓慢进行,这样到 HBase 的流量压力就会平缓很多,但是这样做还是有风险,因为如果从业务系统到 OpenTSDB 的流量暴涨仍然有可能会 HBase 压力过大,不过这就是另外1个问题了,HBase 需要扩容;
实际操作过程中,我们使用了第 2 种方案,修改 OpenTSDB 的源代码中 src/core/CompactionQueue.java 中的 FLUSH_SPEED 常量为 1,重新编译即可。这样改动的实际影响是:默认压缩速度是 2 倍速,即最多半个小时内完成前 1 个小时数据的压缩,重新写回到 HBase,可以把这个调成 1 倍速,给它 1 个小时的时间来完成前 1 个小时数据的 Compaction,这样到 HBase 的流量会平缓很多。
[/size][/b]经验和教训[/size][/b]
几经辗转,终于找到问题原因所在(离解决问题还有距离),下面是我的几点感受:
解决问题之前,要能够稳定重现,找到真正的问题所在,不能停留在表面,如果不进行几个小时的 HBase 读操作监控,不会发现整点暴涨持续半小时然后回落的问题;
系统的运行环境很复杂,必要的时候要想办法把问题隔离到影响因素更少的环境中,更容易发现问题,比如性能监控平台各组件的混合部署给机器间的流量分析造成了困难;
使用开源软件,最好能深入了解下运行机制,用起来才得心应手,不然出了问题就很麻烦,这次的排查过程让我更加详细的了解了 OpenTSDB 的运行机制;
至此,本文完~
发表评论
-
Sort-based Shuffle的设计与实现
2016-03-15 08:49 807原文 http://www.cnblogs.com/hsea ... -
spark的几个重要概念
2015-12-04 14:09 0本节主要记录以下几个概念 一:RDD的五大特点 二:RDD 窄 ... -
spark部署安装调试
2015-12-02 11:28 734本节记录spark下载-->编译-->安装--&g ... -
spark基本概念
2015-11-12 10:45 781记录一下课堂笔记: ... -
hadoop计算能力调度器配置
2015-10-29 10:39 1011问题出现 hadoop默认调度器是FIFO,其原理就是先按照作 ... -
HBase在各大应用中的优化和改进
2015-10-28 14:59 687Facebook之前曾经透露过Facebook的hbase架构 ... -
通过GeoHash核心原理来分析hbase rowkey设计
2015-09-08 15:49 3513注:本文是结合hbase ... -
从OpenTsdb来分析rowkey设计
2015-09-06 16:04 4941讨论此问题前,先理解 ... -
HBase中asynchbase的使用方式
2015-08-25 10:32 8187Hbase的原生java 客户端是完全同步的,当你使用原生AP ... -
Mapreduce优化的点滴
2015-07-16 15:18 819注:转载 1. 使用自定义Writable 自带的Text ... -
hadoop 如何自定义类型
2015-07-15 09:37 1235记录一下hadoop 数据类型章节的笔记,以便后期使用,本文是 ... -
napreduce shuffle 过程记录
2015-07-10 11:23 754在我看来 hadoop的核心是mapre ... -
ZooKeeper伪分布式集群安装及使用
2015-02-13 08:29 9161. zookeeper介绍 ZooKeeper是一个为分 ... -
hadoop-mahout 核心算法总结
2015-02-07 10:08 1551其实大家都知道hadoop为我们提供了一个大的框架,真正的 ... -
推荐引擎内部原理--mahout
2015-01-22 11:11 568转载自:https://www.ibm.com/devel ... -
hadoop 动态添加删除节点
2015-01-20 13:39 658转自:http://www.cnblogs.com/rill ... -
hbase hadoop zookeeper
2015-01-19 14:47 0hadoop 部署手册 http://www.iteblo ... -
mapreduce 开发以及部署
2015-01-16 13:56 832前面几篇文章的梳理让我对hadoop新yarn 框架有了一 ... -
hadoop yarn几个问题的记录
2015-01-13 11:48 651本文主要介绍以下几 ... -
hadoop集群部署时候的几个问题记录
2015-01-13 10:24 735本章部署一个hadoop 集群 ...
相关推荐
【描述】:“一篇很好的架构文章 从各个角度总结了电商平台中的架构实践”表明这篇文章详细探讨了电商平台的架构设计,涵盖了多个关键领域,如系统架构的优化、服务的分布化、高可用性保障、负载均衡、数据存储以及...
这篇文章的标题"关于C++ 语录的一篇很好的文章"暗示了作者可能通过引用一系列富有洞察力的C++知识点,帮助读者理解和掌握这种强大的编程语言。C++的学习不仅仅是语法的堆砌,更是对计算机底层机制和编程思维的深刻...
Date的《Database System Concepts》是一本很好的数据库系统教材。 - 在线社区如CSDN提供了丰富的学习资源,包括博客文章、论坛讨论等,这些都是非常有价值的资料。 - 阅读英文资料也是提高技能的有效途径之一,...
“程序员们必读的一篇好文章”可能会探讨开源技术如何帮助程序员提高编程效率、解决问题速度等方面的优势。通过参与开源项目或贡献代码,程序员可以更好地理解系统底层逻辑,增强解决问题的能力。同时,这也是一个...
总的来说,这篇文章揭示了ACM竞赛对于弱校队伍的意义,它不仅是一个竞技平台,更是一个自我提升、团队协作和挑战极限的过程。无论结果如何,每一次的参赛都是对自身能力和意志的锻炼,也是对团队精神的锤炼。它鼓励...
【怎样写好一篇文章】 写好一篇文章是每个作者都需要掌握的基本技能,这涉及到多个方面的准备和实践。首先,提升写作水平需要长期的积累和多方面的学习。要关注阅读,尤其是语文课堂的学习,深入理解课文的内容和...
从标签"源代码"和"源码"来看,这个压缩包可能包含的是系统的源代码,对于开发者来说,这是一个很好的学习和定制的资源。用户可以深入研究代码,理解其工作原理,甚至根据自己的需求进行二次开发。同时,"资料"标签...
10. **一种OFDMA系统资源分配方案.pdf**:在OFDMA系统中,资源分配是优化系统性能的关键,涉及到子载波分配、功率分配等问题。文章可能提出了一种新的资源分配策略,以提高频谱效率和用户公平性。 这些文章全面覆盖...
论文中详细描述了为柴油机设计的在线诊断实验平台,该平台旨在模拟真实工况下的曲轴运行,集成MMMT诊断系统,并结合扭转信号分析,以实现对曲轴裂纹的实时监测和预警。 5. 结论与展望 论文最后对在线MMMT方法进行...
JSP中文网新闻发布系统是由jsp中文网为了方便...每一篇新闻都可以有自己的关键字来描述,说明该新闻的主要内容,并且可以关联该新闻内容相似的新闻,新闻还可以无限分类。让您可以在一个新闻系统中管理你所有的新闻。
【标题】"基于PHP的好文本移动网站文章管理系统(GMArticle)php版源码.zip" 描述了一个使用PHP编程语言开发的文章管理系统,专为移动网站设计,旨在帮助用户高效地管理和发布文章内容。该系统可能包含了一系列核心...
本篇文章将深入探讨基于ARM9开发系统的Linux启动过程,帮助读者理解这一复杂但至关重要的技术环节。 首先,我们需要知道Linux启动过程可以分为几个主要阶段:BIOS或Bootloader、Kernel加载和初始化、Initramfs以及...
对于初学者,这是一个很好的实践平台,能够深入理解服务器端脚本语言如何驱动动态网站。同时,对于经验丰富的开发者,这可能是一个快速搭建简单内容管理系统的起点,可以在此基础上进行定制和扩展。
6. **socket编程的几篇很好的文章**: 这个文件名表明压缩包内包含了一些关于Socket编程的文章,可能涵盖了基础概念、编程实例、疑难问题解答等内容,对于初学者或者进阶者来说都是宝贵的学习资源。 在学习Socket...
在线性系统理论中,有很多重要的概念和技术,例如: 1. 线性代数方程:线性代数方程是研究线性系统的基本工具,它可以用来描述系统的行为和性能。 2. 特征值和特征向量:特征值和特征向量是研究线性系统的重要概念...
《bbarticle10 文章管理系统》是一个针对个人网站设计的小型但功能齐全的文章管理系统。它借鉴了当前流行的动网文章管理系统的模式,旨在为用户提供一个简单易用且高效的平台来管理和发布文章。在这个系统中,用户...
在这个项目中,虽然没有提供完整的源代码,但有一篇文章详细介绍了如何制作这个游戏。这为对游戏编程感兴趣的人提供了一次学习的机会,特别是对于那些想要了解游戏开发基础的人来说,这是一个很好的实践项目。 描述...
从给定的文件信息来看,这是一篇关于数学建模(数模)的学术论文摘要,涉及了数学优化、线性规划以及应用软件如Matlab和Lingo在解决实际问题中的应用。以下是对该文件中提及的关键知识点的详细解读: ### 数学建模 ...
4. **关键点描述符生成**:在每个关键点周围选择一个小窗口,计算窗口内像素的梯度方向和强度,形成一个128维的向量作为该关键点的描述符。这个描述符具有旋转不变性和一定程度的光照不变性。 5. **描述符匹配**:...
除了朗读之外,创设具体的情境对话也是一个很好的练习方法。可以尝试模拟日常生活中的各种场景(如购物、就餐等),并与朋友或同学进行角色扮演式的对话练习,以此来提高口语表达能力和应对突发情况的能力。 #### 6...