首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用Kedro读/写/同步云上的数据

如何使用Kedro读/写/同步云上的数据
EN

Stack Overflow用户
提问于 2021-07-20 05:23:29
回答 2查看 78关注 0票数 1

简而言之:如何将文件保存在本地和云上,类似于如何设置为从本地读取。

详细描述:有两种场景,1)构建模型2)通过API服务模型。在建立模型的过程中,对特征和模型的生成进行了一系列分析。结果将在本地写入。最后,所有内容都将被上传到S3。为了提供数据,首先将下载从第一步生成的所有所需文件。

我很好奇如何在这里利用Kedro。也许我可以为每个文件conf/base/catalog.yml定义两个条目,一个对应于本地版本,另一个对应于S3。但当我处理20个文件时,可能不是最有效的方法。

或者,我可以使用自己的脚本将文件上传到S3,并从Kedro中排除同步!换句话说,Kedro对云上存在副本的事实视而不见。也许这种方法不是对Kedro最友好的方式。

EN

回答 2

Stack Overflow用户

发布于 2021-07-20 06:00:40

不完全一样,但我的答案here可能会很有用。

我建议在您的情况下,最简单的方法确实是定义两个目录条目,并让Kedro保存到这两个条目中(并从本地条目加载以获得额外的速度),这给了您最终的灵活性,尽管我承认这并不是最漂亮的。

在避免所有节点函数需要返回两个值方面,我建议对使用特定标签标记的某些节点应用装饰器,例如,tags=["s3_replica"]从以下脚本(从我的一个同事那里窃取)中获得灵感:

代码语言:javascript
运行
复制
class S3DataReplicationHook:
    """
    Hook to replicate the output of any node tagged with `s3_replica` to S3.

    E.g. if a node is defined as:
        node(
            func=myfunction,
            inputs=['ds1', 'ds2'],
            outputs=['ds3', 'ds4'],
            tags=['tag1', 's3_replica']
        )

    Then the hook will expect to see `ds3.s3` and `ds4.s3` in the catalog.
    """

    @hook_impl
    def before_node_run(
        self,
        node: Node,
        catalog: DataCatalog,
        inputs: Dict[str, Any],
        is_async: bool,
        run_id: str,
    ) -> None:
        if "s3_replica" in node.tags:
            node.func = _duplicate_outputs(node.func)
            node.outputs = _add_local_s3_outputs(node.outputs)


def _duplicate_outputs(func: Callable) -> Callable:
    def wrapped(*args, **kwargs):
        outputs = func(*args, **kwargs)
        return (outputs,) + (outputs,)

    return wrapped


def _add_local_s3_outputs(outputs: List[str]) -> List[str]:
    return outputs + [f'{o}.s3' for o in outputs] 

上面的代码是一个钩子,所以你可以把它放在你的项目的hooks.py文件中(或者任何你想要的地方),然后把它导入到你的settings.py文件中,放入:

代码语言:javascript
运行
复制
from .hooks import ProjectHooks, S3DataReplicationHook

hooks = (ProjectHooks(), S3DataReplicatonHook())

在你的settings.py里。

您可以稍微巧妙地处理输出命名约定,使其仅复制某些输出(例如,您可能同意所有以.local结尾的目录条目也必须具有相应的.s3条目,并且您可以相应地修改该挂钩中nodeoutputs,而不是对每个输出都这样做。

如果您想要更聪明,您可以使用after_catalog_created挂钩将相应的S3条目注入到目录中,而不是按照您选择的命名约定在您的目录中手动编写数据集的S3版本。不过,我认为从长远来看,编写S3条目更具可读性。

票数 2
EN

Stack Overflow用户

发布于 2021-07-20 05:53:30

我可以想到两种方法。一种更简单的方法是同时对云和本地使用--env conf。https://kedro.readthedocs.io/en/latest/04_kedro_project_setup/02_configuration.html#additional-configuration-environments

代码语言:javascript
运行
复制
conf
├── base
│   └── 
├── cloud
│   └── catalog.yml
└── my_local_env
    └── catalog.yml

您可以根据想要使用的环境调用kedro run --env=cloudkedro run --env=my_local

另一种更高级的方法是使用TemplatedConfigLoader https://kedro.readthedocs.io/en/stable/kedro.config.TemplatedConfigLoader.html

代码语言:javascript
运行
复制
conf
├── base
│   └── catalog.yml
├── cloud
│   └── globals.yml (contains `base_path:s3-prefix-path`)
└── my_local
    └── globals.yml (contains `base_path:my_local_path`)

catalog.yml中,您可以这样引用base_path

代码语言:javascript
运行
复制
my_dataset:
    filepath: s3:${base_path}/my_dataset

您可以根据想要使用的环境调用kedro run --env=cloudkedro run --env=my_local

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68447184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档