Alteryx Serverにおける出力ファイルの管理

こんにちは、小澤です。

Alteryx Serverの基本的に使い方として、Designerで作成したワークフローをアップロードします。 アップロードされたワークフローはほとんどの場合、Desingerで実行した際と同じ挙動をしますが、一部異なるものもあります。

今回は、そんなものの1つである、Output Dataツールによるファイルの出力先について解説します。

パッケージファイルとアセット

Alteryxではワークフロー内の各ツールで利用する外部リソースをアセットという単位で管理しています。 ツールに付随するアセットの一覧は、設定左側のメニューから立方体のアイコンを選択することで確認できます。

例えば、上記のOutput Dataツールであれば、出力ファイルがアセットとして付随している状態となっています。

なお、このアイコンが表示されていない場合は、メニューの Option > User Settings > Edit User Settings で設定画面を開き、AdvancedタブにあるDisplay Asset Management in Properties Windowにチェックを入れることで表示されるようになります。

このアセットに含まれるファイルはyxzpファイルとしてパッケージングした際にパッケージ内に含まれる対象となります。

パッケージ内にファイルを含みたくない場合は、このアセット一覧でチェックを外すか、yxzpファイルを作る際に選択が可能です。

Alteryx Serverとアセット

では、Alteryx Serverにワークフローをアップロードした場合、アセット扱いはどうなるのでしょうか?

Alteryx Serverにワークフローをアップロードする際には、yxzpファイルを作成する時と同様にパッケージングされます。 その際、パッケージに含める内容の設定も可能です。

ここで、"Output DataツールがDesignerで動かした際と異なる挙動をする"という話になります。 厳密には、すべての場合ではなく、特定の条件を満たした場合のみ異なる動きをします。

まずは、その挙動を説明するためにワークフロー実行時のパスについて説明します。

ワークフローの実行パス

Alteryxのワークフローはファイルとしてどこかに保存されます。 この時、保存されているワークフローが保存されているパスはEngine.WorkflowDirectoryという変数に保存されています。 例えば、Formulaツールでこの変数を利用することでパスを取得することが可能です。

"ワークフローの保存先フォルダ : " + [Engine.WorkflowDirectory]

通常、ワークフローを作成するに際してこのパスを意識する必要がある場面はほとんど存在しないのですが、Input/Ouptut Dataツールなどで、ファイルを相対パスで指定しいる場合にはこのパスが基準となります。

例えば、ワークフローの保存先および、Engine.WorkflowDirectoryが C:\Alteryx\workflows\blog\workflow1.yxmd とした時、相対パスでOutput Dataツールの出力先を指定した場合の絶対パスでの出力先は以下のようになります。

相対パス 絶対パス
.\data1.yxdb C:\Alteryx\workflows\blog\data1.yxdb
..\data2.yxdb C:\Alteryx\workflows\data2.yxdb
.\outputs\data3.yxdb C:\Alteryx\workflows\blog\outputs\data3.yxdb

パッケージ化した際のアセットのパス

続いて、yxzpでパッケージングした際のアセット配置先について説明します。

パッケージングされたワークフローはアセットも含めた1つのファイルとなります。 実行に際しては、yxzpファイルを展開したのち、その中に含まれるワークフローを実行することになるわけですが、パッケージングする際には利用者がどのパスに展開するかわかりません。

せっかくリソースも含めて1つにできるパッケージングなのだから、展開するパスを気にせずに実行できるようになっててほしいですね。 そこで、yxzpファイルでは、アセットとして含まれるリソースを参照するものをパッケージ内の相対パスに置換します。 実際に一度パッケージングしたのち、展開したワークフローを確認すると、Output Dataツールの出力先が _externals で始まる相対パスに置き換わってるのが確認できるかと思います。

Alteryx Serverにワークフローをアップロードする際もパッケージングされるため、同様に相対パスに置き換えられるわけです。

ここまでを踏まえてAlteryx Serverでの挙動

さて、ではいよいよAlteryx Serverでの挙動の話に移ります。

Alteryx Serverでは

  • ワークフローがアップロードされた際にパッケージングしてMongoDBに保存する
  • ワークフローが実行される際にはMongoDBから取得したパッケージを一時フォルダに展開して実行する
  • 実行が完了したら一時フォルダごと削除する

という動きをします。 パッケージを展開した際の入出力先などは _externals で始まる相対パスのためどこに展開しても実行可能というわけです。

  • _externals から始まるパスに置換されるためファイル出力も一時フォルダ内になる
  • 一時フォルダは実行後に削除されるため、この時に出力されたファイルも失われる

