我正在寻找一种能够:
的工具我查看了apache spark:它可以读取新添加的文件,并且可以处理重新启动以从它离开的地方继续。我无法找到一种方法使它也处理同一作业范围内的旧文件(因此只有1和3)。
我看了一下apache flink:它确实处理了新旧文件。但是,一旦重新启动作业,它将再次开始处理所有作业(1和2)。
这是一个非常常见的用例。我错过了火花/叮当的东西,这使得它成为可能吗?还有其他工具可以在这里使用吗?
答案 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来做所有这些......技术不是瓶颈吗