【问题标题】:Spark Multiple file processingSpark 多文件处理
【发布时间】:2017-06-17 02:00:31
【问题描述】:

我有多个 Java 进程。每个进程将生成一个数据文件,该文件将定期包含新数据。

我需要 Spark 来读取这些文件并将数据转储到数据库中。 关于上述要求,我有以下问题-

  1. Spark 有什么方法可以知道它已经处理了 1000 条记录,并且每次选择要处理的文件时都必须从 1001 开始?
  2. 或者我是否必须在 Spark 处理 1000 条记录后清除文件,并且每次文件应仅包含未处理的记录。在这种情况下,如何在同一个文件中读取和写入记录。

由于我不断生成数据,我不能等待 Spark 完成其工作,然后允许文件加载新数据。

【问题讨论】:

    标签: java apache-spark


    【解决方案1】:

    阅读您的问题后,我认为您应该使用 Spark Streaming 并指定 HDFS/S3、Kafka 或 Flume 作为您的来源。

    最好的方法是更改​​ Java 进程以在 Kafka 中发布记录并编写 Spark 流代码来读取这些记录。

    您可以在此处阅读更多详细信息:-

    https://spark.apache.org/docs/latest/streaming-programming-guide.html

    如果这是不可能的,你可以做的一件事是检查每个文件的最后修改日期,并只读取最后修改日期小于当前时间 2 分钟的文件。如果当前日期时间是 06/15/2017 8:00 AM 您需要确保您的代码仅读取上次修改日期小于 06/15/2017 07:58 AM 的文件。通过这种方式,您可以确保您只读取那些没有被 Java 进程处理的文件。即您当前未在其中附加新数据。

    您只会读取过去 2 分钟内没有任何活动的文件。 2分钟的时间间隔是可变的,您可以根据您的代码逻辑进行更改。

    【讨论】:

      【解决方案2】:

      谢谢,考虑到使用基于上次修改时间戳读取文件的逻辑并不能解决我对到达文件中应该处理的记录的要求。

      我发现的一种方法是使用 Java 1.7 引入的 SeekableByteChannel,您可以使用它跟踪文件中写入新记录的位置并将其传递给 Spark 层。然后 Spark 可以从该位置读取记录并进行处理。

      【讨论】:

      • 我假设您只会读取一次文件。如果这是真的,那么您不需要从特定位置读取文件。只有当进程停止写入该文件时,您才会读取该文件。
      • 您是从 HDFS 读取这些文件吗?你可以使用水槽和火花流吗?
      • 不,我有一些限制,因为我无法通过 Kafka 集成我的流程。使用火花流是次要的。我认为我不需要使用,因为我可以使用 Spark RDD 读取文件蜜蜂。正如我所说,这个文件将不断获取新数据,我的 Spark 程序必须不断从同一个文件中读取新数据
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-05
      • 2016-05-26
      • 2018-03-19
      • 2020-07-30
      • 1970-01-01
      相关资源
      最近更新 更多