2016-04-04 25 views
1

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

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

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

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

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

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

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

+0

Не могли бы вы разместить здесь свои команды 'curl'? – vmachan

ответ

2

Я благодарен this forum post от Matthew Hicks, который изложил, как это сделать, с curl. Я взял его и завернул в PowerShell. Я уверен, что есть много способов сделать это, но вот тот, который работает.

Первый setup an AAD application, чтобы вы могли заполнить 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; 
+0

Замечательно! Между предоставленными ссылками и вашими примерами он начинает уточняться. Как объяснено, мы начинаем с получения маркера авторизации через AAD. Как только маркер получен, доступ к службе осуществляется в соответствии с синтаксисом HDFS на складе, с добавлением заголовка для отправки в токен. Имеет смысл. На этом форуме я добавил дополнительный вопрос: может ли ваш datalake быть настроен, чтобы вообще не требовать авторизации? – RickS

+0

@RickS это хороший вопрос. Я не знаю, как настроить анонимный доступ. Если вы это выясните, пожалуйста, отправьте сообщение здесь. – GregGalloway