链接时 Spark 流作业失败

Spark streaming jobs fail when chained

我在 Hadoop 集群上 运行 链中的几个 Spark Streaming 作业(一个在前一个作业的输出文件夹中寻找输入),使用 HDFS,运行在 Yarn-cluster 模式下。

job 1 --> reads from folder A outputs to folder A'
job 2 --> reads from folder A'outputs to folder B
job 3 --> reads from folder B outputs to folder C
...

当 运行 作业独立时它们工作得很好。

但是当他们都在等待输入时,我将一个文件放在文件夹 A 中,job1 的状态将从 运行 接受更改为失败。

我无法在使用本地 FS 时重现此错误,只有当 运行 在群集上(使用 HDFS)时才会重现此错误

Client: Application report for application_1422006251277_0123 (state: FAILED)
     INFO Client: 
     client token: N/A
     diagnostics: Application application_1422006251277_0123 failed 2 times due to AM Container for appattempt_1422006251277_0123_000002 exited with  exitCode: 15 due to: Exception from container-launch.
     Container id: container_1422006251277_0123_02_000001
   Exit code: 15

即使 Mapreduce 忽略以 .或者 _,Spark Streaming 没有。

问题是,当文件正在被复制或处理或其他任何情况下,并且在 HDFS 上找到文件的踪迹时(即 "somefilethatsuploading.txt.tmp")Spark 将尝试处理它。

当进程开始读取文件时,文件已经消失或尚未完成。

这就是进程不断崩溃的原因。

忽略以 . 开头的文件。或 _ 或以 .tmp 结尾修复了此问题。

加法: 我们一直对链式工作有疑问。似乎只要 Spark 注意到一个文件(即使它没有完全写入),它就会尝试处理它,而忽略所有其他数据。文件重命名操作通常是 atomic 并且应该可以防止出现问题。