分享

Flume-ng生产环境实践(二)flume-ng 测试过程中event丢失部分body数据

本帖最后由 坎蒂丝_Swan 于 2015-1-12 14:17 编辑
问题导读
1.source端单event的body如何处理大于16字节的数据的?
2.具体的方法是如何实现的?










经过测试发现,当source端单event的body数据大于16字节后,输出到目标只剩下16字节。进过多源代码的分析,发现,源代码中进行了截取。在LoggerSink.java中:
  1. if (event != null) {
  2.         if (logger.isInfoEnabled()) {
  3.           logger.info("Event: " + EventHelper.dumpEvent(event));
  4.         }
  5. }
复制代码


我们去看EventHelper.java的dumpEvent方法:
  1. private static final int DEFAULT_MAX_BYTES = 16;
  2. public static String dumpEvent(Event event) {
  3.     return dumpEvent(event, DEFAULT_MAX_BYTES);
  4. }
复制代码
  
  1. StringBuilder buffer = new StringBuilder();
  2.     if (event == null || event.getBody() == null) {
  3.       buffer.append("null");
  4.     } else if (event.getBody().length == 0) {
  5.       // do nothing... in this case, HexDump.dump() will throw an exception
  6.     } else {
  7.       byte[] body = event.getBody();
  8.       byte[] data = Arrays.copyOf(body, Math.min(body.length, maxBytes));
  9.       ByteArrayOutputStream out = new ByteArrayOutputStream();
  10.       try {
  11.         HexDump.dump(data, 0, out, 0);
  12.         String hexDump = new String(out.toByteArray());
  13.         // remove offset since it's not relevant for such a small dataset
  14.         if(hexDump.startsWith(HEXDUMP_OFFSET)) {
  15.           hexDump = hexDump.substring(HEXDUMP_OFFSET.length());
  16.         }
  17.         buffer.append(hexDump);
  18.       } catch (Exception e) {
  19.        if(LOGGER.isInfoEnabled()) {
  20.          LOGGER.info("Exception while dumping event", e);
  21.        }
  22.         buffer.append("...Exception while dumping: ").append(e.getMessage());
  23.       }
  24.       String result = buffer.toString();
  25.       if(result.endsWith(EOL) && buffer.length() > EOL.length()) {
  26.         buffer.delete(buffer.length() - EOL.length(), buffer.length()).toString();
  27.       }
  28.     }
  29.     return "{ headers:" + event.getHeaders() + " body:" + buffer + " }";
  30.   }
复制代码


不难看出,在event处理过程中,发生了数据截取操作。




Flume-ng生产环境实践(一)Flume-ng生产环境编译
Flume-ng生产环境实践(二)flume-ng 测试过程中event丢失部分body数据
Flume-ng生产环境实践(三)实现文件sink,按照固定格式目录输出
Flume-ng生产环境实践(四)实现log格式化interceptor

欢迎加入about云群90371779322273151432264021 ,云计算爱好者群,亦可关注about云腾讯认证空间||关注本站微信

已有(10)人评论

跳转到指定楼层
stark_summer 发表于 2015-1-12 13:53:01
回复

使用道具 举报

355815741 发表于 2015-1-12 22:23:53
学习了,谢谢分享~
回复

使用道具 举报

cdb521007 发表于 2015-7-26 14:48:43
楼主太强悍了,研究源码~  佩服!!!
回复

使用道具 举报

为了明天time 发表于 2015-9-22 10:33:27
回复

使用道具 举报

dorajam 发表于 2018-6-13 11:33:15
不是在配置中,有一个maxBytesToLog配置项吗?默认是16,但是修改后没生效,本人才疏学浅,java基础基本为0
回复

使用道具 举报

DavidShao 发表于 2018-6-15 14:44:05
老版本的flume不清楚,但是新版本的flume中,应该没有这个问题了,下面截图是官方文档中spool source中,单个event的最大长度
下载.png

点评

厉害,老铁  发表于 2018-6-15 22:12
回复

使用道具 举报

DavidShao 发表于 2018-6-15 14:48:55
老版本的flume不清楚,但是新版本的flume中,应该没有这个问题了,下面截图是官方文档中spool source中,单个event的最大长度
回复

使用道具 举报

DavidShao 发表于 2018-6-15 14:50:18
老版本的flume不清楚,但是新版本的flume中,应该没有这个问题了,下面截图是官方文档中spool source中,单个event的最大长度



LINE

This deserializer generates one event per line of text input.






Property Name

Default

Description


deserializer.maxLineLength 2048 Maximum number of characters to include in a single event. If a line exceeds this length, it is truncated, and the remaining characters on the line will appear in a subsequent event.
deserializer.outputCharset UTF-8 Charset to use for encoding events put into the channel.
回复

使用道具 举报

spftoto 发表于 2019-1-16 20:05:13
DavidShao 发表于 2018-6-15 14:50
老版本的flume不清楚,但是新版本的flume中,应该没有这个问题了,下面截图是官方文档中spool source中,单 ...

牛X牛X
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条