0
Luigiを使用していくつかのJupyterノートの処理を一括して処理しようとしています。Luigiタスクグラフの作成時にJSONのシリアル化エラーが発生しました
私は2つのクラスを持っています。まず、transform.py
:
import nbformat
import nbconvert
import luigi
from nbconvert.preprocessors.execute import CellExecutionError
class Transform(luigi.Task):
"""Foo."""
notebook = luigi.Parameter()
requirements = luigi.ListParameter()
def requires(self):
return self.requirements
def run(self):
nb = nbformat.read(self.notebook, nbformat.current_nbformat)
# https://nbconvert.readthedocs.io/en/latest/execute_api.html
ep = nbconvert.preprocessors.ExecutePreprocessor(timeout=600, kernel_name='python3')
try:
ep.preprocess(nb, {'metadata': {'path': "/".join(self.notebook.split("/")[:-1])}})
with self.output().open('w') as f:
nbformat.write(nb, f)
except CellExecutionError:
pass # TODO
def output(self):
return luigi.LocalTarget(self.notebook)
これは(このタスクを実行することができ前に要件と一緒に)入力としてノートブックを取り、そのノートブックを実行し、出力として成功または失敗を報告するべきであるルイジ・タスクを定義します。
は、私は小さなRunner
クラスを持っているTransform
タスクを実行するには:
import luigi
class Runner(luigi.Task):
requirements = luigi.ListParameter()
def requires(self):
return self.requirements
私の小さなジョブを実行するには、私は:
from transform Transform
trans = Transform("../tests/fixtures/empty_valid_errorless_notebook.ipynb", [])
from runner import Runner
run_things = Runner([trans])
をしかし、これはTypeError: Object of type 'Transform' is not JSON serializable
を上げます!
私のluigi
のタスク形式は正しいですか?もしそうなら、run
のどのコンポーネントがクラス全体を直列化できないのかは明らかですか?そうでない場合、これをデバッグするにはどうしたらよいですか?
は、だから、ハードコードは前もって依存関係ありませんすることはできませんか? –
あなたが何を意味するのか分かりません...あなたはそれをハードコードすることができます。私は、requires()メソッドの期待される戻り値の型が何であるかを指摘しました。別の例が必要な場合は教えてください。 – MattMcKnight
私は実行時に新しいタスクをプログラムで作成し、さらに上に戻る必要な追加要件をすべて渡したいと思っています。したがって、実行時に私のタスクグラフがTransform( "a.ipynb") - > Transform( "b.ipynb") - > Runnerであると判断したとします。ランナーは、Transform( "b.ipynb"、requirements = [trans_a])と同様に 'trans_a = Transform(" a.ipynb "、requirements = [])'を作成する必要があります。私が変数として 'requirements'パラメータに書き込めない場合は、(ファイルI/Oトリッキーがなくても)どうやってそれをやり遂げることができるのか分かりません。 –