推特 阿里云技术文档正文

写入数据_使用详解_SDK 参考_时序数据库 TSDB_时序时空数据库TSDB

admin 阿里云技术文档 2020-02-11 192 0
阿里云服务器优惠

写入数据

HiTSDB SDK 使用 Point 类,表示一个时间点。一个 Point 对象表示一个时间序列(时间线)某个时刻上的数据。

构造时间点

Point(时间点)有多种构造方法,形式比较多样化。本节提供三种构造时间点的方法示例。

注意:Point 的构建至少需要一个 tag 键值对。

示例一

构建一个时间点。用单位为秒的时间戳表示时间,指定 Point 数据的 Metric 与多个 Tag。

  1. // 以'秒'为时间戳
  2. int timestamp = (int)(System.currentTimeMillis()/1000);
  3. // 构造 Point
  4. Point point = Point.metric("test1")
  5. .tag("tagk1", "tagv1")
  6. .tag("tagk2", "tagv2")
  7. .tag("tagk3", "tagv3")
  8. .timestamp(timestamp).value(123.456)
  9. .build();

示例二

构建一个时间点。用单位为毫秒的时间戳表示时间,指定 Point 数据的 Metric,Tag 使用 Map 形式的键值对。

  1. // 也可以'毫秒'为时间戳
  2. long timestamp = System.currentTimeMillis();
  3. // 使用 HashMap 表示 Tags
  4. Map<String,String> tagsMap = new HashMap<String,String>();
  5. tagsMap.put("tagk1", "tagv1");
  6. tagsMap.put("tagk2", "tagv2");
  7. // 构造 Point
  8. Point point = Point.metric("test1")
  9. .tag(tagsMap)
  10. .value(timestamp,123.456)
  11. .build();

示例三

构建一个时间点。使用java.util.Date表示时间。

  1. // 使用 java.util.Date 表示时间。
  2. Point point = Point.metric("test1")
  3. .tag("tagk1", "tagv1")
  4. .value(new Date,123.456)
  5. .build();


写入数据

HiTSDB-Client 有两种写数据的方式:同步阻塞的写数据和异步非阻塞的写数据。

同步阻塞的写数据

假设我们现在需要构建 500 个时间点提交给 HiTSDB。

示例代码

  1. List<Point> points = new ArrayList<Point>();
  2. 构建 Point
  3. for(int i = 0; i<500; i++) {
  4. long timestamp = System.currentTimeMillis();
  5. Point point = Point.metric("test1")
  6. .tag("tagk1", "tagv1")
  7. .value(timestamp, Math.random())
  8. .build();
  9. // 手动打包数据
  10. points.add(point);
  11. }
  12. // 手动打包后提交数据
  13. tsdb.putSync(points)

注意:出于写入性能的考虑,同步写的方式一般需要您手动将数据点打包成一批数据,并且建议一批数据包含500~1000个数据点。此外,也建议多个线程并发进行提交

同步写的响应对象

您可以根据需要选择返回的数据内容。

  • 返回空对象,无内容。本质是调用 POST /api/put

    1. Result result = tsdb.putSync(ps);
  • 返回提交概述。包含成功数和返回数。本质是调用 POST /api/put?summary=true

    1. SummaryResult summaryResult = tsdb.putSync(ps,SummaryResult.class);
  • 返回提交概述。包含成功数、返回数和失败原因。本质是调用 POST /api/put?details=true

    1. DetailsResult detailsResult = tsdb.putSync(ps,DetailsResult.class);

异步非阻塞的写数据

异步写数据的方式比较简单,只要有 Point 就可以提交数据。Client 会自动帮助您批量地提交数据,不需要您手动打包。

如果没有特殊需求,推荐您使用异步非阻塞的写数据的方式。

示例代码

  1. // 构建 Point
  2. Point point = Point.metric("test1")
  3. .tag("tagk1", "tagv1")
  4. .value(timestamp, Math.random())
  5. .build();
  6. // 直接提交数据
  7. tsdb.put(point);

异步非阻塞写数据的回调设置

当您使用异步写数据的方式时,若需要获取 Put 接口的响应结果,则需要设置回调接口。

示例代码

  1. final AtomicLong num = new AtomicLong();
  2. // 回调对象
  3. BatchPutCallback cb = new BatchPutCallback() {
  4. @Override
  5. public void response(String address, List<Point> input, Result output) {
  6. long afterNum = num.addAndGet(input.size());
  7. System.out.println("成功处理" + input.size() + ",已处理" + afterNum);
  8. }
  9. @Override
  10. public void failed(String address, List<Point> input, Exception ex) {
  11. ex.printStackTrace();
  12. long afterNum = num.addAndGet(input.size());
  13. System.out.println("失败处理" + input.size() + ",已处理" + afterNum);
  14. }
  15. };
  16. HiTSDBConfig config = HiTSDBConfig
  17. .address("example.hitsdb.com", 8242)
  18. .listenBatchPut(cb) // 设置回调接口
  19. .config();
  20. tsdb = HiTSDBClientFactory.connect(config);

HiTSDB Client 提供了以下三种类型的 PutCallback 接口:

  • BatchPutCallback,即调用POST /api/put
  • BatchPutSummaryCallback,即调用POST /api/put?summary=true
  • BatchPutDetailsCallback,即调用POST /api/put?details=true

您可以通过设置不同类型的 BatchPutCallback 来根据需要选择返回的数据内容。

注意:不要在回调方法中做耗时操作。若有此需要,可以在把操作交给其他工作线程执行。

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

评论

-----