Hadoop Azure Data Lake サポート

はじめに

hadoop-azure-datalakeモジュールは、Azure Data Lake Storeとの統合をサポートします。このサポートは、JARファイルazure-datalake-store.jarを通じて提供されます。

関連ドキュメント

機能

  • Azure Data Lake Storageアカウントに保存されているデータの読み取りと書き込み。
  • Secure Webhdfs、つまりSSL暗号化アクセスにadlスキームを使用するURLを使用して、ファイルシステムパスを参照します。
  • MapReduceジョブのデータソース、またはシンクとして機能できます。
  • LinuxとWindowsの両方でテスト済み。
  • スケールについてテスト済み。
  • API setOwner()setAclremoveAclEntries()modifyAclEntries()は、ユーザー名およびグループ名としてUPNまたはOID(オブジェクトID)を受け入れます。
  • アカウントごとの構成をサポートします。

制限事項

次の操作に対する部分的またはサポートなし

  • シンボリックリンクの操作
  • プロキシユーザー
  • ファイルの切り捨て
  • ファイルチェックサム
  • ファイル複製係数
  • Hadoopクラスターのアクティブユーザーのホームディレクトリ。
  • 拡張属性(XAttrs)操作
  • スナップショット操作
  • 委任トークン操作
  • listStatus()およびgetFileStatus()として返されるユーザーおよびグループ情報は、Azure Active Directoryに関連付けられているGUIDの形式です。

使用法

概念

Azure Data Lake Storageのアクセスパスの構文は

adl://<Account Name>.azuredatalakestore.net/

ストアの使用に関する詳細については、Azure Portalを使用してAzure Data Lake Storeを使い始めるを参照してください。

OAuth2サポート

Azure Data Lake Storageの使用には、OAuth2仕様に従って、HTTPSヘッダーの一部としてOAuth2ベアラートークンが存在する必要があります。有効なOAuth2ベアラートークンは、Azure Data Lake Storageアカウントへのアクセス権を持つ有効なユーザーに対して、Azure Active Directoryサービスから取得する必要があります。

Azure Active Directory(Azure AD)は、MicrosoftのマルチテナントクラウドベースのディレクトリおよびID管理サービスです。Active Directoryとはを参照してください。

次のセクションでは、core-site.xmlでのOAuth2構成について説明します。

クレデンシャルとファイルシステムの構成

クレデンシャルは、リフレッシュトークン(ユーザーに関連付けられている)またはクライアントクレデンシャル(サービスプリンシパルに類似)を使用して構成できます。

リフレッシュトークンの使用

次のプロパティをクラスターのcore-site.xmlに追加します

<property>
  <name>fs.adl.oauth2.access.token.provider.type</name>
  <value>RefreshToken</value>
</property>

アプリケーションは、クライアントIDに関連付けられたAzure Active Directoryサービスから、クライアントIDとOAuth2リフレッシュトークンを設定する必要があります。Java用Active Directoryライブラリを参照してください。

クライアントIDとリフレッシュトークンを共有しないでください。秘密にしておく必要があります。

<property>
  <name>fs.adl.oauth2.client.id</name>
  <value></value>
</property>

<property>
  <name>fs.adl.oauth2.refresh.token</name>
  <value></value>
</property>

クライアントキーの使用

サービスプリンシパルの生成
  1. ポータルに移動します
  2. 左側のナビゲーションのサービスで、Azure Active Directoryを探してクリックします。
  3. メニューの「アプリの登録」を使用して、「Webアプリケーション」を作成します。ここで作成した名前を覚えておいてください。これは、認証済みユーザーとしてADLアカウントに追加するものです。
  4. ウィザードを進めます
  5. アプリが作成されたら、アプリの「設定」の下にある「キー」に移動します
  6. キーの期間を選択して[保存]をクリックします。生成されたキーを保存します。
  7. アプリの登録ページに戻り、上部の「エンドポイント」ボタンをクリックします。 「トークンエンドポイント」URLをメモします
  8. 認証に必要なプロパティをメモします
    • 上記で作成したWebアプリの「アプリケーションID」
    • 上記で生成したキー
    • トークンエンドポイント
サービスプリンシパルをADLアカウントに追加する
  1. もう一度ポータルに移動し、ADLアカウントを開きます
  2. アクセス制御(IAM)を選択します
  3. 上記の手順6で作成したユーザー名を追加します(リストには表示されませんが、名前を検索すると見つかります)
  4. 「所有者」ロールを追加します
