参考
論文
- Delta Lake High-Performance ACID Table Storage over Cloud Object Stores
- Lakehouse A New Generation of Open Platforms that Unify Data Warehousing and Advanced Analytics
Hadoop環境
Alluxioドキュメント
メモ
Delta Lake High-Performance ACID Table Storage over Cloud Object Stores や Lakehouse A New Generation of Open Platforms that Unify Data Warehousing and Advanced Analytics の論文の通り、 Delta Lakeはキャッシュとの組み合わせが可能である。
今回は、ストレージにHDFS、キャッシュにAlluxioを使って動作確認する。
疑似分散で動作確認
実行環境の準備
ansible-bigdata あたりを参考に、Hadoopの疑似分散環境を構築する。 Bigtopベースの2.8.5とした。
併せて、同Ansibleプレイブック集などを用いて、Spark3.1.1のコミュニティ版を配備した。
併せて、Alluxioは2.5.0-2を利用。
Alluxioに関しては、以下のようにコンパイルしてパッケージ化して用いることできる。
1 | sudo -u alluxio mkdir /usr/local/src/alluxio |
コンフィグとしては以下を利用。
1 | $ cat conf/alluxio-site.properties |
ポイントは以下の通り。
- 疑似分散環境のHDFS利用
- Alluxioの使用するディレクトリとして、
/alluxioを利用 - マスタはローカルホストで起動
フォーマット、起動
1 | sudo -u alluxio ./bin/alluxio format |
テストを実行
1 | sudo -u alluxio ./bin/alluxio runTests |
もしエラーが生じた場合は、例えばHDFSの/alluxioディレクトリに、 適切な権限設定、所有者設定がされているかどうかを確認すること。
Alluxioが起動すると以下のようなUIを確認できる(ポート19999)
先程テストで書き込まれたファイル群が見られるはず。
ここでは、上記の通り、環境を整えた前提で以下説明する。
Sparkの起動確認
Examples: Use Alluxio as Input and Output を参考に、Alluxio経由での読み書きを試す。
予め、今回の動作確認で使用するテキストデータ(AlluxioのREADME)をアップロードしておく。
1 | $ sudo -u alluxio /opt/alluxio/default//bin/alluxio fs copyFromLocal /opt/alluxio/default/LICENSE /LICENSE |
予め、以下のような設定をspark-defaults.confに入れておく。 Alluxioのクライアントライブラリを用いられるように。
1 | spark.driver.extraClassPath /opt/alluxio/default/client/alluxio-2.5.0-2-client.jar |
Sparkが起動することを確認する。ここではDelta Lakeも含めて起動する。
1 | /usr/local/spark/default/bin/spark-shell \ |
起動したシェルでAlluxio上のREADMEファイルを読み取り、行数を確認する。
1 | scala> val pathOnAlluxio = "alluxio://localhost:19998/LICENSE" |
Delta Lakeを通じて書き込む動作確認
準備として、Alluxio上に、dobachiユーザ用のディレクトリを作成してみる。
1 | sudo -u alluxio /opt/alluxio/default/bin/alluxio fs mkdir /users |
先程起動しておいたシェルで、Delta Lake形式のデータを書き込んで見る。
1 | scala> val data = spark.range(0, 5) |
すると以下のようなエラーが生じた。
1 | scala> data.write.format("delta").save(outputUrl) |
当たり前だが、Delta Lakeの下回りのストレージとして標準では、 Alluxioが対応しておらず、LogStoreからエラーが生じた、ということのようだ。
一瞬、LogStoreを新たに開発しないといけないか?と思ったものの、よく考えたら、HDFSHadoopFileSystemLogStoreから Alluxioのスキーマを認識させてアクセスできるようにすればよいだけでは?と思った。 そこで、Hadoopの設定でAlluxioFileSystemをalluxioスキーマ(ファイルシステムのスキーマ)に明示的に登録してみる。
/etc/hadoop/conf/core-site.xmlに以下を追記。
1 | <property> |
再びSparkを立ち上げ、適当なデータを書き込み。
1 | scala> val data = spark.range(0, 5) |
以上のように書き込みに成功した。
つづいて、テーブルとして読み出す。
1 | scala> val df = spark.read.format("delta").load(outputUrl) |
テーブルへの追記。
1 | scala> val addData = spark.range(5, 10) |
また、追記書き込みをしたのでDeltaログが増えていることが分かる。 (3回ぶんのログがあるのは、↑には記載していないがミスったため)
(補足)HDFS上のディレクトリ権限に関するエラー
Sparkでの処理実行時にYARNで実行していたところ、Executorにおける処理からAlluxioを呼び出すときにエラー。
yarnユーザでのアクセスとなり、HDFS上の /alluxio
へのアクセス権がなかったと考えられる。
1 | 21/01/05 02:54:35 WARN TaskSetManager: Lost task 0.0 in stage 0.0 (TID 0, hadoop-pseudo, executor 2): alluxio.exception.status.UnauthenticatedException: Channel authentication failed with code:UNAUTHENTICATED. Channel: GrpcChannelKey{ClientType=FileSystemMasterClient, ClientHostname=hadoop-pseudo.mshome.net, ServerAddress=GrpcServerAddress{HostName=localhost, SocketAddress=localhost:19998}, ChannelId=81f7d97f-8e32-4289-bcab-ea6008d5ffac}, AuthType: SIMPLE, Error: alluxio.exception.status.UnauthenticatedException: Plain authentication failed: Failed to authenticate client user="yarn" connecting to Alluxio server and impersonating as impersonationUser="vagrant" to access Alluxio file system. User "yarn" is not configured to allow any impersonation. Please read the guide to configure impersonation at https://docs.alluxio.io/os/user/2.4/en/operation/Security.html |
Alluxio Security のドキュメント中に「Client-Side Hadoop Impersonation」を読むと、 「なりすまし」を許可する設定があるようだ。
そこで、yarnユーザが様々なユーザになりすませるような簡易設定を以下のように加えることにした。
実際の運用する際は、なりすましのスコープに注意したほうが良さそうだ。
conf/alluxio-site.properties
1 | alluxio.master.security.impersonation.yarn.users=* |
ドキュメントではクライアントで
alluxio.security.login.impersonation.username
も指定するよう書かれていたが、
起動時にしてしなくてもアクセスできるようになった。
あとで実装を調べたほうが良さそうだ。