flume建立ElasticSearch索引时间的问题

flume收集到的日志,采用ElasticSearch作为存储,运行一段时间后,发现每天早点八点才会创建索引文件,比北京时间晚了8个小时,导致0点到8点这段时间的数据并没有存储到今天的索引文件中,而是存储在前一天的索引中,当时以为数据丢失了,全文检索后发现数据被存在了前一天的索引文件中。首先确定系统的时间是准备的,基本定位到应该是flume自身创建索引的时候除了问题,查看源代码。

flume创建ElasticSearch索引文件的代码如下

if (indexRequestBuilderFactory == null) {
      indexRequestBuilder = client
          .prepareIndex(indexNameBuilder.getIndexName(event), indexType)
          .setSource(serializer.getContentBuilder(event).bytes());
} else {
      indexRequestBuilder = indexRequestBuilderFactory.createIndexRequest(
          client, indexNameBuilder.getIndexPrefix(event), indexType, event);
}

下面看indexNameBuilder.getIndexName(event)获取索引

@Override
  public String getIndexName(Event event) {
    TimestampedEvent timestampedEvent = new TimestampedEvent(event);
    long timestamp = timestampedEvent.getTimestamp();
    return new StringBuilder(indexPrefix).append('-')
      .append(fastDateFormat.format(timestamp)).toString();
  }
TimestampedEvent(Event base) {
    setBody(base.getBody());
    Map<String, String> headers = Maps.newHashMap(base.getHeaders());
    String timestampString = headers.get("timestamp");
    if (StringUtils.isBlank(timestampString)) {
      timestampString = headers.get("@timestamp");
    }
    if (StringUtils.isBlank(timestampString)) {
      this.timestamp = DateTimeUtils.currentTimeMillis();
      headers.put("timestamp", String.valueOf(timestamp ));
    } else {
      this.timestamp = Long.valueOf(timestampString);
    }
    setHeaders(headers);
  }

TimestampedEvent会先获取事件中的timestamp,如果事件中没有timestamp,就取当前的毫秒时间。

fastDateFormat会格式化timestamp,也就是生成索引后面的日期,如flume-2015-01-01,fastDateFormat默认会采用Etc/UTC时区,也就是会比北京时间晚8小时,北京时间早上8点,获取到的就是0点。

private FastDateFormat fastDateFormat = FastDateFormat.getInstance("yyyy-MM-dd",
      TimeZone.getTimeZone("Etc/UTC"));

另外可以通过配置文件来配置fastDateFormat的时区,我们采用即可

a1.sinks.k1.timeZone=Asia/Shanghai

使用ElasticSearch sink的时候,要加上上面这句话,这样就可以解决创建索引晚8小时的问题了。

转载于:https://my.oschina.net/u/2311010/blog/597754

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值