core-site.xmlを構成する

次のプロパティをcore-site.xmlに追加します

<property>
  <name>fs.adl.oauth2.access.token.provider.type</name>
  <value>ClientCredential</value>
</property>

<property>
  <name>fs.adl.oauth2.refresh.url</name>
  <value>TOKEN ENDPOINT FROM STEP 7 ABOVE</value>
</property>

<property>
  <name>fs.adl.oauth2.client.id</name>
  <value>CLIENT ID FROM STEP 7 ABOVE</value>
</property>

<property>
  <name>fs.adl.oauth2.credential</name>
  <value>PASSWORD FROM STEP 7 ABOVE</value>
</property>

MSI(マネージドサービスID)の使用

Azure VMは、VM内のID拡張機能によって管理される「サービスID」を使用してプロビジョニングできます。これを行う利点は、クレデンシャルが拡張機能によって管理され、core-site.xmlに入れる必要がないことです。

MSIを使用するには、VMデプロイテンプレートをID拡張機能を使用するように変更します。テンプレートで指定したポート番号をメモします。これは、VM内のID拡張機能によってlocalhostに公開されるトークンサービスのRESTエンドポイントのポート番号です。デフォルトの推奨ポート番号は50342です。推奨ポート番号が使用されている場合、構成で以下のmsi.port設定を省略できます。

core-site.xmlを構成する

次のプロパティをcore-site.xmlに追加します

<property>
  <name>fs.adl.oauth2.access.token.provider.type</name>
  <value>Msi</value>
</property>

<property>
  <name>fs.adl.oauth2.msi.port</name>
  <value>PORT NUMBER FROM ABOVE (if different from the default of 50342)</value>
</property>

対話型ログインのためのデバイスコード認証の使用

注:この認証方法は、対話型ツールの実行には適していますが、クラスターに送信されたジョブには機能しません。

ユーザーベースのログインを使用するために、Azure Active Directoryはデバイスコードを使用したログインフローを提供します。

デバイスコードフローを使用するには、まずAzureポータルでネイティブアプリの登録を作成し、アプリのクライアントIDを構成として指定する必要があります。手順は次のとおりです

  1. ポータルに移動します
  2. 左側のナビゲーションのサービスで、Azure Active Directoryを探してクリックします。
  3. メニューの「アプリの登録」を使用して、「ネイティブアプリケーション」を作成します。
  4. ウィザードを進めます
  5. アプリが作成されたら、アプリの「アプリケーションID」をメモします
  6. アプリに権限を付与します
    1. アプリの「権限」をクリックし、「Azure Data Lake」および「Windows Azure Service Management API」の権限を追加します
    2. 「権限の付与」をクリックして、アプリに権限を追加します

次のプロパティをcore-site.xmlに追加します

<property>
  <name>fs.adl.oauth2.devicecode.clientappid</name>
  <value>APP ID FROM STEP 5 ABOVE</value>
</property>

通常、DeviceCodeをデフォルトのトークンプロバイダータイプとして追加することは望ましくありません。ただし、ローカルコマンドを使用する場合は使用できます

 hadoop fs -Dfs.adl.oauth2.access.token.provider.type=DeviceCode -ls ...

これを実行すると、任意のブラウザ(SSHセッション外の別のマシンでも)からログインするために使用できるURLとデバイスコードが出力されます。ログインが完了すると、コマンドが続行されます。

クレデンシャルプロバイダーによるクレデンシャルの保護

多くのHadoopクラスターでは、core-site.xmlファイルは世界中で読み取り可能です。これらのクレデンシャルを保護するために、クレデンシャルプロバイダーフレームワークを使用して安全に保存し、アクセスすることをお勧めします。

すべてのADLSクレデンシャルプロパティは、クレデンシャルプロバイダーによって保護できます。クレデンシャルプロバイダーAPIの詳細については、クレデンシャルプロバイダーAPIを参照してください。

プロビジョニング
hadoop credential create fs.adl.oauth2.client.id -value 123
    -provider localjceks://file/home/foo/adls.jceks
hadoop credential create fs.adl.oauth2.refresh.token -value 123
    -provider localjceks://file/home/foo/adls.jceks
core-site.xmlまたはコマンドラインプロパティの構成
<property>
  <name>fs.adl.oauth2.access.token.provider.type</name>
  <value>RefreshToken</value>
