動機
- azureのVM上から 使い慣れたhdfsクライアントコマンドを使って azure data lake gen2 にアクセスしたい。
- data lake のIDとパスワードはazureVM上に保管したくない。
参考サイト
https://iwasakims.github.io/trunk/hadoop-project/hadoop-azure/abfs.html
https://docs.microsoft.com/ja-jp/azure/active-directory/managed-identities-azure-resources/overview
https://stackoverflow.com/questions/54155248/for-an-azure-app-service-with-a-managed-identity-how-to-retrieve-the-client-id
作戦
VMの managed identityを有効にすると、あたかもユーザーと同じようにVMにロールを割り当てることができる。
手順
VMの設定
Managed Identityの設定
hdfsコマンドのダウンロード
vmの中に入って作業
- ここからhadoop 3.2.0(バージョン注意!!!) コマンドのバイナリをダウンロードして展開 https://hadoop.apache.org/releases.html
- /YOUR/DOWNLOAD/PATHに展開したとする。
- Java8のインストール
sudo apt install openjdk-8-jre-headless
- 環境変数の設定
以下を
~/.bash_profile
に付け足す
export PATH=$PATH:/YOUR/DOWNLOAD/PATH/hadoop-3.2.0/bin
export JAVA_HOME=/usr
export HADOOP_OPTIONAL_TOOLS=hadoop-azure
export HADOOP_HOME=/YOUR/DOWNLOAD/PATH/hadoop-3.2.0
特にexport HADOOP_OPTIONAL_TOOLS=hadoop-azure
を忘れると動かない。
data lake gen2の設定
- azure data lake gen2のStorageAccountを建てる。名前をshumpeidatalakegen2とした。作るときにhieralhical name spaceをONにすること。
- storageのAccessControl > Add > Add role assignmentを選択
- Role: Storage Blob DataOwner
- Assign access to: virtual machine
- Subscription: VMの入っているサブスクリプション
- select: さっき作ったVMの名前を入れると候補が出てくるのでクリック
Active Directoryから設定値の取得
TenanatIDの取得
AzureActiveDirectory > Properties > DirectoryIDを控える。これがTenantIDと呼ばれるものらしい。
Application IDの取得
さっき作ったVMのApplicationIDを取得する。
AzureActiveDirectory > Enterprise application > 右上のApplicationTypeをAllApplicationを選択(ここ重要!!) > さっき作ったVMの名前 > Properties > ApplicationIDを控える
hdfsコマンドの設定
ここでまたVMにログインして設定
$HADOOP_HOME/etc/hadoop/core-site.xml
に以下を記入
<configuration>
<property>
<name>fs.azure.account.auth.type</name>
<value>OAuth</value>
<description>
Use OAuth authentication
</description>
</property>
<property>
<name>fs.azure.account.oauth.provider.type</name>
<value>org.apache.hadoop.fs.azurebfs.oauth2.MsiTokenProvider</value>
<description>
Use MSI for issuing OAuth tokens
</description>
</property>
<property>
<name>fs.azure.account.oauth2.msi.tenant</name>
<value>さっき控えたTenantIDの値</value>
<description>
Optional MSI Tenant ID
</description>
</property>
<property>
<name>fs.azure.account.oauth2.client.id</name>
<value>さっき控えたApplicationID</value>
<description>
Optional Client ID
</description>
</property>
</configuration>
これでやっと準備が整った
HDFSコマンド実行
hdfs dfs -ls abfss://testfilesystem@shumpeidatalakegen2.dfs.core.windows.net/
できたー。長かった。