Hadoop - использование Hdfs rename () для оптимистической блокировки между приложениями - PullRequest
0 голосов
/ 11 мая 2019

Мне нужно синхронизировать некоторые записи в 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 является атомарным, потому что:

[переименовано] часто используется для реализации блокировки / монопольного доступа между процессами в кластере

Но я не являюсьуверен в этой конкретной реализации.

Кроме того, может ли это иметь неприятные последствия с учетом приведенных выше замечаний?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...