Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon s3 Luigi覆盖到S3_Amazon S3_Luigi - Fatal编程技术网

Amazon s3 Luigi覆盖到S3

Amazon s3 Luigi覆盖到S3,amazon-s3,luigi,Amazon S3,Luigi,我有一个例行任务要上传和共享S3 bucket上的转储文件。虽然下面的代码可以工作,但出于某种原因,它不想覆盖该文件 根据文件,我需要 1) 定义两个并行执行的解决方案: path=luigi.Parameter(默认值=glob(DATA\u DIR)[-2],batch\u method=max) 2) 添加resources={'overwrite_resource':1} 虽然它适用于本地文件,但不适用于S3 class report_to_S3(luigi.Task): cli

我有一个例行任务要上传和共享S3 bucket上的转储文件。虽然下面的代码可以工作,但出于某种原因,它不想覆盖该文件

根据文件,我需要 1) 定义两个并行执行的解决方案:
path=luigi.Parameter(默认值=glob(DATA\u DIR)[-2],batch\u method=max)

2) 添加
resources={'overwrite_resource':1}

虽然它适用于本地文件,但不适用于S3

class report_to_S3(luigi.Task):
    client = S3Client()
    path = luigi.Parameter(default=glob(DATA_DIR)[-2], batch_method=max)
    local_dump_path = '../../../data/local_db_dump.csv'
    resources = {'overwrite_resource': 1}

    def requires(self):
        return upload_tweets(path=self.path)

    def output(self):
        self.s3_path = "s3://qclm-nyc-ct/dump/dump.csv"
        return S3Target(self.s3_path, client=self.client)

    def run(self):
        c = sqa.create_engine('postgresql:///qc_soc_media')
        df = pd.read_sql_query('SELECT id, user_id, timestamp, lat, lon, ct FROM tweets WHERE ct IS NOT NULL', c)
        N = len(df)
        df.to_csv(self.local_dump_path, index=None)
        self.client.put(self.local_dump_path, self.output().path,
                        headers={'Content-Type': 'application/csv'})
        send_S3_report(N)


if __name__ == '__main__':
    luigi.run(local_scheduler=True, main_task_cls=report_to_S3)

如果output()方法中指定的目标已存在,则run()方法将不会执行。您可能希望将时间戳写入文件名,或者创建另一个sentinel/标志来指示工作已完成。

谢谢。不幸的是,我不想那样。最初的Luigi允许对本地目标使用resources={'overwrite_resource':1}覆盖此行为,但似乎它对S3 bucket不起作用(一个bug?)'overwrite_resource'只是一种创建资源的技术,它可以防止多个任务同时运行-您可以使用其中的任何字符串。(通常资源是对并发API连接等的限制)。如果不想将时间戳写入文件名,只需创建一些其他指示符,以便在output()方法中使用。如果输出已经存在,任务将不会运行。谢谢,我制作了一个日志文件作为目标,它似乎可以工作。酷。我还应该注意,如果您不想让任务的任何输出目标使用params运行,那么可以为任务编写一个自定义complete()方法。(如果日志文件的存在不是任务成功的原子指示器)谢谢。最后,它似乎比我预期的要复杂一些:我为日志文件创建了一个额外的LocalTarget作为类参数,然后重写
complete
,检查这个LocalTarget是否存在。这种解决方法的原因是我仍然需要
output()
将其他任务指向正确的数据路径(Duh)