我遇到了一个奇怪的问题,即Spark事件日志的长度未正确更新。例如,我们将查看文件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()
方法,该方法应该使数据对所有读者可见。
当我将Java API用于Hadoop时遇到相同的问题。除了打开FSDataInputStream并使用skip
手动计算文件的实际字节长度外,我还能做些什么吗?
答案 0 :(得分:0)
已解决。事实证明,Spark历史记录服务器的编写器EventLoggingListener会将数据“刷新”到HDFS,但是客户端只有在分配了新块后才会刷新。