Подключение к HDFS

Статья описывает подключение к сервису HDFS с помощью командной строки (CLI), WebHDFS API и библиотек HDFS. Вы также можете подключиться к HDFS через веб-интерфейс. Для получения информации о графических интерфейсах HDFS обратитесь к статье Обзор HDFS UI.

Командная строка

Используя CLI, можно получить доступ к HDFS с любого хоста в кластере. Следующие шаги описывают, как подключиться к HDFS с помощью командной строки. Подразумевается, что для кластера уже настроен доступ по SSH и пароль не требуется.

  1. Подключитесь к хосту кластера ADH через SSH:

    $ ssh <USER>@<HOST>

    Здесь:

    • <USER> — имя пользователя хоста;

    • <HOST> — IP-адрес хоста.

  2. Когда соединение с хостом установлено, запустите нужную команду 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 REST API

 

Если настройки безопасности включены, метод аутентификации будет отличаться для каждой модели безопасности.

Если включен Kerberos SPNEGO, используйте параметры --negotiate и -u:

$ curl -i --negotiate -u : "http://<HOST>:<HTTP_PORT>/webhdfs/v1/<PATH>?op=<COMMAND>"

Если включена аутентификация с помощью токена делегирования Hadoop, передайте токен вместо имени пользователя:

$ curl -i "http://<HOST>:<HTTP_PORT>/webhdfs/v1/<PATH>?delegation=<TOKEN>&op=..."

Подробней о методах аутентификации читайте в статье Authentication for Hadoop HTTP web-consoles.

Пример запроса на подключение к 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, чтобы создать соединение.

Компиляция и запуск

  1. Создайте скрипт компиляции для 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 Запустите программу.
  2. Запустите скрипт компиляции:

    $ ./<script-name>.sh

    Здесь <script-name> — название скрипта компиляции.

Java API

Чтобы подключиться к удаленному хосту HDFS с помощью Java API, вам необходимо настроить среду разработки и установить зависимости. В примере ниже создается подключение к удаленному HDFS, выводится подтверждение при успешном подключении и возвращается сообщение об ошибке, если подключиться не удалось.

Для выполнения примера используются следующие инструменты разработки: текстовый редактор Vi, виртуальная машина с CentOS 7 и компилятор Maven. При использовании других инструментов будет необходимо изменить некоторые шаги.

  1. Установите Maven.

  2. Напишите класс для создания соединения:

    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 Завершите соединение, если оно больше не требуется.
  3. Создайте файл 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>
  4. Соберите проект:

    $ mvn package
  5. Запустите Java-класс:

    $ java -jar <java-class>.jar

    Здесь <java-class> — имя Java-программы для подключения к HDFS.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней