使用 C++ Flight SQL 客户端查询 InfluxDB Cloud
作者:Anais Dotis-Georgiou / 开发者
2023年6月26日
导航到
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 的其他方法的以下文档。
代码讲解
让我们将代码分解成更小的部分,以了解正在发生的事情。
- 导入所需的类:我们首先从 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;
- 收集您的认证凭据和要执行的查询
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.");
- 定义主类:我们定义一个具有
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;
- 设置 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);
- 接下来,使用 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));
- 最后,将结果放入流中,将它们读入 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中的说明或以下步骤操作。
- 在您的终端中,设置以下环境变量。
# 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>
- 运行以下命令以使用名为
ccflight
的镜像构建shell脚本。sh ./influxdb-build.sh build
- 要启动应用程序,请在终端中运行
docker run <IMAGE_NAME>
。docker run ccflight
推荐资源
查看以下文档。它帮助我构建了这个示例,也可以帮助您在查询InfluxDB Cloud的旅程中。
- 关于Arrow Flight的参考文档
- 在Python中使用Arrow Flight SQL查询数据的InfluxDB Cloud文档Querying data with Arrow Flight SQL in Python
- 关于InfluxDB, Flight SQL, Pandas, and Jupyter Notebooks Tutorial的博客文章
- 关于TL;DR InfluxDB Tech Tips: Downsampling with Flight SQL and AWS Lambda的博客文章
希望这篇博客文章能激发您探索InfluxDB Cloud并利用Flight SQL将大型数据集从InfluxDB传输到您选择的工具进行处理。如果您需要任何帮助,请通过我们的社区网站或Slack频道联系。我很乐意了解您正在尝试实现的目标和您希望InfluxDB拥有的功能。