S-JIS[2017-12-08] 変更履歴

Asakusa Framework Direct I/O CLI

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のトランザクション操作を行う。

directioコマンドの準備

Direct I/O CLIはAsakusaFW 0.10.0では試験的機能扱いだが特に何も設定する必要は無く、AsakusaFW 0.10.0でデプロイメントアーカイブを作れば自動的にdirectioコマンドも入ってくる。
Windows用のdirectio.cmdファイルもあるので、Windowsでも使用できる。

directioコマンドはASAKUSA_HOME/tools/binに在るので、そこにパスを通しておくと便利。

Linuxの場合

export PATH=$PATH:$ASAKUSA_HOME/tools/bin

Windowsの場合

path %PATH%;%ASAKUSA_HOME%\tools\bin

使用例

configuration list

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>

list

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で、バッチが使用しているファイルのベースパス・リソースパターンを表示することが出来る。


copy

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が無い

実行環境に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に設定を追加する。

build.gradle:

〜
asakusafwOrganizer {
profiles.prod {
    hadoop.embed true
}
profiles.dev {
    hadoop.embed true
}

profiles.prodは本番環境用の設定、profiles.devは開発環境用の設定。(profiles.devShafuの「Asakusa Frameworkのインストール」で使用される)
hadoop.embed true」を記述してデプロイメントアーカイブを作成すると、アーカイブの中にHadoopが入れられ、それが使われるようになる。
(ちなみに、AsakusaFW 0.10.0より前は「hadoop.embed」ではない別の設定方法だった)


Java9で実行

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に対応していない。


Direct I/Oへ戻る / AsakusaFW目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま