azure data lake gen2 でファイル操作をする


azure data lake gen2 ってなに?

awsでいうところのS3。azureにはもともとblob storageというのがあったがblobの進化版らしい。
参考
https://docs.microsoft.com/ja-jp/azure/storage/blobs/data-lake-storage-introduction
何が良くなったのかよくわからんが、ファイルのリネームとかが簡単になったらしい。
blobではファイル名とデータがkey value storeのように結びついている。要はディレクトリという概念がなく、blobのファイルアドレスとデータが1対1に紐付いている。 azure portalからblobストレージを見るとディレクトリがあるように見えるが、ファイルアドレスの中を/で区切ることでディレクトリのように見せかけているだけ。

そのため、blobでファイル名やディレクトリのリネームをしようとすると、
1. 新しいファイル名でblobをコピーする
2. もともとのファイルを 削除する

という手順をが実行される。linuxのmvコマンド感覚でうっかりディレクトリのリネームを実行すると、膨大なファイルのコピー&デリートが発生して結構時間がかかったりする。

blobとは違いdata lake gen2ではファイルとディレクトリの概念があるので、linuxのmvコマンドのようにリネームを実行してもファイル名が変わるだけで膨大なコピペは発生しませんよ。というのが売りらしい。

blobと同様にdata lake gen2はhdfsのように振る舞う事ができるので、sparkやhadoopで読み書きができる。

blobと互換性をもたせる予定らしく(今は互換性ない)、blob用に書いたいろいろなツールも将来的には簡単にdatalakegen2に移植できるらしい。

クライアントツールがない

GAアナウンス
https://azure.microsoft.com/ja-jp/updates/azure-data-lake-storage-gen2-is-now-generally-available/

今年の2月にGAしたばかりなので、いろいろとツールが揃っていない。blobの場合はpythonのBlockBlobStorageモジュールを使えばアクセスできたが、今はまだdata lake gen2 に使えない。

対応してるツール一覧
https://docs.microsoft.com/ja-jp/azure/storage/blobs/data-lake-storage-known-issues

hdfsコマンドには対応しているようなので、hdfsコマンドからファイルの操作をする方法をメモする。

環境

OS

Ubuntu 16.04.6 LTS

java インストール

Javaのインストール

$ sudo apt install openjdk-8-jre-headless
$ java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-8u212-b03-0ubuntu1.16.04.1-b03)
OpenJDK 64-Bit Server VM (build 25.212-b03, mixed mode)

JAVA_HOMEの設定


$ which java
/usr/bin/java
$ export JAVA_HOME=/usr

HDFSコマンドの用意

HADOOPコマンドのダウンロード
https://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-3.2.0/hadoop-3.2.0.tar.gz

ダウンロード、解凍したらとりあえずhadoop-3.2.0に移動

よくわからんおまじない

export HADOOP_OPTIONAL_TOOLS=hadoop-azure

やっとファイル操作してみる

bin/hdfs dfs -Dfs.azure.account.key.ACCOUNTNAME.dfs.core.windows.net=ACCOUNTKEY \
  -ls abfss://[email protected]/

これでhdfsコマンド一式を使ってファイル操作ができるようになった。

参考文献

hdfs オプションいちらん