寻找一种方法来连续处理写入hdfs的文件

时间:2016-12-01 14:21:51

标签: hadoop apache-spark hdfs apache-flink bigdata

我正在寻找一种能够:

的工具
  1. 监视新文件的hdfs dir并在它们出现时对其进行处理。
  2. 它还应该在作业/应用程序开始工作之前处理目录中的文件。
  3. 它应该有检查点,以便在重新启动时从它离开的地方继续。
  4. 我查看了apache spark:它可以读取新添加的文件,并且可以处理重新启动以从它离开的地方继续。我无法找到一种方法使它也处理同一作业范围内的旧文件(因此只有1和3)。

    我看了一下apache flink:它确实处理了新旧文件。但是,一旦重新启动作业,它将再次开始处理所有作业(1和2)。

    这是一个非常常见的用例。我错过了火花/叮当的东西,这使得它成为可能吗?还有其他工具可以在这里使用吗?

3 个答案:

答案 0 :(得分:5)

使用Flink流式传输,您可以完全按照建议处理目录中的文件,当您重新启动时,它将从停止的位置开始处理。它被称为连续文件处理。

您唯一需要做的就是1)为您的工作启用检查点; 2)启动您的计划:

    Time period = Time.minutes(10)
    env.readFile(inputFormat, "hdfs:// … /logs",
                 PROCESS_CONTINUOUSLY, 
                 period.toMilliseconds, 
                 FilePathFilter.createDefaultFilter())

这个功能相当新,在dev邮件列表中有一个关于如何进一步改进其功能的积极讨论。

希望这有帮助!

答案 1 :(得分:1)

我建议您稍微修改文件摄取并合并Kafka,这样每次在HDFS中放入新文件时,都会在Kafka队列中放入一条消息。然后使用Spark流从队列中读取文件名,然后从hdfs和process中读取文件。

检查指点是一种真正的痛苦,也不能保证你想要的东西。带有spark的Kafka将能够保证一次语义。

Flume有一个SpoolDirSource,你也可以查看它。

答案 2 :(得分:1)

最好的方法是维护状态机。维护包含已处理的所有文件的表或文件。

启动时的应用程序读取文件列表并在set / map中保持相同。任何已处理的新文件/旧文件都可以查看和验证。

此外,摄取文件夹需要维护文件的某些状态。像已经处理的文件一样用一些ext重命名。失败的文件被移动到失败的文件夹,拒绝被拒绝的文件夹。等

你可以使用spark / flink来做所有这些......技术不是瓶颈吗