首页
/ Apache Parquet Hadoop 1.14.1 在 Windows 11 上的文件锁问题分析与解决方案

Apache Parquet Hadoop 1.14.1 在 Windows 11 上的文件锁问题分析与解决方案

2025-06-28 12:14:17作者:范靓好Udolf

问题背景

在 Windows 11 22H2 操作系统上使用 Apache Parquet Hadoop 1.14.1 版本时,开发人员遇到了一个文件锁定的问题。具体表现为:当使用 ParquetRewriter 类完成对 Parquet 文件的处理后,原始输入文件仍被系统锁定,导致无法删除这些文件。

问题现象

开发人员在使用 ParquetRewriter 进行 Parquet 文件重写操作后,尝试删除原始输入文件时,系统抛出以下异常:

java.nio.file.FileSystemException: test\sample\dayhour-150-0-6a57c328-8610-46f8-bf7e-311f8605def0.parquet: This process cannot access the file because the file is being used by another process

技术分析

经过深入分析,发现问题根源在于 ParquetRewriter 类的实现中。在 ParquetRewriter 处理文件块的过程中,虽然使用了 try-with-resources 语句来确保资源的自动关闭,但在实际处理流程中存在资源未及时释放的情况。

具体来说,在 ParquetRewriter 类的第 256 行代码处:

reader = inputFiles.poll();

这段代码从输入文件队列中获取下一个读取器,但没有先关闭前一个读取器。这种实现方式在 Windows 系统上尤为敏感,因为 Windows 对文件锁的管理比 Unix/Linux 系统更为严格。

解决方案

正确的做法应该是在获取新读取器之前,先关闭当前已打开的读取器。修改后的代码应该如下:

if (reader != null) {
    reader.close();
}
reader = inputFiles.poll();

这种修改确保了:

  1. 在获取新文件读取器前,先释放当前文件的资源
  2. 添加了 null 检查以避免空指针异常
  3. 符合 Java 资源管理的最佳实践

影响范围

此问题主要影响以下环境:

  • Windows 操作系统(特别是 Windows 11 22H2)
  • 使用 Apache Parquet Hadoop 1.14.1 版本
  • 需要处理完成后删除原始 Parquet 文件的场景

最佳实践建议

对于需要在文件处理完成后进行清理操作的场景,建议:

  1. 确保所有文件资源在使用完毕后立即关闭
  2. 在删除文件前添加适当的延迟,确保系统完全释放文件锁
  3. 考虑使用 try-with-resources 语句管理所有文件资源
  4. 在 Windows 环境下进行充分的文件操作测试

结论

文件资源管理是跨平台应用开发中需要特别注意的问题。这个案例展示了 Windows 和 Unix/Linux 系统在文件锁定行为上的差异,以及如何在 Java 中正确处理文件资源以确保跨平台的兼容性。该修复已通过 pull request 提交并合并,将在 Apache Parquet 的下一个版本中发布。

登录后查看全文
热门项目推荐
相关项目推荐