如何使用webhdfs API访问Azure datalake

如何使用webhdfs API访问Azure datalake,azure,hadoop,curl,webhdfs,azure-data-lake,Azure,Hadoop,Curl,Webhdfs,Azure Data Lake,我们刚刚开始评估Azure上的datalake服务。我们创建了lake,通过门户我们可以看到该服务的两个公共URL。(一个是https://方案,另一个是adl://方案) datalake文档说明确实有两个接口:webHDFS REST API和ADL。因此,我假设https://scheme为我提供了wehHDFS接口。但是,我在Azure上找不到有关使用此接口的更多信息 我试着用web浏览器和curl戳给定的https://URL。服务正在响应。回复是JSON,这是意料之中的,因为data

我们刚刚开始评估Azure上的datalake服务。我们创建了lake,通过门户我们可以看到该服务的两个公共URL。(一个是https://方案,另一个是adl://方案)

datalake文档说明确实有两个接口:webHDFS REST API和ADL。因此,我假设https://scheme为我提供了wehHDFS接口。但是,我在Azure上找不到有关使用此接口的更多信息

我试着用web浏览器和curl戳给定的https://URL。服务正在响应。回复是JSON,这是意料之中的,因为datalake是Hadoop的一个实例。然而,我似乎无法访问我的文件[我通过门户网站上传到我们的湖中]

例如,如果我访问了“/foo.txt”,那么回复是一个错误,ResourceNotFound

如果我使用典型的Hadoop HDFS语法“/webhdfs/v1/foo.txt”执行GET,则回复为错误,AuthenticationFailed。其他文本表示缺少访问令牌。这似乎更有希望。但是,找不到有关生成此类访问令牌的任何信息

有一些关于使用ADL接口以及.NET和Visual Studio的文档,但这不是我最初想要的

非常感谢任何帮助

我要感谢Matthew Hicks,他概述了如何使用
curl
实现这一点。我把它包在PowerShell里。我相信有很多方法可以做到这一点,但这里有一个有效的方法

首先,您可以填写下面提到的客户id和客户机密。(假设您希望自动执行此操作,而不是交互式登录。如果您希望交互式登录,则在上面的论坛帖子中会有指向该方法的链接。)

然后填写前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;
$client_id=”“;
$client_secret=“”;
$tenant=“”;
$adlsAccount=“”;
cd D:\path\to\curl
#鉴定
$cmd={.\curl.exe-X POSThttps://login.microsoftonline.com/$tenant/oauth2/token-F grant\u type=客户端\u凭据-F资源=https://management.core.windows.net/       -F client_id=$client_id-F client_secret=$client_secret};
$responseToken=Invoke命令-scriptblock$cmd;
$accessToken=(从Json$responseToken转换而来);
#列出根文件夹
$cmd={.\curl.exe-X GET-H“Authorization:Bearer$accessToken”https://$adlsAccount.azuredatalakestore.net/webhdfs/v1/?op=LISTSTATUS};
$foldersResponse=Invoke命令-scriptblock$cmd;
#循环浏览目录
(ConvertFrom Json$foldersResponse).FileStatuses.FileStatus | ForEach对象{$\.pathSuffix}
#在一个文件夹中列出文件
$cmd={.\curl.exe-X GET-H“Authorization:Bearer$accessToken”https://$adlsAccount.azuredatalakestore.net/webhdfs/v1/weather/?op=LISTSTATUS};
$weatherResponse=Invoke命令-scriptblock$cmd;
(ConvertFrom Json$weatherResponse).FileStatuses.FileStatus | ForEach对象{$\ uUx.pathSuffix}
#下载一个文件
$cmd={.\curl.exe-L“https://$adlsAccount.azuredatalakestore.net/webhdfs/v1/weather/2007small.csv?op=OPEN“-H”授权:持有者$accessToken“-o d:\temp\curl\2007small.csv};
调用命令-scriptblock$cmd;
#上传一个文件
$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”授权:承载者$accessToken“};
调用命令-scriptblock$cmd;

你能在这里发布你的
curl
命令吗?太好了!在提供的链接和您的示例之间,它开始变得清晰起来。如前所述,我们首先通过AAD获取授权令牌。一旦获得一个令牌,就可以按照stockhdfs语法访问服务,并在令牌中添加发送头。有道理。在那个论坛上,我又补充了一个问题:你的datalake是否可以配置为完全不需要任何授权?@RickS这是个好问题。我不知道如何设置匿名访问。如果你弄明白了,请发回这里。