У меня есть 2 задания (разные экземпляры JVM), которые пытаются создать один и тот же файл.
В некоторых крайних случаях 2 задания одновременно проверяют существование файла и пытаются создать его точно в одно и то же время.
Мой код:
val hdfs: FileSystem = FileSystem.get(sparkContext.hadoopConfiguration)
val path: Path = new Path(filePath)
if(!hdfs.exists(path)) {
hdfs.create(path, false).close()
// next some work which might be done only by the job who really created file.
}
И поэтому оба задания одновременно обнаружат, что файл не существует, и попытаются его создать. Использование значения false
для функции FSDataOutputStream create(Path f, boolean overwrite)
недостаточно, поскольку оно не предупреждает, был ли файл создан или нет: нет выданного исключения, нет возвращаемого логического флага, если файл был создан .. ничего.
Не могли бы вы предложить мне, как выйти из этого вопроса?
Спасибо.