Apache spark 关于将拼花地板用于时间序列数据的问题

Apache spark 关于将拼花地板用于时间序列数据的问题,apache-spark,time-series,parquet,Apache Spark,Time Series,Parquet,我正在探索从传感器时间序列数据中存储大量数据的方法,以一种可扩展且经济高效的方式 目前,我正在为每个传感器编写一个CSV文件,按日期进行分区,因此我的文件系统层次结构如下所示: 客户端id/传感器id/年/月/日.csv 我的目标是能够对这些数据执行SQL查询,通常是获取特定客户机/传感器的时间范围,执行聚合等。我曾尝试将其加载到Postgres和timescaledb,但容量太大,查询速度太慢 我现在正在尝试使用Spark和Parquet文件来执行这些查询,但我有一些问题在这个主题的研究中无法

我正在探索从传感器时间序列数据中存储大量数据的方法,以一种可扩展且经济高效的方式

目前,我正在为每个传感器编写一个CSV文件,按日期进行分区,因此我的文件系统层次结构如下所示:

客户端id/传感器id/年/月/日.csv

我的目标是能够对这些数据执行SQL查询,通常是获取特定客户机/传感器的时间范围,执行聚合等。我曾尝试将其加载到Postgres和timescaledb,但容量太大,查询速度太慢

我现在正在尝试使用Spark和Parquet文件来执行这些查询,但我有一些问题在这个主题的研究中无法回答,即:

我正在将这些数据转换为拼花地板文件,因此我现在有如下内容:

客户识别号/传感器识别号/年/月/日。拼花地板

但我担心的是,当Spark加载包含许多拼花文件的顶部文件夹时,行组信息的元数据并没有像我使用一个包含所有数据的拼花文件那样优化,而是按client/sensor/year/month/day进行分区。这是真的吗?或者是有许多拼花文件还是一个分区拼花文件是一样的?我知道在内部,拼花地板文件存储在一个文件夹层次结构中,就像我正在使用的文件夹层次结构一样,但我不清楚这会如何影响文件的元数据

我之所以不能这样做,是因为我一直在接收新数据,据我所知,由于页脚元数据的工作性质,我无法附加到拼花地板文件。这是正确的吗?现在,我只需将前一天的数据转换为拼花地板,并为每个客户机的每个传感器创建一个新文件

谢谢。

您可以使用kafkaas,您已经在使用它实时处理数据,并以拼花格式存储数据。是的,您可以将数据附加到拼花地板文件中。使用SaveMode.Append,例如 df.write.mode“append”.parquetpath

您甚至可以按小时对数据进行分区。 客户端/传感器/年/月/日/小时,这将进一步提高查询时的性能。 可以基于系统时间创建小时分区,也可以基于要对数据运行的查询类型创建时间戳列

如果选择基于时间戳列进行分区,则可以使用来处理延迟记录

希望这有帮助

您可以使用kafkaas,您已经在使用它实时处理数据并以拼花格式存储数据。是的,您可以将数据附加到拼花地板文件中。使用SaveMode.Append,例如 df.write.mode“append”.parquetpath

您甚至可以按小时对数据进行分区。 客户端/传感器/年/月/日/小时,这将进一步提高查询时的性能。 可以基于系统时间创建小时分区,也可以基于要对数据运行的查询类型创建时间戳列

如果选择基于时间戳列进行分区,则可以使用来处理延迟记录


希望这有帮助

我可以分享我在AppsFlyer使用的经验和技术堆栈。 我们有很多数据,每天大约有700亿个事件

我们用于近实时分析的时间序列数据存储在Druid和Clickhouse中。Clickhouse用于保存最近两天的实时数据;德鲁伊0.9无法管理它。德鲁伊保存着我们的其余数据,这些数据每天都通过Hadoop填充

德鲁伊是一个合适的人选,如果你不需要行数据,而是预先聚合的,每天或每小时一次。 我建议您给Clickhouse一个机会,它缺少文档和示例,但运行健壮且快速


另外,您可以看看ApacheHudi。

我可以分享我在AppsFlyer上使用的经验和技术堆栈。 我们有很多数据,每天大约有700亿个事件

我们用于近实时分析的时间序列数据存储在Druid和Clickhouse中。Clickhouse用于保存最近两天的实时数据;德鲁伊0.9无法管理它。德鲁伊保存着我们的其余数据,这些数据每天都通过Hadoop填充

德鲁伊是一个合适的人选,如果你不需要行数据,而是预先聚合的,每天或每小时一次。 我建议您给Clickhouse一个机会,它缺少文档和示例,但运行健壮且快速


此外,您还可以看看Apache Hudi。

您每次编写的内容的大小是多少?很难说,因为数据量是可变的,但要给您提供更多的上下文:传感器数据消息包含多个读数[{Sensor_id:Sensor_value},{Sensor_id:Sensor_value}],但是id的数量和种类是不可预测的。我将它们展开,以便表具有固定的模式时间戳id和值。因此,每条消息最多可以有30行,我每秒可以收到数千条消息。一点经验
我用timescaledb做的一个缩影,从卡夫卡那里摄取了一周的数据,产生了28亿行。有趣的东西。还不完全是我所涉及的内容。你每次写的内容有多大?很难说,因为数据量是可变的,但给你一些更多的上下文:传感器数据消息包含多个读数[{Sensor_id:Sensor_value},{Sensor_id:Sensor_value}],但是id的数量和种类是不可预测的。我将它们展开,以便表具有固定的模式时间戳id和值。因此,每条消息最多可以有30行,我每秒可以收到数千条消息。我用timescaledb做了一个小实验,一周内从卡夫卡摄取了28亿行数据。有趣的东西。不太清楚我参与了什么。你好,维普尔。我以前使用过spark的结构化流媒体。我不认为数据转换步骤是我目前的瓶颈。我知道您可以在拼花地板上附加数据,我的问题是,由于行组需要数据来预先计算元数据,因此是否会对性能造成影响。查询不是按每小时一次的粒度进行的,所以我想进一步细化分区不会带来任何好处。无论如何,我都会尝试你的建议,将转换步骤与我现在所拥有的进行基准测试。谢谢你好@mlashcorp你有时间分享你的最终解决方案吗你好,威普。我以前使用过spark的结构化流媒体。我不认为数据转换步骤是我目前的瓶颈。我知道您可以在拼花地板上附加数据,我的问题是,由于行组需要数据来预先计算元数据,因此是否会对性能造成影响。查询不是按每小时一次的粒度进行的,所以我想进一步细化分区不会带来任何好处。无论如何,我都会尝试你的建议,将转换步骤与我现在所拥有的进行基准测试。谢谢你好@mlashcorp你有时间分享你的最终解决方案吗