Использование Java для управления каталогами и файлами в Azure Data Lake Storage
В этой статье показано, как использовать Java для создания каталогов и файлов в учетных записях хранения с иерархическим пространством имен, а также управления ими.
Сведения о том, как получить, задать и обновить списки управления доступом (ACL) каталогов и файлов, см. в статье "Использование". Java для управления списками управления доступом в Azure Data Lake Storage.
Пакет (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 Storage позволяет приложениям использовать 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");
}
Этот метод можно использовать для создания и отправки содержимого в новый файл или overwrite
true
для перезаписи существующего файла.
Добавление данных в файл
Данные можно добавить в файл с помощью следующего метода:
В следующем примере кода показано, как добавить данные в конец файла, выполнив следующие действия:
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();
}
}
Удаление каталога
Вы можете удалить каталог с помощью одного из следующих методов:
- DataLakeDirectoryClient.delete
- DataLakeDirectoryClient.deleteIfExists
- DataLakeDirectoryClient.deleteWithResponse
В следующем примере кода используется 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);
}