pegasusWMS的jupyter範例

qq_37675638發表於2020-12-03

接上一篇安裝,這一篇是官網給的在docker上的例項

教程

安裝docker就省略了,之前裝了,接下來是官網給的在docker上的示例

docker pull pegasus/tutorial:5.0.0
docker run --privileged --rm -p 9999:8888 pegasus/tutorial:5.0.0

然後就訪問該頁面,執行1,2兩個示例。http://xxx.xxx.xxx.xxx:9999/tree?           密碼:scitech

訪問頁面後,點選該按鈕執行所有程式碼塊

 

第一節 API介紹

最終效果如下,Diamond工作流,矩形代表輸入/輸出檔案,橢圓代表計算作業,箭頭表示依賴

Pegasus指定的抽象工作流描述是可移植的,並且通常不包含執行作業的物理輸入檔案。pegasus在過程中使用三個資訊目錄,過程如下。

1.印入PythonAPI,詳細描述在https://pegasus.isi.edu/documentation/reference-guide/api-reference.html

from Pegasus.api.mixins import EventType, Namespace
from Pegasus.api.properties import Properties
from Pegasus.api.replica_catalog import File, ReplicaCatalog
from Pegasus.api.site_catalog import (
    OS,
    Arch,
    Directory,
    FileServer,
    Grid,
    Operation,
    Scheduler,
    Site,
    SiteCatalog,
)
from Pegasus.api.transformation_catalog import (
    Container,
    Transformation,
    TransformationCatalog,
    TransformationSite,
)
from Pegasus.api.workflow import Job, SubWorkflow, Workflow
from Pegasus.client._client import PegasusClientError


#或者是引入全部
from Pegasus.api import *

2.配置日誌

若為了看工具(如pegasus-plan,pegasus-analyzer)的輸出,則需要配置日誌。

from pathlib import Path

import logging

logging.basicConfig(level=logging.DEBUG)

3.配置Pegasus屬性

可以使用Properties()生成pegasus.properties檔案,如果可以檢視最常用的屬性列表,可以使用Properties.ls(prefix)。如果給出pegasus-plan檔案,則pegasus-plan將在cwd中查詢pegasus.properties檔案。

# --- Properties ---------------------------------------------------------------
props = Properties()
props["pegasus.monitord.encoding"] = "json"                                                                    
props["pegasus.catalog.workflow.amqp.url"] = "amqp://friend:donatedata@msgs.pegasus.isi.edu:5672/prod/workflows"
props["pegasus.mode"] = "tutorial" # speeds up tutorial workflows - remove for production ones
props.write() # written to ./pegasus.properties 
Properties.ls("condor.request")

4.建立副本目錄(指定初始輸入檔案)

提供給工作流的任何初始輸入檔案都應在ReplicaCatalog中指定。該物件告訴Pegasus每個輸入檔案的物理位置。受限,我們建立一個檔案,它將作為此工作流的輸入。

with open("f.a", "w") as f:
    f.write("This is the contents of the input file for the diamond workflow!")

./f.a將在此工作流程中使用,因此我們建立了一個相應的File物件,也可以用下面的方法將後設資料新增到檔案中。

接下來,建立一個ReplicaCatalog物件,以便可以對每個輸入檔案的物理位置進行分類。這是使用ReplicaCatalog.add_replica(site,file,path)函式完成的。由於檔案f.a在提交的主機上,使用local作為位置引數。然後,File物件作為file引數。最後,pathlib.Path可以作為絕對路徑。

預設情況下,如果已給出pegasus-plan的副本,它將在cwd中查詢一個plicates.yml檔案。

# --- Replicas -----------------------------------------------------------------
fa = File("f.a").add_metadata(creator="ryan")
rc = ReplicaCatalog()\
    .add_replica("local", fa, Path(".").resolve() / "f.a")\
    .write() # written to ./replicas.yml 
!cat replicas.yml

5.建立轉換目錄(指定使用的可執行檔案)

工作流使用的任何可執行檔案都需要在TransformationCatalog中指定。這是通過建立可執行檔案的Transformation物件來完成的建立之後,必須將他們新增到TransformationCatalog物件。

