在 Dremio 中读取冰山表失败,原因是“不是 Parquet 文件”和“预期的幻数”

问题描述 投票:0回答:1

我有一个 Spark 结构化流作业,它从 Kafka 读取数据并将其作为 Apache Iceberg 表(通过 Nessie 目录)写入 S3(NetApp StorageGRID 设备,本地)。 之后我通过 Dremio 访问该表,该表一开始可以工作,但现在似乎某些 Parquet 文件已损坏 - 或者至少 Dremio 无法读取它们。

我在 Dremio 中收到以下错误:

IOException:/s3bucket/measurements_7b67d322-277d-4e26-bb8a-c2c833423ca6/data/timestamp_day=2024-06-28/00120-6-b193ded0-6b70-4506-bf77-be6da1863b21-00001.parquet不是Parquet 文件。尾部预期的幻数 [80, 65, 82, 49],但发现 [118, -33, 125, -73]

可以通过 Spark 和 Starburst/Trino 查询数据。下载上述 parquet 文件并使用

parquet-tools
显示内容也有效。

过去我使用 Spark 完全重写一次表,然后 Dremio 能够再次查询数据,但一段时间后我再次遇到上述错误。因此,Spark 编写 Iceberg 表的方式似乎会导致此类错误。 我可以想象流作业可能会在写入期间崩溃,因为我这里的演示环境性能非常低且不稳定,但由于 Iceberg 使用 ACID 事务,我宁愿期望回滚,也不愿让消费者可以使用无效文件。

有人知道如何解决此问题甚至更好:根本原因可能是什么?

apache-spark spark-streaming parquet apache-iceberg dremio
1个回答
0
投票

预期序列 [80, 65, 82, 49] 是“PAR1”,所有 parquet 解析器都会读取该序列,表示“这是 parquet v1 文件”,pr E

实际输出是“v!}I”,这意味着下载有问题或者文件不是 parquet。

为了避免额外的混乱,请注意,写入 s3 时写入是原子的,因此永远不会有任何半写入的文件。

Parquet 格式已记录:Parquet 文件格式。更详细地查看该文件,尤其是查看标题的内容。

© www.soinside.com 2019 - 2024. All rights reserved.