使用 C++ Flight SQL 客户端查询 InfluxDB Cloud

导航到

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

要求和设置

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

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

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

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

代码讲解

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

  1. 导入所需的类:我们首先从 Apache Arrow Flight 和其他必要的库中导入所需的类。
    #include <cstdlib>
    #include <iostream>
    
    #include <arrow/flight/client.h>
    #include <arrow/flight/sql/client.h>
    #include <arrow/table.h>
    #include <gflags/gflags.h>
    #include <arrow/flight/client_auth.h>
    #include <grpcpp/grpcpp.h>
    #include <grpcpp/support/channel_arguments.h>
    #include <arrow/flight/api.h>
    #include <arrow/flight/client_middleware.h>
    
    namespace flight = arrow::flight;
    namespace flightsql = arrow::flight::sql;
  2. 收集您的认证凭据和要执行的查询
    const char* myhost = std::getenv("HOST");
    const char* mytoken = std::getenv("TOKEN");
    const char* mydatabase = std::getenv("DATABASE_NAME");
    
    DEFINE_string(host, myhost , "The host of the Flight SQL server.");
    DEFINE_string(token, mytoken, "The token for InfluxDB");
    DEFINE_string(database, mydatabase, "The database to query from");
    DEFINE_int32(port, 443, "The port of the Flight SQL server.");
    DEFINE_string(query, "SELECT * FROM 'measurementName'", "The query to execute.");
  3. 定义主类:我们定义一个具有 Main 方法的 C++ 类,我们的代码将在此执行。同时连接到 Arrow 客户端。
    arrow::Status Main() {
    ARROW_ASSIGN_OR_RAISE(auto location,
                            flight::Location::ForGrpcTls(FLAGS_host, FLAGS_port));
      std::cout << "Connecting to " << location.ToString() << std::endl;
  4. 设置 Flight SQL 客户端,并添加 Bearer 令牌和 database 的头信息。
    // Set up the Flight SQL client
    std::unique_ptr<flight::FlightClient> flight_client;
    ARROW_ASSIGN_OR_RAISE(flight_client, flight::FlightClient::Connect(location));
    std::unique_ptr<flightsql::FlightSqlClient> client(
    new flightsql::FlightSqlClient(std::move(flight_client)));
    
    flight::FlightCallOptions call_options;
    call_options.headers.emplace_back("authorization", "Bearer " + FLAGS_token);
    call_options.headers.emplace_back("database", FLAGS_database);
  5. 接下来,使用 Execute 方法,并将头信息和查询传递给客户端以执行查询并获取结果。
    // Execute the query, getting a FlightInfo describing how to fetch the results
    std::cout << "Executing query: '" << FLAGS_query << "'" << std::endl;
    ARROW_ASSIGN_OR_RAISE(std::unique_ptr<flight::FlightInfo> flight_info,
    client->Execute(call_options, FLAGS_query));
  6. 最后,将结果放入流中,将它们读入 Arrow 表,并转换为字符串。
    ARROW_ASSIGN_OR_RAISE(auto stream, client->DoGet(call_options, endpoint.ticket));
    // Read all results into an Arrow Table, though we can iteratively process record
    // batches as they arrive as well
    ARROW_ASSIGN_OR_RAISE(auto table, stream->ToTable());
    std::cout << "Read one chunk:" << std::endl;
    std::cout << table->ToString() << std::endl;

您可以在 这里 找到完整的脚本。

使用 C++ Flight SQL 查询 InfluxDB Cloud

要运行示例,首先克隆相应的仓库,导航到该目录,然后按照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. 运行以下命令以使用名为ccflight的镜像构建shell脚本。
    sh ./influxdb-build.sh build
  3. 要启动应用程序,请在终端中运行docker run <IMAGE_NAME>
    docker run ccflight

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

  1. 关于Arrow Flight的参考文档
  2. 在Python中使用Arrow Flight SQL查询数据的InfluxDB Cloud文档Querying data with Arrow Flight SQL in Python
  3. 关于InfluxDB, Flight SQL, Pandas, and Jupyter Notebooks Tutorial的博客文章
  4. 关于TL;DR InfluxDB Tech Tips: Downsampling with Flight SQL and AWS Lambda的博客文章

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