Как получить доступ к данным Azure с помощью API webhdfs

Мы только начинаем оценивать службу datalake в Azure. Мы создали озеро, и через портал мы можем видеть два общедоступных URL-адреса службы. (Одна - схема https: //, другая - схема adl: //)

В документации datalake указано, что действительно существует два интерфейса: webHDFS REST API и ADL. Итак, я предполагаю, что схема https: // дает мне интерфейс wehHDFS. Однако я не могу найти в Azure больше информации об использовании этого интерфейса.

Я попытался ткнуть данный URL https: // с помощью веб-браузера и curl. Служба отвечает. Ответы представляют собой JSON, что вполне ожидаемо, поскольку datalake является экземпляром Hadoop. Однако я не могу получить доступ к своим файлам [которые я загрузил в наше озеро через портал].

Например, если я выполняю GET в «/foo.txt», ответом будет ошибка ResourceNotFound.

Если я выполняю GET с использованием типичного синтаксиса Hadoop HDFS, «/webhdfs/v1/foo.txt», ответом будет ошибка AuthenticationFailed. Дополнительный текст указывает на отсутствие токена доступа. Это кажется более многообещающим. Однако ничего не могу найти о создании такого токена доступа.

Есть некоторая документация по использованию интерфейса ADL, .NET и Visual Studio, но изначально это не то, что мне нужно.

Любая помощь очень ценится!


person RickS    schedule 04.04.2016    source источник
comment
Не могли бы вы разместить здесь свои curl команды?   -  person vmachan    schedule 04.04.2016


Ответы (1)


Я в долгу перед это сообщение на форуме Мэтью Хикса, в котором описано, как это сделать с curl. Я взял и завернул в PowerShell. Я уверен, что есть много способов добиться этого, но вот один из них работает.

Сначала настройте приложение AAD, чтобы можно было ввести client_id и client_secret, упомянутые ниже. (Предполагается, что вы хотите автоматизировать это, а не использовать интерактивный вход. Если вам нужен интерактивный вход, тогда в сообщении на форуме выше есть ссылка на этот подход.)

Затем заполните настройки в первых 5 строках и запустите следующий сценарий PowerShell:

$client_id = "<client id>";
$client_secret = "<secret>";
$tenant = "<tenant>";
$adlsAccount = "<account>";
cd D:\path\to\curl

#authenticate
$cmd = { .\curl.exe -X POST https://login.microsoftonline.com/$tenant/oauth2/token  -F grant_type=client_credentials       -F resource=https://management.core.windows.net/       -F client_id=$client_id       -F client_secret=$client_secret };
$responseToken = Invoke-Command -scriptblock $cmd;
$accessToken = (ConvertFrom-Json $responseToken).access_token;

#list root folders
$cmd = {.\curl.exe -X GET -H "Authorization: Bearer $accessToken" https://$adlsAccount.azuredatalakestore.net/webhdfs/v1/?op=LISTSTATUS };
$foldersResponse = Invoke-Command -scriptblock $cmd;
#loop through directories directories
(ConvertFrom-Json $foldersResponse).FileStatuses.FileStatus | ForEach-Object { $_.pathSuffix }

#list files in one folder
$cmd = {.\curl.exe -X GET -H "Authorization: Bearer $accessToken" https://$adlsAccount.azuredatalakestore.net/webhdfs/v1/weather/?op=LISTSTATUS };
$weatherResponse = Invoke-Command -scriptblock $cmd;
(ConvertFrom-Json $weatherResponse).FileStatuses.FileStatus | ForEach-Object { $_.pathSuffix }

#download one file
$cmd = {.\curl.exe -L "https://$adlsAccount.azuredatalakestore.net/webhdfs/v1/weather/2007small.csv?op=OPEN" -H "Authorization: Bearer $accessToken" -o d:\temp\curl\2007small.csv };
Invoke-Command -scriptblock $cmd;


#upload one file
$cmd = {.\curl.exe -i -X PUT -L "https://$adlsAccount.azuredatalakestore.net/webhdfs/v1/weather/new2007small.csv?op=CREATE" -T "D:\temp\weather\smallcsv\new2007small.csv" -H "Authorization: Bearer $accessToken" };
Invoke-Command -scriptblock $cmd;
person GregGalloway    schedule 05.04.2016
comment
Чудесно! Между предоставленными ссылками и вашими примерами это начинает проясняться. Как объяснялось, мы начинаем с получения токена авторизации через AAD. После получения токена доступ к сервису осуществляется в соответствии со стандартным синтаксисом HDFS с добавлением заголовка для отправки в токене. Имеет смысл. На этом форуме я добавил дополнительный вопрос: можно ли настроить ваш datalake так, чтобы вообще не требовалась авторизация? - person RickS; 05.04.2016
comment
@RickS, это хороший вопрос. Я не знаю, как настроить анонимный доступ. Если вы в этом разобрались, пожалуйста, напишите здесь. - person GregGalloway; 05.04.2016