という動きになるのですが、ここでAlteryx Server独自の動きが入ります。 一時フォルダを削除する前にその中に含まれる出力ファイルをすべてMongoDBに保存するのです。 MongoDBに保存さえれたファイルはシステムとして管理されるため、Web UI上から一覧で確認することが可能になります。

出力ファイルをアセットに含めなかった場合の挙動

さて、リソースをアセットに含めてパッケージングするというやり方ですが、意図的にアセットに含めない方法もあります。

冒頭で紹介したアセット一覧ですが、ここで左側のチェックを外すことで、そのリソースはアセットに含まれなくなります。 また、アセットに含まれないファイルを参照しているツールのパスはパッケージンするときに _externals 以下への置き換えが行われません。 そのため、例えばOutput Dataツールで指定している出力ファイルをアセットから外した場合は出力先のパスの変更が行われない、というわけです。

Alteryxでは出力先のフォルダが存在しない場合自動的に作成するようなことはしないので、この状態でパッケージングしたワークフローを他者に渡すとファイル出力ができずにエラーとなる可能性があります。

Alteryx Serverにワークフローをアップロードする際にアセットから出力ファイルのチェックを外していた場合は、一時フォルダとは関係なく、Alteryx Serverが稼働している環境上でそのパスにファイルを出力しようとします。

例えば、 C:\Alteryx\workflows\blog\outputs\data3.yxdb を出力先としており、アセットに含めずにアップロードした場合は、そのままこのパスに出力しようとするので、Alteryx Server上にも C:\Alteryx\workflows\blog\outputs フォルダを作成しておく必要があります。

ここでAlteryx Serverではワークフロー実行後に一時フォルダを削除するという挙動と併せると、置き換えなかったパスは削除対象に含まれないため、そのままファイル自体が残り続けます。 これによって、出力をファイルサーバなどに集約している場合はDesigner実行環境からもServer環境からもアクセス可能にしておくことで動揺に出力するといったことが可能になります。

ただし、削除対象にならないのと同様、MongoDBへの出力対象ともならないことには注意が必要です。 一時フォルダの外に出力されたファイルはAlteryx ServerのWeb UI上での出力ファイル一覧にも表示されません。 完全に管理管轄の対象外となるわけです。 もし、どうしてもそっちにも表示させたい場合は、Output Dataツールを2つ配置して、1つはアセットに含め、もう1つは含めないといった運用が必要になります。

出力先を相対パスで指定してた場合はどうなるか

最後に、出力ファイルを相対パスで指定しており、かつアセットに含めない場合どこに出力されるのか確認しておきます。 Engine.WorkflowDirectory 変数の値を確認するワークフローをAlteryx Serverで実行することで、Alteryx Server上で一時フォルダがどこに作られるのか確認できます。

%ProgramData%\Alteryx\Service\Staging いかにランダム(のような)文字列のフォルダが作成され、ここが一時フォルダとなります。 そのため、相対パスでのしていは以下のようになります。

相対パス 絶対パス
.\data1.yxdb C:\ProgramData\Alteryx\Service\Staging\<一時フォルダ>\data1.yxdb
..\data2.yxdb C:\ProgramData\Alteryx\Service\Staging\data2.yxdb
.\outputs\data3.yxdb C:\ProgramData\Alteryx\Service\Staging\<一時フォルダ>\outputs\data3.yxdb

これらも絶対パスで指定と同様、フォルダはあらかじめ存在している必要があります。 .\data1.yxdb..\data2.yxdb ような実行時に確実に存在するパスは問題ないのですが、実行場所が都度作られる一時フォルダという都合上、 .\outputs\data3.yxdb のようなその配下にサブフォルダがある前提のワークフローは出力がエラーとなります。 Run Commandツールでフォルダを作るなどで実現できなくはないですが、基本的にはエラーになると考えておいた方がいいでしょう。

おわりに

今回は、Alteryx Serverにワークフローをアップロードした際の出力先とアセットについて解説しました。 ちょっと複雑な考え方が必要になるため、色々なレベルの人が使う前提であれば常にアセットに含めるようにしてしまうのを基本としつつ、ファイルサーバに置く必要があるなどの状況に応じてやり方を工夫するといいでしょう。

Alteryxの導入なら、クラスメソッドにおまかせください

日本初のAlteryxビジネスパートナーであるクラスメソッドが、Alteryxの導入から活用方法までサポートします。14日間の無料トライアルも実施中ですので、お気軽にご相談ください。

alteryx_960x400