Деление данных (деление Файла на Блок), это физически верное деление
Разделение и блок HDFS - это отношения один ко многим;
Блок HDFS - это физическое представление данных, а разделение - логическое представление данных в блоке.
В случае локальности данных программа также считывает небольшое количество данных с удаленных узлов, поскольку строки обрезаются на разные блоки.
когда вы читаете файл, он выглядит так
Клиент открывает файл, вызывая метод open () объекта FileSystem (соответствует файловой системе HDFS и вызывая объект DistributedFileSystem) (то есть первый шаг на рисунке). DistributedFileSystem вызывает NameNode через вызов RPC (удаленный вызов процедуры), чтобы получить это. Расположение файла первых нескольких блоков файла (шаг 2). Для каждого блока namenode возвращает информацию об адресе всех namenode, которые имеют эту резервную копию блока (отсортировано по расстоянию от клиента в сети топологии кластера. Как выполнить топологию сети в кластере Hadoop, см. Далее) .
Если клиент сам является датодой (если клиент является mapreduce
задача) и сам датодет имеет требуемый блок файлов, клиент
читает файл локально.
После того, как вышеупомянутые шаги выполнены, DistributedFileSystem возвратит FSDataInputStream (поддержка поиска файлов), клиент может читать данные из FSDataInputStream. FSDataInputStream оборачивает класс DFSInputSteam, который обрабатывает операции ввода-вывода для наменодов и датоданов.
Затем клиент выполняет метод read () (шаг 3), и DFSInputStream (который уже хранит информацию о местоположении первых нескольких блоков файла для чтения) подключается к первому датододу (то есть самому последнему датододу ) чтобы получить данные. При повторном вызове метода read () (четвертый и пятый этапы) данные в файле передаются клиенту. Когда читается конец блока, DFSInputStream закрывает поток, указывающий на блок, и вместо этого находит информацию о местоположении следующего блока, а затем повторно вызывает метод read () для продолжения потоковой передачи блока.
Эти процессы прозрачны для пользователя, и пользователю кажется, что это непрерывная потоковая передача всего файла.
Когда весь файл прочитан, клиент вызывает метод close () в FSDataInputSteam, чтобы закрыть поток ввода файла (шаг 6).