使用Go Flight SQL客户端查询InfluxDB Cloud

导航至

InfluxDB Cloud 3.0 是基于 Apache 生态系统构建的多功能时间序列数据库。您可以使用Apache Arrow Flight SQL 接口查询InfluxDB Cloud,它为处理时间序列数据提供了 SQL 支持。在本教程中,我们将通过Go使用Flight SQL查询InfluxDB Cloud的过程进行讲解。Go Flight SQL客户端是Apache Arrow Flight的一部分,这是一个用于构建高性能数据服务的框架。它提供了一种通过现代高性能RPC框架gRPC高效传输大量数据集的方法。您可以尝试使用这个 仓库,使用Go Flight SQL客户端查询 InfluxDB Cloud

要求和设置

本教程假设您已经拥有一个免费InfluxDB Cloud账户,并且您的机器上已经运行了 Docker

最后,您需要创建或获取以下InfluxDB资源

  • 一个桶

  • 一个令牌

  • 您的组织(通常是您注册账户时使用的电子邮件地址)

您还需要将数据写入您的InfluxDB账户。最简单的方法是通过UI手动编写一些行协议。导航到“加载数据”>“桶”>“+添加数据”>“行协议”>“手动输入”,选择您要写入的桶,并写入一个点到InfluxDB。例如,您可以编写 measurementName,tagKey=tagValue fieldKey=1.0。或者,如果您想尝试真实的行协议数据,可以尝试NOAA空气传感器数据集。您还可以查看有关将数据写入InfluxDB Cloud 3.0的以下文档,了解向InfluxDB Cloud写入数据的其他方法。

代码讲解

让我们将代码拆分成更小的部分,以便理解正在发生的事情。

  1. 导入所需类:我们首先从Apache Arrow Flight和其他必要的库中导入所需的类。
    package main
    
    import (
    	"context"
    	"crypto/x509"
    	"encoding/json"
    	"fmt"
    	"os"
    
    	"github.com/apache/arrow/go/v12/arrow/flight/flightsql"
    	"google.golang.org/grpc"
    	"google.golang.org/grpc/credentials"
    	"google.golang.org/grpc/metadata"
    	"os"
    )
  2. 定义主函数以调用dbQuery()函数并处理错误。
    func main() {
    	fmt.Println("An example using Go Flight SQL Client to query InfluxDB")
    
    	if err := dbQuery(context.Background()); err != nil {
    		fmt.Fprintf(os.Stderr, "error: %v\n", err)
    		os.Exit(1)
    	}
  3. 收集我们的认证环境变量,并在dbQuery()函数中设置连接。
    func dbQuery(ctx context.Context) error {
    	url := os.Getenv("HOST")
    	token := os.Getenv("TOKEN")
    	bucket := os.Getenv("DATABASE_NAME")
    …
    // Create query client
    	client, err := flightsql.NewClient(url, nil, nil, opts...)
    	if err != nil {
    		return fmt.Errorf("flightsql: %s", err)
    	}
    
    	ctx = metadata.AppendToOutgoingContext(ctx, "authorization", "Bearer "+token)
    	ctx = metadata.AppendToOutgoingContext(ctx, "database", bucket)
  4. 接下来,我们定义要执行的查询并执行它。使用Execute方法并将认证和查询传递给服务器以执行查询。
    // Execute query
    	query := `SELECT * FROM 'measurementName'`
    
    	info, err := client.Execute(ctx, query)
    	if err != nil {
    		return fmt.Errorf("flightsql flight info: %s", err)
    	}
    	reader, err := client.DoGet(ctx, info.Endpoint[0].Ticket)
    	if err != nil {
    		return fmt.Errorf("flightsql do get: %s", err)
    	}
  5. 最后我们将结果以JSON格式打印。
    // Print results as JSON
    	for reader.Next() {
    		record := reader.Record()
    		b, err := json.MarshalIndent(record, "", "  ")
    		if err != nil {
    			return err
    		}
    		fmt.Println("RECORD BATCH")
    		fmt.Println(string(b))
    
    		if err := reader.Err(); err != nil {
    			return fmt.Errorf("flightsql reader: %s", err)
    		}
    	}

使用Go Flight SQL查询InfluxDB云

要运行示例,首先克隆相应的仓库,导航到该目录,并按照README.md中概述的步骤进行操作。

  1. 在您的终端中设置以下环境变量。
    # Set environment variables
    
    export INFLUX_DATABASE="your bucket" && \
    export INFLUX_HOST="your host url i.e. us-east-1-1.aws.cloud2.influxdata.com" && \
    export INFLUX_TOKEN="your token"
  2. 运行以下命令以利用名为goflight的shell脚本构建镜像。
    sh ./influxdb-build.sh build
  3. 要启动应用程序,请在您的终端中运行docker run "IMAGE_NAME"
    docker run goflight

资源和结论

查看以下文档。它帮助我构建了这个示例,也可以帮助您在查询InfluxDB云的旅程中。

  1. Arrow Flight的参考文档https://arrow.apache.ac.cn/docs/dev/java/reference/

  2. InfluxDB云的查询数据参考文档使用Python在InfluxDB云中通过Arrow Flight SQL查询数据

  3. 关于InfluxDB,Flight SQL,Pandas和Jupyter Notebooks教程的博客文章https://influxdb.org.cn/blog/influxdb-flight-sql-pandas-jupyter-notebooks-tutorial/

  4. 关于使用Flight SQL和AWS Lambda进行降采样的TL;DR InfluxDB技术提示博客文章https://influxdb.org.cn/blog/tldr-influxdb-tech-tips-downsampling-flight-sql-aws-lambda/

我希望这篇博客文章能够激发您探索InfluxDB云,并利用Flight SQL将InfluxDB中的大数据集传输到您选择的工具中进行数据处理。如果您需要任何帮助,请通过我们的社区网站Slack频道与我们联系。我很乐意了解您想要实现的目标以及您希望InfluxDB拥有的功能。