#hadoop #hdfs #datanode
Вопрос:
В Apache HDFS, когда запускается код данных, он регистрируется с именем. И через некоторое время появляется отчет о блоке (не связанный с регистром). Я не до конца понял код, но мне кажется, что NameNode обрабатывает код данных, который не отправил свой отчет о блоке, так же, как и все другие коды данных, которые уже сообщили. Я получаю эту подсказку, потому что логика регистра DatanodeManger не помечает код данных как особое состояние, подобное NOT_REPORTED
.
Таким образом, клиент HDFS сможет выполнить чтение/запись в новом коде данных до того, как завершит отчет в коде имени. Давайте обсудим, является ли код данных свежим.
Если код данных свежий (т. е. в нем все равно не хранятся блоки), его можно безопасно использовать для чтения/записи. Там нечего читать. И записанные блоки должны быть сообщены в отчете о блоке в NameNode позже.
Если код данных НЕ является свежим (т. Е. в этом коде данных есть данные, он каким-то образом отключился и снова подключился к Сети), в метаданных на стороне именного кода может быть пробел, где некоторые блоки существуют/исчезли из кода данных, но именной код еще не знает. В именном коде все еще хранятся устаревшие метаданные о местоположении блока из предыдущего отчета (если таковые имеются). Приведет ли это к несоответствиям, как показано ниже (конечно, многие другие крайние случаи)?
- NameNode инструктирует клиента считывать данные из этого DataNode, но на самом деле блок исчез.
- NameNode указывает клиенту записать в этот код данных, но блок фактически существует.
Если эти несоответствия действительно устранены, то что я упускаю? Или, если эти несоответствия не имеют значения, то почему?
Ценю это, если кто-нибудь сможет объяснить логику в дизайне или указать мне на соответствующий код. Заранее спасибо!