2016-04-04 10 views
1

Azureでデータレークサービスの評価を始めます。私たちは湖を作りました。そして、ポータルを介して、サービスの2つのパブリックURLを見ることができます。webhdfs APIを使用してAzureデータレックにアクセスする方法

datalakeのドキュメントには、実際にはwebHDFS REST APIとADLという2つのインタフェースがあると記載されています。だから、私はhttps://体系が私にwehHDFSインタフェースを与えると仮定しています。しかし、Azureでは、このインタフェースの使用について、これ以上の情報はありません。

Webブラウザとカールを使用して、指定されたhttps:// URLでポーズを試みました。サービスが応答しています。回答はJSONです。データレークはHadoopのインスタンスなので、期待通りです。しかし、私はファイルにアクセスできないようです(私はポータル経由で私たちの湖にアップロードしました)。

たとえば、 "/foo.txt"に対してGETを実行すると、返信はエラー、ResourceNotFoundになります。

一般的なHadoop HDFSの構文 "/webhdfs/v1/foo.txt"を使用してGETを実行した場合、その応答はエラーAuthenticationFailedです。追加のテキストは、不足しているアクセストークンを示します。これはより有望なようです。しかし、そのようなアクセストークンを生成することについて何も見つけることができません。

ADLインターフェイスと.NETとVisual Studioの使用に関するいくつかのドキュメントがありますが、これは私が最初に望むものではありません。

ご迷惑をおかけして申し訳ありません。

+0

ここで 'curl'コマンドを投稿できますか? – vmachan

答えて

2

私はcurlでこれを行う方法を概説したMatthew Hicksによってthis forum postに借りています。私はそれを取り出して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構文に従ってアクセスされ、トークンで送信されるヘッダーが追加されます。意味をなさないそのフォーラムでは、私は追加の質問を追加しました。あなたのデータ受信を許可を全く必要としないように設定できますか? – RickS

+0

@RickSそれは良い質問です。私は匿名アクセスを設定する方法を知らない。あなたがそれを理解したら、ここに投稿してください。 – GregGalloway

関連する問題