Режим локального чтения данных на HDFS¶
В HDFS чтение обычно проходит через DataNode. Таким образом, когда клиент запрашивает DataNode для чтения файла, DataNode считывает этот файл с диска и отправляет данные клиенту через сокет TCP. Так называемое “локальное чтение” читает в обход DataNode, позволяя клиенту непосредственно прочитать файл. Очевидно, что это возможно только в тех случаях, когда клиент находится вместе с данными. Локальное чтение обеспечивают значительное повышение производительности для многих приложений.
Необходимые компоненты¶
Для настройки локального чтения данных необходимо включить libhadoop.so. Подробные сведения о включении библиотеки см. в “Native Libraries”.
Настройка локального чтения данных на HDFS¶
Для настройки локального чтения данных на HDFS, необходимо в файл hdfs-site.xml добавить свойства, приведенные в таблице. Локальное чтение данных должно быть настроено как для DataNode, так и для клиента.
Свойство | Значение | Описание |
---|---|---|
dfs.client.read. shortcircuit | true | При значении true включается режим локального чтения данных |
dfs.domain.socket. path | /var/lib/hadoop- hdfs/dn_socket | Путь к сокету домена. В сообщениях при локальном чтении данных используется сокет домена UNIX. Это особый путь в файловой системе, позволяющий связываться клиенту и DataNodes. Необходимо установить путь к этому сокету. DataNode должен иметь возможность создать этот путь. С другой стороны, создание этого пути не должно быть возможным для любого пользователя, кроме пользователя hdfs или root. По этой причине часто используются пути в /var/run или /var/lib |
dfs.client.domain. socket.data.traffic | false | Контролирует, будет ли обычный трафик данных передаваться через сокет домена UNIX. Функция не была сертифицирована релизами ADH, поэтому рекомендуется установить значение false |
dfs.client.use.legacy. blockreader.local | false | Установка значения false указывает, что используется новая версия локального чтения (на основе HDFS-347). Эта версия поддерживается и рекомендуется для использования с ADH. Значение true означает, что используется старый режим локального чтения |
dfs.datanode.hdfs- blocks-metadata. enabled | true | Логический тип данных, который обеспечивает поддержку на стороне сервера DataNode для экспериментального DistributedFileSystem#getFileVBlockStorageLocations API |
dfs.client.file-block- storage-locations. timeout | 60 | Таймаут для параллельных RPC, сделанных в DistributedFileSystem#getFileBlockStorageLocations (в секундах). Это свойство устарело, но по-прежнему поддерживается для обратной совместимости |
dfs.client.file-block- storage-locations. timeout.millis | 60000 | Таймаут для параллельных RPC, сделанных в DistributedFileSystem#getFileBlockStorageLocations (в миллисекундах). Это свойство заменяет dfs.client.file-block-storage-locations.timeout и предлагает более точный уровень детализации |
dfs.client.read. shortcircuit.skip. checksum | false | Если этот параметр конфигурации установлен локальное чтение будет пропускать контрольную сумму файлов. Обычно это не рекомендуется, но может быть полезно для специальных настроек. Может пригодиться, если есть собственные контрольные суммы файлов вне HDFS |
dfs.client.read. shortcircuit.streams. cache.size | 256 | DFSClient поддерживает кэш недавно открытых файловых дескрипторов. Параметр управляет размером кэша. При установке значения выше указанного будут использоваться дополнительные дескрипторы файлов, но они могут обеспечить лучшую производительность при рабочей нагрузке с большим количеством запросов |
dfs.client.read. shortcircuit.streams. cache.expiry.ms | 300000 | Контролирует минимальный промежуток времени нахождения файловых дескрипторов в контексте кэша клиента, прежде чем они могут быть закрыты (в миллисекундах) |
XML для вышеуказанных записей:
<configuration>
<property>
<name>dfs.client.read.shortcircuit</name>
<value>true</value>
</property>
<property>
<name>dfs.domain.socket.path</name>
<value>/var/lib/hadoop-hdfs/dn_socket</value>
</property>
<property>
<name>dfs.client.domain.socket.data.traffic</name>
<value>false</value>
</property>
<property>
<name>dfs.client.use.legacy.blockreader.local</name>
<value>false</value>
</property>
<property>
<name>dfs.datanode.hdfs-blocks-metadata.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.client.file-block-storage-locations.timeout.millis</name>
<value>60000</value>
</property>
<property>
<name>dfs.client.read.shortcircuit.skip.checksum</name>
<value>false</value>
</property>
<property>
<name>dfs.client.read.shortcircuit.streams.cache.size</name>
<value>256</value>
</property>
<property>
<name>dfs.client.read.shortcircuit.streams.cache.expiry.ms</name>
<value>300000</value>
</property>
</configuration>