預設情況下,pegasus-plan可以在cwd中檢視transformations.yml。

# --- Transformations ----------------------------------------------------------
preprocess = Transformation(
                "preprocess",
                site="condorpool",
                pfn="/usr/bin/pegasus-keg",
                is_stageable=False,
                arch=Arch.X86_64,
                os_type=OS.LINUX
            )

findrange = Transformation(
                "findrange",
                site="condorpool",
                pfn="/usr/bin/pegasus-keg",
                is_stageable=False,
                arch=Arch.X86_64,
                os_type=OS.LINUX
            )

analyze = Transformation(
                "analyze",
                site="condorpool",
                pfn="/usr/bin/pegasus-keg",
                is_stageable=False,
                arch=Arch.X86_64,
                os_type=OS.LINUX
            )

tc = TransformationCatalog()\
    .add_transformations(preprocess, findrange, analyze)\
    .write() # ./written to ./transformations.yml
!cat transformations.yml

6.建立工作流

Workflow物件備用來儲存job之間的依賴。典型job建立如下:

# Define job Input/Output files
input_file = File("input.txt")
output_file1 = File("output1.txt")
output_file2 = File("output2.txt")

# Define job, passing in the transformation (executable) it will use
j = Job(transformation_obj)

# Specify command line arguments (if any) which will be passed to the transformation when run
j.add_args("arg1", "arg2", input_file, "arg3", output_file)

# Specify input files (if any)
j.add_inputs(input_file)

# Specify output files (if any)
j.add_outputs(output_file1, output_file2)

# Add profiles to the job
j.add_env(FOO="bar")
j.add_profiles(Namespace.PEGASUS, key="checkpoint.time", value=1)

# Add the job to the workflow object
wf.add_jobs(j)

預設情況下,將基於輸入和輸出檔案來推斷作業之間的依賴關係。

# --- Workflow -----------------------------------------------------------------
wf = Workflow("blackdiamond")

fb1 = File("f.b1")
fb2 = File("f.b2")
job_preprocess = Job(preprocess)\
                    .add_args("-a", "preprocess", "-T", "3", "-i", fa, "-o", fb1, fb2)\
                    .add_inputs(fa)\
                    .add_outputs(fb1, fb2)

fc1 = File("f.c1")
job_findrange_1 = Job(findrange)\
                    .add_args("-a", "findrange", "-T", "3", "-i", fb1, "-o", fc1)\
                    .add_inputs(fb1)\
                    .add_outputs(fc1)

fc2 = File("f.c2")
job_findrange_2 = Job(findrange)\
                    .add_args("-a", "findrange", "-T", "3", "-i", fb2, "-o", fc2)\
                    .add_inputs(fb2)\
                    .add_outputs(fc2)

fd = File("f.d")
job_analyze = Job(analyze)\
                .add_args("-a", "analyze", "-T", "3", "-i", fc1, fc2, "-o", fd)\
                .add_inputs(fc1, fc2)\
                .add_outputs(fd)

wf.add_jobs(job_preprocess, job_findrange_1, job_findrange_2, job_analyze)

7.執行工作流

在Python中工作時,我們可以只使用Workflow物件引用,用來計劃,執行並直接檢測工作流。這些是PegasusCLI工具的包裝,因此,可以將相同的引數傳遞給它們。

請注意,必須將Pegasus二進位制檔案新增到您的PATH中,此功能才能起作用。

請等待進度條指示工作流已完成。

try:
    wf.plan(submit=True)\
        .wait()
except PegasusClientError as e:
    print(e)

請注意,輸出中以pegasus-status開頭的行包含可用於監視工作流狀態的命令。我們將在接下來的兩節介紹此命令列工具。它包含的路徑是提交目錄的路徑,其中儲存了提交和監視工作流所需的所有檔案。現在,我們將繼續使用python workflow物件

8.統計

根據工作流程是否完成,您可以選擇下一步做什麼。如果工作流程失敗,則可以使用wf.analyze()獲得幫助以找出問題所在。如果工作流程成功完成,我們可以從出處資料庫中提取一些統計資訊。

try:
    wf.statistics()
except PegasusClientError as e:
    print(e)

第二節 工作流除錯

