【问题标题】:Using Spark 3.2 to ingest IoT data into delta lake continuously使用 Spark 3.2 将 IoT 数据持续摄取到 delta Lake
【发布时间】:2022-01-16 03:05:53
【问题描述】:

是否可以直接使用org.apache.spark.sql.delta.sources.DeltaDataSource以追加模式连续摄取数据?

还有其他更合适的方法吗?我担心的是延迟和可扩展性,因为每个振动传感器的数据采集频率可以达到 30 KHz,而且其中有几个,我需要在 Delta Lake 中记录原始数据以进行 FFT 和小波分析等。

在我的架构中,数据摄取是在一个 Spark 应用程序中连续完成的,而分析是在另一个具有按需查询的独立 Spark 应用程序中执行的。

如果 Delta Lake 没有解决方案,Apache Parquet 的解决方案会起作用,因为可以根据 Parquet 数据集中存储的数据在 Delta Lake 中创建数据集。

【问题讨论】:

    标签: java scala apache-spark parquet delta-lake


    【解决方案1】:

    是的,这是可能的,而且效果很好。 Delta 对于流式架构有几个优点:

    • 您不会遇到流式工作负载经常出现的“小文件问题” - 您不需要列出所有数据文件来查找新文件(例如 Parquet 或其他数据源) - 所有数据都是记录在事务日志中
    • 您的消费者看不到部分写入,因为 Delta 提供了事务功能
    • 流式工作负载为natively supported by Delta
    • 即使是流式工作负载,您也可以执行 DELETE/UPDATE/MERGE - Parquet 无法做到这一点

    附:你可以只使用.format("delta") 而不是完整的类名

    【讨论】:

    • 非常感谢@Alex Ott 提供的“Delta 原生支持”链接。很清楚我应该如何实施解决方案。
    • 我仍有疑问。在我看到的 Apache Streaming 示例中,使用了 Kafka 或 Kinesis。就我而言,我有自己的分布式事件总线,我需要使用 Java Socket 创建一个到 Spark Streaming 的驱动程序并部署它,并将相应的工件 spark-streaming-my-iot-dbus-drive_2.12 添加到依赖项中。我看到了一些使用 Socket 的示例,但消息采用文本格式。对我来说二进制格式更合适。有可能吗?
    • 有效载荷的格式 - 这是您自己的决定,它实际上是生产者和消费者之间的合同。许多人将 Avro 用于此类事情。关于使用 Kafka 或 Kinesis - 这真的取决于您的要求。通常它们被用作一种缓冲区,允许以更高的速率接收消息(我也看到了 Cassandra),然后由稍慢但更可扩展的系统(如 Spark)处理。从您的问题来看,尚不清楚 Spark 是否会成为直接接收者。如果你有事件总线,我会直接将 spark 插入它而不是使用 Sockets
    • 嗨@Alex Ott,我实施了解决方案,但遇到了一个奇怪的问题。我在stackoverflow.com/questions/70762808 中创建了一个问题。也许你可以看看你是否发现了什么问题。我已经把我的神经元烧坏了,我找不到问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-01
    • 2019-10-06
    • 2020-04-18
    • 2021-07-14
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    相关资源
    最近更新 更多