关于flume中hbase插件数据误差的问题

前几天用到flume的日志收集,基于公司的业务对flume本身自带的hbase插件做了些改造,测试的时候却出现了丢数据和多数据的问题……

1.首先查看collector的event数,是与原数据量相符的。所以在agent与collector的交互过程是没有问题的

2.查看开发插件业务处理过程,看了好几遍感觉也没问题。

3.于是问题只有可能出现在hbase的数据处理上了。本来是基于flume自带的hbase插件做的改造,在数据提交那块上没动脑子,后来才发现问题就是出在数据提交这块。

丢数据

为什么会出现丢数据的情况呢?

大家都知道HTable的put操作是支持本地缓存的,如果设置了buffer,HBase不会每次put操作都提交到后台,而是等client端的数据量达到指定的buffer时才向后台提交数据。

本来在flume这种模式下,数据的提交速度本身就很快,如果不设置buffer,性能上会严重出现问题。但由于HTable本身没有提供定时提交buffer的机制,所以数据量未达到buffer时,client端的数据是不会提交到后台的。所以此时会出现丢数据的假象。于是就想独立启用一个线程定时去提交buffer中的数据,不管buffer有没有达到指定数据量。这时可以在出现异常的情况下尽量避免丢失buffer中的数据(但是不能完全避免)。

此时因为是多线程处理HTable的数据,就要考虑到HTable的线程安全,通过HTable的介绍可知,HTable并非是线程安全的。

This class is not thread safe for updates; the underlying write buffer can be corrupted if  multiple threads contend over a single HTable instance. 

所以得控制好多线程操作HTable这块。

多数据

为什么会出现多数据的情况呢?

首先是没有正确操作flume,在flume的agent端,如果采用DFO(Store on failure)的方式,在collector不可抵达时,agent端的event事件会存储在本地磁盘,如果第一次启动agent的时候已经存储了数据在本地磁盘而未删除,在第二次启动agent时,本地磁盘的数据会被重新发送给collector,这个时候就会出现多数据的情况。所以在重启agent的时候,记得处理本地磁盘的数据。

另外一种情况请参考Flume agent端event重复发送(数据暴增不一致)的问题

 

你可能感兴趣的:(关于flume中hbase插件数据误差的问题)