Influxdb批量插入,怎么解决内容不被覆盖问题?

推荐:体系化学习Java(Java面试专题)

问题一:

java代码批量插入一批数据到disk表,去influxdb上看只有一条数据,到底问题出在哪?

第一步:
了解influxdb的机制,它是基于时间的时序性数据库,每一条记录都会默认给一个时间标识,这个时间标识是不可以重复的,如果重复,后面的将覆盖前面的,根据机制很快就定位到了问题的主要原因。

第二步
我插入一批数据,为什么会插入时间相同呢?直接上代码

for(BdmpTenantUsage bdmpTenantUsage :bdmpTenantUsages ){
            String tenantName = bdmpTenantUsage.getTenantName();
            if(StringUtils.isNotBlank(tenantName)) {
                if( bdmpTenantUsage.getCpuUsageRate() )
                Point cpu_point = Point.measurement("disk")
                        .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS)
                        .addField("unit_id", "cpu_usage")
                        .addField("value", bdmpTenantUsage.getCpuUsageRate())
                        .addField("tenant_name", tenantName)
                        .build();
                Point memory_point = Point.measurement("disk")
                        .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS)
                        .addField("unit_id", "memory_usage")
                        .addField("value", bdmpTenantUsage.getMemoryUsageRate())
                        .addField("tenant_name", tenantName)
                        .build();
                Point storage_point = Point.measurement("disk")
                        .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS)
                        .addField("unit_id", "storage_usage")
                        .addField("value", bdmpTenantUsage.getStorageUsageRate())
                        .addField("tenant_name", tenantName)
                        .build();
                batchPoints.point(cpu_point).point(memory_point).point(storage_point);
            }
        }
        influxDB.write(batchPoints);

直接看时间的代码: .time(System.currentTimeMillis(), TimeUnit.MILLISECONDS);
代码执行的效率比较高且数据量小(我的数据仅有100个)的情况下,System.currentTimeMillis()获取的时间戳可能会相同,导致我这一批数据的时间都是相同的,所有后一个值覆盖了前面的值,最终influxdb表里只能查询到一条数据。

第三步
解决方案:
既然知道是时间的问题,那就从时间入手。我在解决的时候并没有思路这么清晰,中间走了个弯路。
我起先任务修改插入时间的单位就行了。直接将TimeUnit.MILLISECONDS修改成TimeUnit.MICROSECONDS(也就是将毫秒改成微秒),然后运行代码来了另一个错误:
partial write: points beyond retention policy dropped=140
这个是什么意思呢 what?
插入的数据点中有时间戳在此范围之外的,就会导致这个错误。
为什么呢 why?
System.currentTimeMillis()返回的是毫秒,后面要求的单位是微秒,两者不对应造成的错误。

下面附上两段代码:

// 获取毫秒, 网上百度都有
 public static Long getmicTime() {
        Long cutime = System.currentTimeMillis() * 1000; // 微秒
        Long nanoTime = System.nanoTime(); // 纳秒
        return cutime + (nanoTime - nanoTime / 1000000 * 1000000) / 1000;
    }
    
InfluxdbConnection conn = InfluxdbConnection.builder()
                .openurl(openurl)
                .username(username)
                .password(password)
                .database(database)
                .build();
        InfluxDB influxDB = InfluxdbConnectionUtils.influxDBBuild(conn);
        String rpName = "aRetentionPolicy";
        BatchPoints batchPoints = BatchPoints
                .database(database)
                .tag("aync", "true")
                .retentionPolicy(rpName)
                .consistency(InfluxDB.ConsistencyLevel.ALL)
                .build();
        for(BdmpTenantUsage bdmpTenantUsage :bdmpTenantUsages ){
            String tenantName = bdmpTenantUsage.getTenantName();
            if(StringUtils.isNotBlank(tenantName)) {
                Point cpu_point = null;
                Point memory_point = null;
                Point storage_point = null;
                String cpuUsageRate = bdmpTenantUsage.getCpuUsageRate();
                String memoryUsageRate = bdmpTenantUsage.getMemoryUsageRate();
                String storageUsageRate = bdmpTenantUsage.getStorageUsageRate();
                if(StringUtils.isNotBlank(cpuUsageRate)) {
                    cpu_point = Point.measurement("disk")
                            .time(DateUtils.getmicTime(), TimeUnit.MICROSECONDS)
                            .addField("unit_id", "cpu_usage")
                            .addField("value", cpuUsageRate)
                            .addField("tenant_name", tenantName)
                            .build();
                    batchPoints.point(cpu_point);
                }
                if(StringUtils.isNotBlank(memoryUsageRate)) {
                    memory_point = Point.measurement("disk")
                            .time(DateUtils.getmicTime(), TimeUnit.MICROSECONDS)
                            .addField("unit_id", "memory_usage")
                            .addField("value", bdmpTenantUsage.getMemoryUsageRate())
                            .addField("tenant_name", tenantName)
                            .build();
                    batchPoints.point(memory_point);
                }
                if(StringUtils.isNotBlank(storageUsageRate)) {
                    storage_point = Point.measurement("disk")
                            .time(DateUtils.getmicTime(), TimeUnit.MICROSECONDS)
                            .addField("unit_id", "storage_usage")
                            .addField("value", bdmpTenantUsage.getStorageUsageRate())
                            .addField("tenant_name", tenantName)
                            .build();
                    batchPoints.point(storage_point);
                }
            }
        }
        influxDB.write(batchPoints);
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

激流丶

感觉小弟写的不错,给点鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值