![](/img/trans.png)
[英]how to create custom operators in airflow and use them in airflow template which is running through cloud composer(in google cloud platform)
[英]How to specify which GCP project to use when triggering a pipeline through Data Fusion operator on Cloud Composer
我需要通过 DAG 内的数据融合运算符 (CloudDataFusionStartPipelineOperator) 触发位于名为myDataFusionProject的 GCP 项目上的数据融合管道,该 DAG 的 Cloud Composer 实例位于另一个名为myCloudComposerProject的项目上。
我已经使用官方文档以及源代码编写了大致类似于以下代码段的代码:
LOCATION = "someLocation"
PIPELINE_NAME = "myDataFusionPipeline"
INSTANCE_NAME = "myDataFusionInstance"
RUNTIME_ARGS = {"output.instance":"someOutputInstance", "input.dataset":"someInputDataset", "input.project":"someInputProject"}
start_pipeline = CloudDataFusionStartPipelineOperator(
location=LOCATION,
pipeline_name=PIPELINE_NAME,
instance_name=INSTANCE_NAME,
runtime_args=RUNTIME_ARGS,
task_id="start_pipeline",
)
我的问题是,每次我触发 DAG 时,Cloud Composer 都会在myCloudComposerProject 中查找 myDataFusionInstance而不是myDataFusionProject ,这会产生如下错误:
googleapiclient.errors.HttpError: <HttpError 404 当请求https://datafusion.googleapis.com/v1beta1/projects/myCloudComposerProject/locations/someLocation/instances/myDataFusionInstance?alt=json返回“资源'projects/myCloudComposerProject/locations/someLocation/未找到实例/myDataFusionInstance'”。 详细信息:“[{'@type': 'type.googleapis.com/google.rpc.ResourceInfo', 'resourceName': 'projects/myCloudComposerProject/locations/someLocation/instances/myDataFusionInstance'}]”
所以问题是:如何强制我的操作员使用 Data Fusion 项目而不是 Cloud Composer 项目? 我怀疑我可以通过添加一个新的运行时参数来做到这一点,但我不知道该怎么做。
最后一条信息:数据融合管道只是从 BigQuery 源中提取数据并将所有内容发送到 BigTable 接收器。
作为在 airflow 上开发运算符时的建议,我们应该检查实现运算符的类,因为文档可能由于版本控制而缺少一些信息。
如评论所述,如果您检查CloudDataFusionStartPipelineOperator
,您会发现它使用了一个挂钩,该挂钩基于project-id
获取实例。 此项目 ID 是可选的,因此您可以添加自己的project-id
。
class CloudDataFusionStartPipelineOperator(BaseOperator):
...
def __init__(
...
project_id: Optional[str] = None, ### NOT MENTION IN THE DOCUMENTATION
...
) -> None:
...
self.project_id = project_id
...
def execute(self, context: dict) -> str:
...
instance = hook.get_instance(
instance_name=self.instance_name,
location=self.location,
project_id=self.project_id, ### defaults your project-id
)
api_url = instance["apiEndpoint"]
...
将参数添加到您的运营商呼叫应该可以解决您的问题。
start_pipeline = CloudDataFusionStartPipelineOperator(
location=LOCATION,
pipeline_name=PIPELINE_NAME,
instance_name=INSTANCE_NAME,
runtime_args=RUNTIME_ARGS,
project_id=PROJECT_ID,
task_id="start_pipeline",
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.