</property>
<property>
  <name>hadoop.security.credential.provider.path</name>
  <value>localjceks://file/home/foo/adls.jceks</value>
  <description>Path to interrogate for protected credentials.</description>
</property>
DistCpの実行
hadoop distcp
    [-D fs.adl.oauth2.access.token.provider.type=RefreshToken
     -D hadoop.security.credential.provider.path=localjceks://file/home/user/adls.jceks]
    hdfs://<NameNode Hostname>:9001/user/foo/srcDir
    adl://<Account Name>.azuredatalakestore.net/tgtDir/

注:core-site.xmlにジョブ固有の構成を追加する代わりに、distcpコマンドラインにプロバイダーパスプロパティをオプションで追加できます。上の角かっこは、この機能を示しています。

adl URLへのアクセス

クレデンシャルがcore-site.xmlで構成されると、Hadoopコンポーネントは、次の形式のURLを使用して、そのAzure Data Lake Storageアカウント内のファイルを参照できます。

adl://<Account Name>.azuredatalakestore.net/<path>

スキームadlは、Azure Data Lake StorageによってバックアップされたHadoop互換ファイルシステムのURLを識別します。adlは、Azure Data Lake Storage APIとのすべてのやり取りに、暗号化されたHTTPSアクセスを利用します。

たとえば、次のFileSystem Shellコマンドは、youraccountという名前のストレージアカウントへのアクセスを示しています。

hadoop fs -mkdir adl://yourcontainer.azuredatalakestore.net/testDir

hadoop fs -put testFile adl://yourcontainer.azuredatalakestore.net/testDir/testFile

hadoop fs -cat adl://yourcontainer.azuredatalakestore.net/testDir/testFile
test file content

ユーザー/グループの表現

hadoop-azure-datalakeモジュールは、getFileStatus()listStatus()、およびgetAclStatus()呼び出し中にユーザー/グループ情報がどのように表現されるかを構成するためのサポートを提供します。

次のプロパティをcore-site.xmlに追加してください。

<property>
  <name>adl.feature.ownerandgroup.enableupn</name>
  <value>true</value>
  <description>
    When true : User and Group in FileStatus/AclStatus response is
    represented as user friendly name as per Azure AD profile.

    When false (default) : User and Group in FileStatus/AclStatus
    response is represented by the unique identifier from Azure AD
    profile (Object ID as GUID).

    For performance optimization, Recommended default value.
  </description>
</property>

異なるADLアカウントの構成

異なるADLアカウントには、異なるADLクライアント構成でアクセスできます。これにより、異なるログイン詳細情報を使用することもできます。

  1. すべてのfs.adlオプションは、アカウントごとに設定できます。
  2. アカウント固有のオプションは、オプションのfs.adl.プレフィックスをfs.adl.account.ACCOUNTNAME.に置き換えることで設定します。ここで、ACCOUNTNAMEはアカウントの名前です。
  3. アカウントに接続するとき、明示的に設定されたすべてのオプションは、ベースのfs.adl.値をオーバーライドします。

例として、構成では、パブリックアカウントadl://<some-public-account>.azuredatalakestore.net/を使用するための基本構成と、プライベートアカウントadl://myprivateaccount.azuredatalakestore.net/を使用するためのアカウント固有の構成を持つことができます。

<property>
  <name>fs.adl.oauth2.client.id</name>
  <value>CLIENTID</value>
</property>

<property>
  <name>fs.adl.oauth2.credential</name>
  <value>CREDENTIAL</value>
</property>

<property>
  <name>fs.adl.account.myprivateaccount.oauth2.client.id</name>
  <value>CLIENTID1</value>
</property>

<property>
  <name>fs.adl.account.myprivateaccount.oauth2.credential</name>
  <value>CREDENTIAL1</value>
</property>

azure-datalake-storeモジュールのテスト

hadoop-azureモジュールには、完全なユニットテストスイートが含まれています。ほとんどのテストは、mvn testを実行することで追加構成なしで実行されます。これには、Azure Data Lake Storageのインメモリエミュレーションであるモックストレージに対するテストが含まれます。

一部のテストは、Azure Data Lake Storageに対して実行できます。これらのテストを実行するには、上記のセクションで説明したAdlアカウント情報と次のプロパティを使用して、src/test/resources/auth-keys.xmlを作成してください。

<property>
    <name>fs.adl.test.contract.enable</name>
    <value>true</value>
</property>

<property>
    <name>test.fs.adl.name</name>
    <value>adl://yourcontainer.azuredatalakestore.net</value>
</property>