在複雜的計算基礎架構(例如HPC群集)上執行復雜的計算(例如工作流)時,事情將會出錯。因此,重要的是要了解如何檢測和除錯出現的問題。好訊息是Pegasus在檢測部分方面做得很好,例如使用了退出程式碼,並提供了可幫助您除錯的工具。在此筆記本中,我們將使用與上一個相同的工作流程,但會引入一個錯誤並檢視是否可以檢測到它。

首先,清理一些檔案使得多此執行。

!rm -f f.a

import logging

from pathlib import Path

from Pegasus.api import *

logging.basicConfig(level=logging.DEBUG)

# --- Properties ---------------------------------------------------------------
props = Properties()
props["pegasus.monitord.encoding"] = "json"                                                                    
props["pegasus.catalog.workflow.amqp.url"] = "amqp://friend:donatedata@msgs.pegasus.isi.edu:5672/prod/workflows"
props["pegasus.mode"] = "tutorial" # speeds up tutorial workflows - remove for production ones
props.write() # written to ./pegasus.properties 

# --- Replicas -----------------------------------------------------------------
with open("f-problem.a", "w") as f:
   f.write("This is sample input to KEG")

fa = File("f.a").add_metadata(creator="ryan")
rc = ReplicaCatalog().add_replica("local", fa, Path(".").resolve() / "f.a")

# --- Transformations ----------------------------------------------------------
preprocess = Transformation(
               "preprocess",
               site="condorpool",
               pfn="/usr/bin/pegasus-keg",
               is_stageable=False,
               arch=Arch.X86_64,
               os_type=OS.LINUX
            )

findrange = Transformation(
               "findrange",
               site="condorpool",
               pfn="/usr/bin/pegasus-keg",
               is_stageable=False,
               arch=Arch.X86_64,
               os_type=OS.LINUX
            )

analyze = Transformation(
               "analyze",
               site="condorpool",
               pfn="/usr/bin/pegasus-keg",
               is_stageable=False,
               arch=Arch.X86_64,
               os_type=OS.LINUX
            )

tc = TransformationCatalog().add_transformations(preprocess, findrange, analyze)

# --- Workflow -----------------------------------------------------------------
'''
                     [f.b1] - (findrange) - [f.c1]
                     /                             \
[f.a] - (preprocess)                               (analyze) - [f.d]
                     \                             /
                     [f.b2] - (findrange) - [f.c2]

'''
wf = Workflow("blackdiamond")

fb1 = File("f.b1")
fb2 = File("f.b2")
job_preprocess = Job(preprocess)\
                     .add_args("-a", "preprocess", "-T", "3", "-i", fa, "-o", fb1, fb2)\
                     .add_inputs(fa)\
                     .add_outputs(fb1, fb2)

fc1 = File("f.c1")
job_findrange_1 = Job(findrange)\
                     .add_args("-a", "findrange", "-T", "3", "-i", fb1, "-o", fc1)\
                     .add_inputs(fb1)\
                     .add_outputs(fc1)

fc2 = File("f.c2")
job_findrange_2 = Job(findrange)\
                     .add_args("-a", "findrange", "-T", "3", "-i", fb2, "-o", fc2)\
                     .add_inputs(fb2)\
                     .add_outputs(fc2)

fd = File("f.d")
job_analyze = Job(analyze)\
               .add_args("-a", "analyze", "-T", "3", "-i", fc1, fc2, "-o", fd)\
               .add_inputs(fc1, fc2)\
               .add_outputs(fd)

wf.add_jobs(job_preprocess, job_findrange_1, job_findrange_2, job_analyze)
wf.add_replica_catalog(rc)
wf.add_transformation_catalog(tc)

2.執行工作流

try:
    wf.plan(submit=True)\
        .wait()
except PegasusClientError as e:
    print(e)

3.分析

如果工作流程失敗,則可以使用wf.analyze()獲得幫助以找出問題所在。

try:
    wf.analyze()
except PegasusClientError as e:
    print(e)

在輸出中,我們可以看到預期的本地檔案不存在:/home/scitech/notebooks/02-Debugging/f.a,它告訴我們輸入不存在。這是因為我們用錯誤的名稱(f-problem.a)而不是預期的名稱(f.a)建立了它。

