如何将 CSV 中的数据点写入 InfluxDB

导航至

自撰写本文以来,此博客已更新。有关此帖子的最新版本,请参阅此较新版本。 

Telegraf 是 InfluxData 的插件驱动型服务器代理,用于收集和报告指标。有超过 200 个输入插件,这意味着有很多方法可以将数据导入 InfluxDB。但是,我经常看到新的 Influx 用户在 InfluxData 社区站点上询问如何将 CSV 中的数据点写入 InfluxDB。从 CSV 文件写入数据点是将熟悉的数据插入 InfluxDB 的一种简单方法,这可以使您更容易熟悉该平台。

从 CSV 导入数据到 InfluxDB 的要求和设置

之前的博客中,我分享了三种将数据插入数据库的简单方法(包括一个将 CSV 数据转换为 Line Protocol,即 InfluxDB 的数据摄取格式的 Python 脚本)。本博客指南介绍如何使用 Telegraf 文件输入插件从 CSV 写入数据点。与 Python 脚本相比,Telegraf 文件输入插件写入数据点的速度更快,这在您执行批量导入时非常有用。我希望通过它消除新用户可能存在的任何困惑。我将假设您是 MacOS 用户,并且已使用 Homebrew 安装了 InfluxDB 和 Telegraf,因为这是在本地快速启动和运行的最快方法(或者,您可以从我们的下载页面下载二进制文件,或启动沙盒)。

本博客文章的配套代码仓库可以在此处找到。要从 CSV 写入数据点,我们将使用文件输入插件和 CSV 解析器。

要求

  • Telegraf 1.8.0 或更高版本
  • InfluxDB 1.7.0 或更高版本

安装后,通过在终端中键入以下命令确保 InfluxDB 正在运行且 Telegraf 已停止:brew services list

influxdb telegraf

如果您没有看到 InfluxDB 正在运行,请执行brew services start influxdb。同样,如果 Telegraf 正在运行,您可以使用 brew 通过brew services stop telegraf停止该服务。

首先,我需要下载一个带有适当的输入和输出插件的 Telegraf 配置文件。根据 Telegraf 入门文档,我将在我选择的目录中的终端中使用以下命令。

telegraf -sample-config -input-filter file -output-filter influxdb > file.conf

-sample-config 标志将生成 telegraf 配置文件。-input-filter-output-filter 标志分别指定数据的输入和输出源。> 之后的文本命名配置文件。我发现将我的 telegraf 配置文件以我正在使用的 Telegraf 插件命名很有用,这样我将来可以轻松区分我的配置文件。运行命令后,我打开 file.conf。我的 telegraf 配置文件共有 454 行,完整地包含了文件输入插件和 InfluxDB 输出插件。

CSV 数据摄取到 InfluxDB 的四个步骤

步骤一:我对配置文件进行的第一个更改是在输出插件部分。我想为我的 CSV 数据指定目标数据库。我将第 97 行从默认的 # database = "telegraf" 更改为 database = csv (或我选择的任何数据库名称,以便我可以轻松找到 csv 数据)。

我的 csv 数据看起来像

influxdb telegraf agent

第一列和第一行是垃圾数据。我还注释掉了最后一行。我的时间戳是 Unix 时间,精度为纳秒。在步骤二中,我确保通过在我的配置文件中添加一些行来排除这些行和列在我的数据摄取中。

步骤二:接下来,我想处理配置文件的输入插件部分。首先,我将在 telegraf 配置的第 455 行中指定我的 csv 文件的 pwd。由于我的配置文件与我的 csv 在同一目录中,因此第 455 行只是我的文件名:files = ["example"](否则请确保包含完整的 $pwd)。我还将在我的配置文件的底部,在输入插件部分下添加以下行,以确保我只摄取我关心的数据

## Data format to consume.
data_format = "csv"

## Indicates how many rows to treat as a header. By default, the parser assumes
## there is no header and will parse the first row as data. If set to anything more
## than 1, column names will be concatenated with the name listed in the next header row.
## If `csv_column_names` is specified, the column names in header will be overridden.
csv_header_row_count = 1

## Indicates the number of rows to skip before looking for header information.
 csv_skip_rows = 1

## Indicates the number of columns to skip before looking for data to parse.
## These columns will be skipped in the header as well.
 csv_skip_columns = 1
 
## The character reserved for marking a row as a comment row
 ## Commented rows are skipped and not parsed
csv_comment = "#"

 ## The column to extract the name of the metric from
 csv_measurement_column = "measurement_name"

 ## Columns listed here will be added as tags. Any other columns
 ## will be added as fields.
csv_tag_columns = ["tag_key"]

 ## The column to extract time information for the metric
 ## `csv_timestamp_format` must be specified if this is used
csv_timestamp_column = "time"

 ## The format of time data extracted from `csv_timestamp_column`
 ## this must be specified if `csv_timestamp_column` is specified
 csv_timestamp_format = "unix_ns"

额外的配置选项:值得看一下配置文件中的其他几个变量。

第 36 行默认为 metric_batch_size = 1000。它控制 Telegraf 发送到 InfluxDB 的写入大小。如果您正在执行批量数据导入,您可能需要增加该值。要确定合适的 metric_batch_size,我建议查看这些硬件大小调整指南。最后,如果您使用的是 OSS 版本并尝试导入数十万个数据点,请查看启用 TSI。启用 TSI 可以帮助提高序列基数性能。请查看此链接,了解如何在 InfluxDB 1.7 中启用 TSI。

第 69 行默认为 debug = false。如果您在将数据点写入 InfluxDB 时遇到问题,请将 debug 变量设置为 true 以获取调试日志消息。

步骤三:通过复制并粘贴终端中的以下行,使用我们刚刚编辑的配置文件运行 Telegraf

telegraf --config $pwd/file.conf

如果您有 debug = true,您应该看到此输出

Influxdb Telegraf Plugin - Telegraf Agent

步骤四:现在我们准备好查询我们的数据了。您可以通过在终端中运行 influx 来启动 influx shell。

运行 use csv 选择您的数据库,并通过以下查询验证您的插入是否成功:select * from measurement_name limit 3。使用 precision rfc3339 将时间戳转换为人类可读的格式。

Influx CLI InfluxDB Shell

这就是配置文件输入插件和从 CSV 文件将数据写入 InfluxDB 的全部内容。请注意,文件输入插件接受许多其他数据格式,包括:json、Line Protocol 和 collectd,仅举几例。如果您需要更多关于使用 CLI 的帮助,请查看文档

关于将 CSV 导入 InfluxDB 的结论

最后,我强烈建议使用 Telegraf 插件将数据点写入您的 InfluxDB 数据库,因为 Telegraf 是用 Go 编写的。Go 比 Python 快得多,但如果您执意使用 Python,我建议查看这个 csv-to-influxdb 代码仓库。最后,Telegraf 具有 tagpass /tagdrop/ fieldpass /fielddrop 配置参数,可以用于任何输入以过滤指定哪些标签和字段被传递。这些配置参数让您可以精选您想要包含在摄取中的数据。此外,Telegraf 是完全开源的。我鼓励您学习如何编写您自己的 Telegraf 插件,并根据需要贡献新的插件!

我希望本教程能帮助您开始使用 Influx。如果您有任何问题,请在社区站点上发布,或在 Twitter 上 @InfluxDB 关注我们。