Управление каталогами и файлами в Azure Data Lake Storage 2-го поколения с помощью Java

В этой статье показано, как использовать Java для создания каталогов и файлов в учетных записях хранения с иерархическим пространством имен, а также управления ими.

Дополнительные сведения о получении, установке и обновлении списков управления доступом (ACL) для каталогов и файлов см. в разделе Использование Java для управления списками ACL в Azure Data Lake Storage 2-го поколения.

Пакет (Maven) | Примеры | Справочник по API | Сопоставление систем первого и второго поколения | Отправить отзыв

Необходимые компоненты

  • Подписка Azure. См. дополнительные сведения о бесплатной пробной версии Azure.

  • Учетная запись хранения, в которой включено иерархическое пространство имен. Выполните эти инструкции, чтобы создать учетную запись.

Настройка проекта

Чтобы приступить к работе, откройте эту страницу и найдите последнюю версию библиотеки Java. Затем откройте файл pom.xml в текстовом редакторе. Добавьте элемент зависимости, который ссылается на эту версию.

Если вы планируете пройти проверку подлинности клиентского приложения с помощью идентификатора Microsoft Entra, добавьте зависимость в библиотеку удостоверений Azure. Дополнительные сведения см. в клиентской библиотеке удостоверений Azure для Java.

Затем добавьте эти операторы импорта в файл кода:

import com.azure.identity.*;
import com.azure.storage.common.StorageSharedKeyCredential;
import com.azure.core.http.rest.PagedIterable;
import com.azure.core.util.BinaryData;
import com.azure.storage.file.datalake.*;
import com.azure.storage.file.datalake.models.*;
import com.azure.storage.file.datalake.options.*;

Примечание.

Доступ с несколькими протоколами в Data Lake служба хранилища позволяет приложениям использовать API BLOB-объектов и DATA LAKE STORAGE 2-ГО ПОКОЛЕНИЯ API для работы с данными в учетных записях хранения с включенным иерархическим пространством имен (HNS). При работе с возможностями, уникальными для Data Lake Storage 2-го поколения, таких как операции каталогов и списки управления доступом, используйте API Data Lake Storage 2-го поколения, как показано в этой статье.

При выборе API для использования в данном сценарии рассмотрите рабочую нагрузку и потребности приложения, а также известные проблемыи влияние HNS на рабочие нагрузки и приложения.

Авторизация доступа к ресурсам данных и подключение к ним

Для работы с примерами кода в этой статье необходимо создать авторизованный экземпляр DataLakeServiceClient , представляющий учетную запись хранения. Вы можете авторизовать DataLakeServiceClient объект с помощью идентификатора Microsoft Entra, ключа доступа к учетной записи или подписанного URL-адреса (SAS).

Клиентская библиотека удостоверений Azure для Java используется для проверки подлинности приложения с помощью идентификатора Microsoft Entra.

Создайте экземпляр DataLakeServiceClient и передайте новый экземпляр класса DefaultAzureCredential.

static public DataLakeServiceClient GetDataLakeServiceClient(String accountName){
    DefaultAzureCredential defaultCredential = new DefaultAzureCredentialBuilder().build();

    DataLakeServiceClient dataLakeServiceClient = new DataLakeServiceClientBuilder()
        .endpoint("https://" + accountName + ".dfs.core.windows.net")
        .credential(defaultCredential)
        .buildClient();

    return dataLakeServiceClient;
}

Дополнительные сведения об использовании DefaultAzureCredential для авторизации доступа к данным см . в клиентской библиотеке удостоверений Azure для Java.

Создание контейнера

Контейнер выступает в качестве файловой системы для файлов. Контейнер можно создать с помощью следующего метода:

В следующем примере кода создается контейнер и возвращается объект DataLakeFileSystemClient для последующего использования:

public DataLakeFileSystemClient CreateFileSystem(
        DataLakeServiceClient serviceClient,
        String fileSystemName) {

    DataLakeFileSystemClient fileSystemClient = serviceClient.createFileSystem(fileSystemName);

    return fileSystemClient;
}

Создание каталога

Ссылку на каталог в контейнере можно создать с помощью следующего метода:

Следующий пример кода добавляет каталог в контейнер, затем добавляет подкаталог и возвращает объект DataLakeDirectoryClient для последующего использования:

public DataLakeDirectoryClient CreateDirectory(
        DataLakeFileSystemClient fileSystemClient,
        String directoryName,
        String subDirectoryName) {

    DataLakeDirectoryClient directoryClient = fileSystemClient.createDirectory(directoryName);

    return directoryClient.createSubdirectory(subDirectoryName);
}

Переименование или перемещение каталога

