具有远程 (AWS S3) 目标的 Makefile

标签 makefile amazon-s3 mapreduce

我想创建一个 makefile,其中目标和依赖项不是本地文件,而是存在于某个 AWS/S3 存储桶中。

考虑以下示例,它只是将“data_raw”文件复制到“obj1”,然后复制到“obj2”(您需要将“bucket”编辑到您拥有的某个存储桶,并在运行之前创建一些“data_raw”文件) :

# local, works fine
bucket = /tmp/test/
cp = cp

# remote, does not work
bucket = s3://bucket/test/
cp = s3cmd cp

all : $(bucket)obj2

$(bucket)obj2 : $(bucket)obj1
    $(cp) $(bucket)obj1 $(bucket)obj2

$(bucket)obj1 :
    $(cp) $(bucket)raw_data $(bucket)obj1

我得到的错误是:

makefile:9: *** target pattern contains no `%'.  Stop.

这是为了:

all : $(bucket)obj2

我怀疑 make 根本不理解远程 URI(“s3://xxx”)。

我能找到的所有示例/文档似乎都隐含地引用了目标和依赖项的本地文件。广泛的谷歌搜索只产生了一些关于为 s3 创建 ant 任务的看似未完成的想法 (http://code.google.com/p/awstasks/)。

这是在 Python 中运行多个复杂/错综复杂的 MapReduce 作业的上下文中。

我宁愿使用 GNU make,但肯定会考虑替代方案。

我总能为远程目标创建一些轻型本地镜像,但肯定有更好的方法吗?

提前致谢!

尼克

最佳答案

一种可行的解决方法是在本地安装 S3 存储桶。

在 Linux 上,fuse/s3fs大概可以用。这也可能适用于 MacOS,但安装起来似乎真的很麻烦。我求助于商业软件transmit相反(单击“安装为磁盘”)。有了这个,上面的例子对我来说是有用的:

bucket = /Volumes/s3.amazonaws.com/bucket/test/
cp = cp

在此示例中,我们使用“cp”,因为“s3cmd cp”拒绝本地 uris。在(我的)真实示例中,该命令将被一些需要实际 s3 输入/输出 uris 的 python map-reduce 脚本替换。

为了保持整洁,可能应该有一个前缀变量(“/Volumes/s3.amazonaws.com/”)到本地安装的文件(用于 Make 测试存在/最新状态)和一个构建命令指向实际数据的前缀变量(“s3://”)(数据将由 EC2 实例通过 mapreduce 处理,我们绝对不想在本地下载所有内容)。

请记住,S3 只是最终一致的。还要确保为了测试存在性和最新性,不会在本地下载整个文件(在这种情况下应该使用一些虚拟文件)。

希望对您有所帮助。

如果有人有更直接的方法(无需本地安装),我很感兴趣。

尼克

关于具有远程 (AWS S3) 目标的 Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10531878/

相关文章:

c - Makefile 错误 : calc. o 没有这样的文件或目录以及对 pow 的 undefined reference

c - 动态库动态附加

docker - “dockerfile”文本文件忙

video - 通过 HTTP 下载部分视频(用于远程缩略图)

java - hadoop mapreduce Mapper 从文本文件中读取不正确的值

hadoop - map 简化和RDBMS

java - 如何将一个 mapreduce 作业的输出作为另一个 mapreduce 作业的输入?

c++ - 在什么情况下 make 需要以 .h 文件为目标

mysql - 将 CSV 从 S3 上传到 MySQL RDS 第一行被截断

ruby-on-rails - 使用 Carrierwave 加密/解密文件并存储在 S3 (Rails) 中