복붙노트

[HADOOP] webhdfs API를 사용하여 Azure datalake에 액세스하는 방법

HADOOP

webhdfs API를 사용하여 Azure datalake에 액세스하는 방법

Azure에서 데이터 수신 서비스를 평가하기 시작했습니다. 우리는 호수를 만들었고 포털을 통해 우리는 서비스에 대한 두 개의 공개 URL을 볼 수 있습니다. (하나는 https : // 구성표이고 다른 하나는 adl : // 구성표입니다.)

datalake 문서에는 실제로 webHDFS REST API와 ADL이라는 두 개의 인터페이스가 있다고 나와 있습니다. 그래서, 나는 https : // 계획이 나에게 wehHDFS 인터페이스를 가져다 줄 것이라고 가정하고있다. 그러나이 인터페이스를 사용하는 것에 대해서는 Azure에서 더 이상 정보를 찾을 수 없습니다.

웹 브라우저와 컬로 주어진 https : // URL을 훑어 보았습니다. 서비스가 응답 중입니다. 응답은 JSON이며 데이터 마킹은 Hadoop의 인스턴스이므로 예상대로입니다. 그러나 나는 내 파일에 접근 할 수 없다. [나는 포털을 통해 우리 호수에 업로드했다.]

예를 들어, "/foo.txt"에 대한 GET을 수행하면 응답은 ResourceNotFound 오류입니다.

일반적인 Hadoop HDFS 구문 인 "/webhdfs/v1/foo.txt"를 사용하여 GET을 수행하면 응답은 AuthenticationFailed 오류입니다. 추가 텍스트는 누락 된 액세스 토큰을 나타냅니다. 이것은 더 유망한 것처럼 보입니다. 그러나 이러한 액세스 토큰을 생성하는 방법에 대해서는 아무 것도 없습니다.

ADL 인터페이스, .NET 및 Visual Studio 사용에 대한 몇 가지 문서가 있지만 처음에 원하는 것은 아닙니다.

어떤 도움을 많이 주셔서 감사합니다!

해결법

  1. ==============================

    1.필자는 Matthew Hicks가 컬을 사용하여이를 수행하는 방법을 설명한이 포럼 게시물에 빚을졌습니다. 나는 그것을 가져 와서 PowerShell로 감쌌다. 이 작업을 수행 할 수있는 방법은 여러 가지가있을 것이라고 확신하지만 작동하는 방법은 다음과 같습니다.

    필자는 Matthew Hicks가 컬을 사용하여이를 수행하는 방법을 설명한이 포럼 게시물에 빚을졌습니다. 나는 그것을 가져 와서 PowerShell로 감쌌다. 이 작업을 수행 할 수있는 방법은 여러 가지가있을 것이라고 확신하지만 작동하는 방법은 다음과 같습니다.

    먼저 아래에 언급 된 client_id 및 client_secret을 채울 수 있도록 AAD 응용 프로그램을 설정하십시오. 대화 형 로그인을 원한다면 위의 포럼 게시물에이 접근 방식에 대한 링크가 있습니다.

    그런 다음 처음 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;
    
  2. from https://stackoverflow.com/questions/36410042/how-to-access-azure-datalake-using-the-webhdfs-api by cc-by-sa and MIT license