Asakusa FrameworkのDirect I/O CLIのメモ。
AsakusaFW 0.10.0で、試験的機能としてDirect I/O CLI(directioコマンド)が導入された。
これは、Direct I/Oのベースパス・リソースパターンを指定してファイル操作できるコマンド。
Direct I/Oのデータソース(ASAKUSA_HOME/core/conf/asakusa-resources.xmlの設定)を参照してパスを判断しているようだ。
サブコマンド | 説明 |
---|---|
directio list | Direct I/Oデータソース上のファイル一覧を表示する。 |
directio mkdir | Direct I/Oデータソース上にディレクトリーを作成する。 |
directio get | Direct I/Oデータソース上のファイルをローカルにコピーする。 |
directio put | ローカルのファイルをDirect I/Oデータソース上にコピーする。 |
directio delete | Direct I/Oデータソース上のファイルを削除する。 |
directio copy | Direct I/Oデータソース間でファイルをコピーする。 |
directio move | Direct I/Oデータソース間でファイルを移動する。 |
directio configuration | Direct I/Oの設定を表示する。 |
directio transaction | Direct I/Oのトランザクション操作を行う。 |
Direct I/O CLIはAsakusaFW 0.10.0では試験的機能扱いだが特に何も設定する必要は無く、AsakusaFW
0.10.0でデプロイメントアーカイブを作れば自動的にdirectioコマンドも入ってくる。
Windows用のdirectio.cmdファイルもあるので、Windowsでも使用できる。
directioコマンドはASAKUSA_HOME/tools/binに在るので、そこにパスを通しておくと便利。
export PATH=$PATH:$ASAKUSA_HOME/tools/bin
path %PATH%;%ASAKUSA_HOME%\tools\bin
Direct I/Oの設定を表示する例。
> directio configuration list -v total 1 root ID: root base-path: / class: com.asakusafw.runtime.directio.hadoop.HadoopDataSource attributes: - fs.path: target/testing/directio
ちなみにこのとき、ASAKUSA_HOME/core/conf/asakusa-resources.xmlは以下のような内容。
<property> <name>com.asakusafw.directio.root</name> <value>com.asakusafw.runtime.directio.hadoop.HadoopDataSource</value> </property> <property> <name>com.asakusafw.directio.root.path</name> <value>/</value> </property> <property> <name>com.asakusafw.directio.root.fs.path</name> <value>target/testing/directio</value> </property>
Direct I/Oデータソースのファイル一覧を表示する例。
> directio list file:/C:/Users/hishidama/target/testing/directio/master file:/C:/Users/hishidama/target/testing/directio/master/item_info.csv file:/C:/Users/hishidama/target/testing/directio/master/store_info.csv file:/C:/Users/hishidama/target/testing/directio/result file:/C:/Users/hishidama/target/testing/directio/result/category file:/C:/Users/hishidama/target/testing/directio/result/error file:/C:/Users/hishidama/target/testing/directio/result/error/2011-04-01.csv file:/C:/Users/hishidama/target/testing/directio/sales file:/C:/Users/hishidama/target/testing/directio/sales/__testing__ file:/C:/Users/hishidama/target/testing/directio/sales/__testing__/testing.csv file:/C:/Users/hishidama/target/testing/directio/sales/master file:/C:/Users/hishidama/target/testing/directio/sales/master/item_info.csv file:/C:/Users/hishidama/target/testing/directio/sales/master/store_info.csv file:/C:/Users/hishidama/target/testing/directio/sales/sales file:/C:/Users/hishidama/target/testing/directio/sales/sales/2011-04-01.csv
パス(Direct I/Oの論理パス)を指定することも出来るが、カレントディレクトリーという概念は無いので
「.
」のみは使えず、「/」を使う。
> directio list / file:/C:/Users/hishidama/target/testing/directio
パスにはワイルドカードを指定できる。
「*」だとディレクトリー直下、「**」だと再帰的に全サブディレクトリーを含む。
> directio list "/*" file:/C:/Users/hishidama/target/testing/directio/master file:/C:/Users/hishidama/target/testing/directio/result file:/C:/Users/hishidama/target/testing/directio/sales > directio list "/**" file:/C:/Users/hishidama/target/testing/directio/master file:/C:/Users/hishidama/target/testing/directio/master/item_info.csv file:/C:/Users/hishidama/target/testing/directio/master/store_info.csv file:/C:/Users/hishidama/target/testing/directio/result file:/C:/Users/hishidama/target/testing/directio/result/category file:/C:/Users/hishidama/target/testing/directio/result/error file:/C:/Users/hishidama/target/testing/directio/result/error/2011-04-01.csv file:/C:/Users/hishidama/target/testing/directio/sales file:/C:/Users/hishidama/target/testing/directio/sales/__testing__ file:/C:/Users/hishidama/target/testing/directio/sales/__testing__/testing.csv file:/C:/Users/hishidama/target/testing/directio/sales/master file:/C:/Users/hishidama/target/testing/directio/sales/master/item_info.csv file:/C:/Users/hishidama/target/testing/directio/sales/master/store_info.csv file:/C:/Users/hishidama/target/testing/directio/sales/sales file:/C:/Users/hishidama/target/testing/directio/sales/sales/2011-04-01.csv > directio list "/**/*.csv" file:/C:/Users/hishidama/target/testing/directio/master/item_info.csv file:/C:/Users/hishidama/target/testing/directio/master/store_info.csv file:/C:/Users/hishidama/target/testing/directio/result/error/2011-04-01.csv file:/C:/Users/hishidama/target/testing/directio/sales/__testing__/testing.csv file:/C:/Users/hishidama/target/testing/directio/sales/master/item_info.csv file:/C:/Users/hishidama/target/testing/directio/sales/master/store_info.csv file:/C:/Users/hishidama/target/testing/directio/sales/sales/2011-04-01.csv
「-v(--verbose)」を付けると、どのデータソースに合致したのかも表示される。
(asakusa-resources.xmlで複数のデータソースを定義している場合に、どのデータソースが使われているか確認するのに便利かも)
> directio list -v master total 1 file:/C:/Users/hishidama/target/testing/directio/master data source: root directory: true
→asakusa list directioで、バッチが使用しているファイルのベースパス・リソースパターンを表示することが出来る。
Direct I/Oデータソース間でファイルをコピーする例。
「-r(--recursive)」を付けると、ディレクトリー内のファイルもコピーする。
「-p(--parallel)」を付けると、複数ファイルのコピーを並列で実行する。
「-v(--verbose)」を付けると、どのファイルをコピーしたのかのログも表示される。
「-rpv」のようにまとめて記述することも出来る。
> directio copy -rpv master back copy directory: file:/C:/Users/hishidama/target/testing/directio/master -> file:/C:/Users/hishidama/target/testing/directio/back copy file: file:/C:/Users/hishidama/target/testing/directio/master/item_info.csv -> file:/C:/Users/hishidama/target/testing/directio/back/item_info.csv copy file: file:/C:/Users/hishidama/target/testing/directio/master/store_info.csv -> file:/C:/Users/hishidama/target/testing/directio/back/store_info.csv
directioコマンドを試している最中に遭遇したエラー。
実行環境にHadoopがインストールされていないと以下のようなエラーが発生する。
Exception in thread "main" java.lang.IllegalStateException: classpath entry must exist: D:\cygwin\home\hishidama\asakusa\hadoop\lib at com.asakusafw.operation.tools.directio.bootstrap.Classpath.addEntries(Classpath.java:72) at com.asakusafw.operation.tools.directio.bootstrap.Bootstrap.exec(Bootstrap.java:70) at com.asakusafw.operation.tools.directio.bootstrap.Bootstrap.main(Bootstrap.java:51)
directioコマンドを使うためには、実行環境にHadoopが必要となる。(Hadoopファイルシステムのクラスを使用している為)
実行環境にHadoopをインストールしない場合、AsakusaFWが用意するHadoopライブラリーを使用する方法がある。
build.gradleに設定を追加する。
〜 asakusafwOrganizer { profiles.prod { hadoop.embed true } profiles.dev { hadoop.embed true }
profiles.prod
は本番環境用の設定、profiles.dev
は開発環境用の設定。(profiles.dev
はShafuの「Asakusa
Frameworkのインストール」で使用される)
「hadoop.embed true
」を記述してデプロイメントアーカイブを作成すると、アーカイブの中にHadoopが入れられ、それが使われるようになる。
(ちなみに、AsakusaFW 0.10.0より前は「hadoop.embed
」ではない別の設定方法だった)
Java9で実行すると以下のようなエラーが発生する。
Exception in thread "main" java.lang.ExceptionInInitializerError at com.asakusafw.runtime.windows.WinUtilsInstaller.(WinUtilsInstaller.java:45) at com.asakusafw.runtime.windows.WindowsConfigurator.installWinUtils(WindowsConfigurator.java:40) at com.asakusafw.runtime.windows.WindowsConfigurator.install(WindowsConfigurator.java:36) at com.asakusafw.operation.tools.directio.DirectIo. (DirectIo.java:40) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 〜 Caused by: java.lang.StringIndexOutOfBoundsException: begin 0, end 3, length 1 at java.base/java.lang.String.checkBoundsBeginEnd(Unknown Source) at java.base/java.lang.String.substring(Unknown Source) at org.apache.hadoop.util.Shell. (Shell.java:52) ... 12 more
たぶん、2017年12月時点でHadoopがJava9に対応していない。