Вы можете переименовать или переместить каталог с помощью следующего метода:

Передайте путь к нужному каталогу в качестве параметра. В следующем примере кода показано, как переименовать подкаталог:

public DataLakeDirectoryClient RenameDirectory(
        DataLakeFileSystemClient fileSystemClient,
        String directoryPath,
        String subdirectoryName,
        String subdirectoryNameNew) {

    DataLakeDirectoryClient directoryClient = fileSystemClient
            .getDirectoryClient(String.join("/", directoryPath, subdirectoryName));

    return directoryClient.rename(
            fileSystemClient.getFileSystemName(),
            String.join("/", directoryPath, subdirectoryNameNew));
}

В следующем примере кода показано, как переместить подкаталог из одного каталога в другой каталог:

public DataLakeDirectoryClient MoveDirectory(
        DataLakeFileSystemClient fileSystemClient,
        String directoryPathFrom,
        String directoryPathTo,
        String subdirectoryName) {

    DataLakeDirectoryClient directoryClient = fileSystemClient
            .getDirectoryClient(String.join("/", directoryPathFrom, subdirectoryName));

    return directoryClient.rename(
            fileSystemClient.getFileSystemName(),
            String.join("/", directoryPathTo, subdirectoryName));
}

Отправка файла в каталог

Вы можете передать содержимое в новый или существующий файл с помощью следующего метода:

В следующем примере кода показано, как отправить локальный файл в каталог с помощью uploadFromFile метода:

public void UploadFile(
        DataLakeDirectoryClient directoryClient,
        String fileName) {

    DataLakeFileClient fileClient = directoryClient.getFileClient(fileName);

    fileClient.uploadFromFile("filePath/sample-file.txt");
}

Этот метод можно использовать для создания и отправки содержимого в новый файл или overwritetrue для перезаписи существующего файла.

Добавление данных в файл

Данные можно добавить в файл с помощью следующего метода:

В следующем примере кода показано, как добавить данные в конец файла, выполнив следующие действия:

  • DataLakeFileClient Создайте объект для представления файлового ресурса, с которым вы работаете.
  • Отправьте данные в файл с помощью DataLakeFileClient.append метода.
  • Завершите отправку DataLakeFileClient.flush , вызвав метод для записи ранее отправленных данных в файл.
public void AppendDataToFile(
        DataLakeDirectoryClient directoryClient) {

    DataLakeFileClient fileClient = directoryClient.getFileClient("sample-file.txt");
    long fileSize = fileClient.getProperties().getFileSize();

    String sampleData = "Data to append to end of file";
    fileClient.append(BinaryData.fromString(sampleData), fileSize);

    fileClient.flush(fileSize + sampleData.length(), true);
}

Скачивание из каталога

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

  • DataLakeFileClient Создайте объект для представления файла, который требуется скачать.
  • DataLakeFileClient.readToFile Используйте метод для чтения файла. В этом примере параметр trueприсваивается параметруoverwrite, которому перезаписывается существующий файл.
public void DownloadFile(
        DataLakeDirectoryClient directoryClient,
        String fileName) {

    DataLakeFileClient fileClient = directoryClient.getFileClient(fileName);

    fileClient.readToFile("filePath/sample-file.txt", true);
}

Вывод содержимого каталогов

Вы можете перечислить содержимое каталога с помощью следующего метода и перечисления результата:

Перечисление путей в результате может выполнять несколько запросов к службе при выборе значений.

В следующем примере кода печатаются имена каждого файла, расположенного в каталоге:

public void ListFilesInDirectory(
        DataLakeFileSystemClient fileSystemClient,
        String directoryName) {

    ListPathsOptions options = new ListPathsOptions();
    options.setPath(directoryName);

    PagedIterable<PathItem> pagedIterable = fileSystemClient.listPaths(options, null);

    java.util.Iterator<PathItem> iterator = pagedIterable.iterator();
    PathItem item = iterator.next();

    while (item != null) {
        System.out.println(item.getName());

        if (!iterator.hasNext()) {
            break;
        }
        item = iterator.next();
    }

}

Удаление каталога

Вы можете удалить каталог с помощью одного из следующих методов:

В следующем примере кода используется deleteWithResponse для удаления каталога nonempty и всех путей под каталогом:

public void DeleteDirectory(
        DataLakeFileSystemClient fileSystemClient,
        String directoryName) {

    DataLakeDirectoryClient directoryClient = fileSystemClient.getDirectoryClient(directoryName);

    // Set to true to delete all paths beneath the directory
    boolean recursive = true;

    directoryClient.deleteWithResponse(recursive, null, null, null);
}

См. также