首页 > 解决方案 > Spark 事件日志 HDFS 一致性

问题描述

我遇到了这个奇怪的问题,即 Spark 事件日志的长度没有正确更新。例如,我们将查看 file application_1551818805190_0006_1.inprogress

当我使用 时hdfs dfs -ls /var/log/spark/apps/,我看到该文件只有 309 个字节:

[hadoop ~]$ hdfs dfs -ls hdfs:///var/log/spark/apps
-rwxrwx---   2 hadoop spark  138180350 2019-03-05 22:47 hdfs:///var/log/spark/apps/application_1551818805190_0004_1
-rwxrwx---   2 hadoop spark  138184198 2019-03-05 22:57 hdfs:///var/log/spark/apps/application_1551818805190_0005_1
-rwxrwx---   2 hadoop spark        309 2019-03-05 23:59 hdfs:///var/log/spark/apps/application_1551818805190_0006_1.inprogress

但是当我从 HDFS ( hdfs dfs -get) 获取文件并在本地文件系统上执行 ls 时,文件长度实际上是 85695488 字节!我很困惑,因为 Spark EventLoggingListener使用的.hflush()方法应该使所有读者都能看到数据。

当我使用适用于 Hadoop 的 Java API 时,我遇到了同样的问题。除了打开 FSDataInputStream 并使用skip手动计算文件的实际字节长度之外,我还能做些什么吗?

标签: apache-sparkhadoophdfs

解决方案


解决了。事实证明,Spark History Server 的编写器 EventLoggingListener 会将数据“刷新”到 HDFS,但客户端仅在分配了新块时才会刷新。


推荐阅读