3.解決問題

讓我們通過重新命名錯誤的輸入檔案來解決此問題:

!mv f-problem.a f.a

3.重新啟動工作流程

現在,我們可以從停止的地方重新啟動工作流。除了run()之外,您還可以計劃()一個新例項,但是在那種情況下,工作流程將從頭開始。

try:
    wf.run() \
      .wait()
except PegasusClientError as e:
    print(e)

第三節 命令列工具

如前所述,在Jupyter筆記本中執行Pegasus對於教程和較小的工作流非常方便,但是生產工作流通常是使用命令列工具在專用HTCondor提交節點上提交的。本教程的這一部分使用與在筆記本中生成的上一部分相同的工作流程。規劃,提交和檢查狀態將使用命令列工具完成。

首先,執行以下單元格以生成工作流。請注意,我們只是在最後寫出來。

import logging

from pathlib import Path

from Pegasus.api import *

logging.basicConfig(level=logging.DEBUG)

# --- Properties ---------------------------------------------------------------
props = Properties()
props["pegasus.monitord.encoding"] = "json"                                                                    
props["pegasus.catalog.workflow.amqp.url"] = "amqp://friend:donatedata@msgs.pegasus.isi.edu:5672/prod/workflows"
props["pegasus.mode"] = "tutorial" # speeds up tutorial workflows - remove for production ones
props.write() # written to ./pegasus.properties 

# --- Replicas -----------------------------------------------------------------
with open("f.a", "w") as f:
   f.write("This is sample input to KEG")

fa = File("f.a").add_metadata(creator="ryan")
rc = ReplicaCatalog().add_replica("local", fa, Path(".").resolve() / "f.a")

# --- Transformations ----------------------------------------------------------
preprocess = Transformation(
               "preprocess",
               site="condorpool",
               pfn="/usr/bin/pegasus-keg",
               is_stageable=False,
               arch=Arch.X86_64,
               os_type=OS.LINUX
            )

findrange = Transformation(
               "findrange",
               site="condorpool",
               pfn="/usr/bin/pegasus-keg",
               is_stageable=False,
               arch=Arch.X86_64,
               os_type=OS.LINUX
            )

analyze = Transformation(
               "analyze",
               site="condorpool",
               pfn="/usr/bin/pegasus-keg",
               is_stageable=False,
               arch=Arch.X86_64,
               os_type=OS.LINUX
            )

tc = TransformationCatalog().add_transformations(preprocess, findrange, analyze)

# --- Workflow -----------------------------------------------------------------
'''
                     [f.b1] - (findrange) - [f.c1]
                     /                             \
[f.a] - (preprocess)                               (analyze) - [f.d]
                     \                             /
                     [f.b2] - (findrange) - [f.c2]

'''
wf = Workflow("blackdiamond")

fb1 = File("f.b1")
fb2 = File("f.b2")
job_preprocess = Job(preprocess)\
                     .add_args("-a", "preprocess", "-T", "3", "-i", fa, "-o", fb1, fb2)\
                     .add_inputs(fa)\
                     .add_outputs(fb1, fb2)

fc1 = File("f.c1")
job_findrange_1 = Job(findrange)\
                     .add_args("-a", "findrange", "-T", "3", "-i", fb1, "-o", fc1)\
                     .add_inputs(fb1)\
                     .add_outputs(fc1)

fc2 = File("f.c2")
job_findrange_2 = Job(findrange)\
                     .add_args("-a", "findrange", "-T", "3", "-i", fb2, "-o", fc2)\
                     .add_inputs(fb2)\
                     .add_outputs(fc2)

fd = File("f.d")
job_analyze = Job(analyze)\
               .add_args("-a", "analyze", "-T", "3", "-i", fc1, fc2, "-o", fd)\
               .add_inputs(fc1, fc2)\
               .add_outputs(fd)

wf.add_jobs(job_preprocess, job_findrange_1, job_findrange_2, job_analyze)
wf.add_replica_catalog(rc)
wf.add_transformation_catalog(tc)
wf.write()

1.在jupyter終端開啟

返回主介面開啟命令列。

 

相關文章