Я настраиваю распределенный HBase на HDFS и пытаюсь понять поведение системы во время операций чтения.
Вот как я понимаю высокоуровневые шаги операции чтения.
- Клиент подключается к NameNode, чтобы получить список DataNodes, которые содержат реплики интересующих его строк.
- Отсюда клиент кэширует список узлов данных и начинает напрямую обращаться к выбранному узлу данных, пока ему не потребуются другие строки из другого узла данных, и в этом случае он снова запрашивает узел имени.
Мои вопросы заключаются в следующем:
- Кто выбирает лучшую реплику DataNode для связи? Как клиент выбирает «ближайшую» реплику? Возвращает ли NameNode список относительных узлов данных в отсортированном порядке?
- Каковы сценарии (если есть), когда клиент переключается на другой узел данных, который запросил строки? Например, если один из DataNode становится перегруженным/медленным, может ли клиентская библиотека установить связь с другим DataNode из списка, возвращаемого NameNode?
- Есть ли вероятность получения устаревших данных с одной из реплик? Например, клиент получил список DataNodes и начал чтение с одного из них. Тем временем от другого клиента к NameNode поступает запрос на запись. У нас есть dfs.replication == 3 и dfs.replication.min = 2. NameNode считает запись успешной после сброса на диск на 2 из 3 узлов, в то время как первый клиент читает с 3-го узла и не знает (пока), что есть другая запись, которая была совершена?
- Hadoop поддерживает ту же политику чтения при поддержке HBase?
Спасибо