Мне нужно синхронизировать некоторые записи в HDFS из нескольких пакетных приложений.Для этого я решил использовать атомарность rename
api, используя следующий псевдокод:
syncDir = new Path("/foo/bar")
currentVersion = getLatestVersion(syncDir) // e.g. Path("/foo/bar/42/")
inpuData = readData()
outputData = transform(inpuData)
nextVersion = getNextVersionPath(currentVersion) // Path("/foo/bar/43)
if(fileSystem.rename(currentVersion, nextVersion))
saveData(outputData)
done
else
if (exceeded max retries) fail
else do all over again
Несколько замечаний:
- простота, корректность и надежность являются главными приоритетами
- желательно не интегрировать с какой-либо внешней системой, кроме HDFS (даже не zookeeper)
- взаимное выполнение будет (очень) редким
- удаление будет редким, и общеестоимость повторных попыток приемлема
- все в порядке, если процесс завершается с ошибкой от
rename
до saveData
, это нормально, если процесс запускается до завершения предыдущего процесса saveData
фактический код синхронизации будет отправлен в качестве клиентской библиотеки всем потребляющим (java / python) приложениям
- данный псевдокод относится только к синхронизациилогика, а ETL - это просто демонстрация
Мне было интересно, если это злоупотребление API rename
?В документации говорится, что rename
является атомарным, потому что:
[переименовано] часто используется для реализации блокировки / монопольного доступа между процессами в кластере
Но я не являюсьуверен в этой конкретной реализации.
Кроме того, может ли это иметь неприятные последствия с учетом приведенных выше замечаний?