我想直接从 Internet 上获取一个文件并将其粘贴到 S3 存储桶中,然后将其复制到 PIG 集群中。由于文件的大小和我不太好的互联网连接,首先将文件下载到我的 PC 上,然后将其上传到亚马逊可能不是一个选择。
有什么办法可以抓取互联网文件并将其直接粘贴到 S3 中?
我想直接从 Internet 上获取一个文件并将其粘贴到 S3 存储桶中,然后将其复制到 PIG 集群中。由于文件的大小和我不太好的互联网连接,首先将文件下载到我的 PC 上,然后将其上传到亚马逊可能不是一个选择。
有什么办法可以抓取互联网文件并将其直接粘贴到 S3 中?
通过下载数据curl
并将内容直接传输到 S3。数据直接流式传输到 S3,而不是存储在本地,避免了任何内存问题。
curl "https://download-link-address/" | aws s3 cp - s3://aws-bucket/data-file
如上所述,如果本地计算机上的下载速度太慢,请启动 EC2 实例,ssh
并在那里执行上述命令。
对于经验不足的任何人(如我),以下是通过 EC2 对该过程的更详细描述:
在与目标 S3 存储桶相同的区域中启动 Amazon EC2 实例。最小的可用(默认 Amazon Linux)实例应该没问题,但请确保为其提供足够的存储空间来保存您的文件。如果您需要高于 ~20MB/s 的传输速度,请考虑选择具有较大管道的实例。
启动到新 EC2 实例的 SSH 连接,然后下载文件,例如使用wget
. (例如,要通过 FTP 下载整个目录,您可以使用wget -r ftp://name:passwd@ftp.com/somedir/
.)
使用 AWS CLI(请参阅Amazon 的文档),将文件上传到您的 S3 存储桶。例如,aws s3 cp myfolder s3://mybucket/myfolder --recursive
(对于整个目录)。(在此命令生效之前,您需要将 S3 安全凭证添加到配置文件中,如 Amazon 文档中所述。)
终止/销毁您的 EC2 实例。
[2017 年编辑] 我在 2013 年给出了原始答案。今天我建议使用AWS Lambda下载文件并将其放在 S3 上。这是预期的效果 - 将对象放置在不涉及服务器的 S3 上。
[原答案] 不能直接做。
为什么不使用 EC2 实例而不是本地 PC 来执行此操作?从 EC2 到 S3 在同一区域的上传速度非常好。
关于从/到s3的流读/写我使用python的smart_open
您可以使用 Python 将文件从 Internet 流式传输到 AWS S3。
s3=boto3.resource('s3')
http=urllib3.PoolManager()
urllib.request.urlopen('<Internet_URL>') #Provide URL
s3.meta.client.upload_fileobj(http.request('GET', 'Internet_URL>', preload_content=False), s3Bucket, key,
ExtraArgs={'ServerSideEncryption':'aws:kms','SSEKMSKeyId':'<alias_name>'})