Подключение к HDFS
Статья описывает подключение к сервису HDFS с помощью командной строки (CLI), WebHDFS API и библиотек HDFS. Вы также можете подключиться к HDFS через веб-интерфейс. Для получения информации о графических интерфейсах HDFS обратитесь к статье Обзор HDFS UI.
Командная строка
Используя CLI, можно получить доступ к HDFS с любого хоста в кластере. Следующие шаги описывают, как подключиться к HDFS с помощью командной строки. Подразумевается, что для кластера уже настроен доступ по SSH и пароль не требуется.
-
Подключитесь к хосту кластера ADH через SSH:
$ ssh <USER>@<HOST>
Здесь:
-
<USER>
— имя пользователя хоста; -
<HOST>
— IP-адрес хоста.
-
-
Когда соединение с хостом установлено, запустите нужную команду HDFS. Например:
$ hdfs dfs -ls /
Пример вывода команды
ls
:Found 4 items drwxrwxrwt - yarn hadoop 0 2023-07-24 13:47 /logs drwxr-xr-x - hdfs hadoop 0 2023-08-03 17:49 /system drwxrwxrwx - hdfs hadoop 0 2023-08-30 19:51 /tmp drwxr-xr-x - hdfs hadoop 0 2023-07-24 13:47 /user
Дополнительную информацию о различиях между командами hadoop fs
, hadoop dfs
и hdfs dfs
можно прочитать в статье Командная строка Hadoop.
Для некоторых команд требуется доступ на уровне администратора (пользователь hdfs
). Если вы попытаетесь войти в систему как пользователь hdfs
, потребуется пароль.
Поскольку пароля по умолчанию для пользователя hdfs
нет, войдите в систему как пользователь root
на локальном хосте.
Это позволит авторизоваться как пользователь hdfs
без пароля.
HTTP REST API
Вы можете получить доступ к HDFS, используя WebHDFS REST API.
Чтобы выполнить запрос с помощью curl или браузера, структурируйте запрос следующим образом:
http://<HOST>:<HTTP_PORT>/webhdfs/v1/<PATH>?<AUTH>op=<COMMAND>
Здесь:
-
<HOST>
— IP-адрес хоста. -
<HTTP_PORT>
— HTTP-порт активной NameNode. -
<PATH>
— директория для выполнения команды. -
<AUTH>
— запрос на аутентификацию в следующем формате:user.name=<USER>&
, где<USER>
— имя пользователя HDFS. Это опциональный параметр. Если этот параметр не указан, запрос будет отправлен от пользователя по умолчанию, если он настроен. В противном случае сервер выдаст ошибку. -
<COMMAND>
— команда файловой системы.
Если у вас включен SSL, замените webhdfs
на swebhdfs
.
Пример запроса на подключение к HDFS для запуска команды ls
может выглядеть так:
$ curl -i "http://127.0.0.1:14000/webhdfs/v1/?user.name=admin&op=LISTSTATUS"
Возможный вывод команды:
HTTP/1.1 200 OK Date: Mon, 04 Sep 2023 11:50:00 GMT Cache-Control: no-cache Expires: Mon, 04 Sep 2023 11:50:00 GMT Date: Mon, 04 Sep 2023 11:50:00 GMT Pragma: no-cache Content-Type: application/json Set-Cookie: hadoop.auth="u=admin&p=admin&t=simple-dt&e=6593757/Hvhgbi/PxjQ="; Path=/; HttpOnly Transfer-Encoding: chunked {"FileStatuses":{"FileStatus":[{"pathSuffix":"logs","type":"DIRECTORY","length":0,"owner":"yarn","group":"hadoop","permission":"1777","accessTime":0,"modificationTime":1690206465850,"blockSize":0,"replication":0},{"pathSuffix":"system","type":"DIRECTORY","length":0,"owner":"hdfs","group":"hadoop","permission":"755","accessTime":0,"modificationTime":1691084968551,"blockSize":0,"replication":0},{"pathSuffix":"tmp","type":"DIRECTORY","length":0,"owner":"hdfs","group":"hadoop","permission":"777","accessTime":0,"modificationTime":1693425076362,"blockSize":0,"replication":0},{"pathSuffix":"user","type":"DIRECTORY","length":0,"owner":"hdfs","group":"hadoop","permission":"755","accessTime":0,"modificationTime":1690206432153,"blockSize":0,"replication":0}]}}
Библиотека libhdfs для С
Чтобы подключиться к удаленному хосту HDFS с помощью библиотеки libhdfs, необходимо настроить среду разработки и установить зависимости. В этой инструкции показано как написать, собрать и запустить программу для подключения к удаленному хосту HDFS.
В примере используются следующие инструменты разработки: текстовый редактор Vi, виртуальная машина с CentOS 7 и компилятор GCC. При использовании других инструментов будет необходимо изменить некоторые шаги.
Подготовительные шаги
Чтобы собрать и запустить следующий пример, установите:
-
ADH (версия ADH на локальном хосте должна совпадать с версией на удаленном хосте). Вы также можете собрать его самостоятельно.
-
Текстовый редактор.
-
Компилятор C.
-
JDK.
-
Библиотеку
libhdfs.so
с заголовочными файлами. Вы также можете собрать библиотеку самостоятельно.
Создание программы на С
В приведенном ниже примере кода создается подключение к удаленному HDFS, выводится подтверждение при успешном подключении и возвращается сообщение об ошибке, если подключиться не удалось. Если вы успешно подключились к HDFS, но соединение вам больше не нужно, завершите его.
#include <hdfs.h> (1)
#include <stdio.h>
int main(int argc, char **argv) {
struct hdfsBuilder *builder = hdfsNewBuilder(); (2)
hdfsBuilderSetNameNode(builder, "hdfs://127.0.0.1:8020"); (3)
hdfsFS fs = hdfsBuilderConnect(builder); (4)
if (fs != NULL) {
printf("Successfully connected to HDFS ");
} else {
printf("Failed to connect to HDFS ");
}
}
1 | Импортируйте библиотеку libhdfs. |
2 | Инициализируйте объект компоновщика для подключения к удаленному HDFS с помощью метода hdfsBuilder . Предпочтительно использовать этот метод вместо устаревшего hdfsConnect . |
3 | Установите параметры для подключения в формате URI hdfs://<NN-IP>:<PORT> , где <NN-IP> — это IP-адрес активной NameNode, а <PORT> — порт службы метаданных NameNode. |
4 | Вызовите builder , чтобы создать соединение. |
Компиляция и запуск
-
Создайте скрипт компиляции для GCC и заполните переменные путей:
#!/bin/bash export HADOOP_HOME=/usr/lib/hadoop (1) export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.382.b05-1.el7_9.x86_64/jre (2) export CLASSPATH=`$HADOOP_HOME/bin/hadoop classpath --glob` (3) export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$JAVA_HOME/jre/lib/amd64/server gcc -std=c99 -lpthread main.c -I$HADOOP_HOME/include -L$HADOOP_HOME/lib/native -lhdfs -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -L$JAVA_HOME/jre/lib/amd64/server -ljvm -o my_hdfs_program (4) ./my_hdfs_program (5)
1 Укажите путь к библиотекам Hadoop. 2 Определите путь к библиотекам JDK. 3 Введите правильный путь CLASSPATH
с помощью команды classpath.4 Скомпилируйте программу, используя правильные пути и дополнительные параметры. 5 Запустите программу. -
Запустите скрипт компиляции:
$ ./<script-name>.sh
Здесь
<script-name>
— название скрипта компиляции.
Java API
Чтобы подключиться к удаленному хосту HDFS с помощью Java API, вам необходимо настроить среду разработки и установить зависимости. В примере ниже создается подключение к удаленному HDFS, выводится подтверждение при успешном подключении и возвращается сообщение об ошибке, если подключиться не удалось.
Для выполнения примера используются следующие инструменты разработки: текстовый редактор Vi, виртуальная машина с CentOS 7 и компилятор Maven. При использовании других инструментов будет необходимо изменить некоторые шаги.
-
Установите Maven.
-
Напишите класс для создания соединения:
package my.example.hdfs; import org.apache.hadoop.conf.Configuration; (1) import org.apache.hadoop.fs.FileSystem; import java.net.URI; public class Main { public static void main(String[] args) throws Exception { String hdfs_uri = "hdfs://127.0.0.1:8020"; (2) Configuration conf = new Configuration(); (3) conf.set("fs.defaultFS", hdfs_uri); try { FileSystem fs = FileSystem.get(URI.create(hdfs_uri), conf); (4) System.out.println("Successfully connected to HDFS "); fs.close(); (5) } catch (Exception e) { System.out.print("Failed to connect to HDFS "); System.out.println(e.getMessage()); } } }
1 Импортируйте необходимые библиотеки. 2 Установите параметры для подключения в формате URI hdfs://<NN-IP>:<PORT>
, где<NN-IP>
— это IP-адрес активной NameNode, а<PORT>
— порт службы метаданных NameNode.3 Инициализируйте объект файловой системы. 4 Вызовите FileSystem.get для создания соединения. 5 Завершите соединение, если оно больше не требуется. -
Создайте файл pom.xml для сборки проекта с помощью Maven.
Пример файла pom.xml<project> <modelVersion>4.0.0</modelVersion> <groupId>my.example.hdfs</groupId> <artifactId>my-hdfs-program</artifactId> <version>0.1.0-SNAPSHOT</version> <packaging>jar</packaging> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-hdfs</artifactId> <version>2.7.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.7.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-core</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>2.7.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.1.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>my.example.hdfs.Main</mainClass> </manifest> </archive> <descriptorRefs> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> </configuration> <executions> <execution> <id>assemble-all</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> <plugin> <!-- Build an executable JAR --> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>3.1.0</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <mainClass>my.example.hdfs.Main</mainClass> </manifest> </archive> </configuration> </plugin> </plugins> </build> </project>
-
Соберите проект:
$ mvn package
-
Запустите Java-класс:
$ java -jar <java-class>.jar
Здесь
<java-class>
— имя Java-программы для подключения к HDFS.