我想直接抓取互联网文件并将其粘贴到S3存储桶中,然后将其复制到PIG集群。由于文件的大小和我不太好的互联网连接,首先将文件下载到我的电脑上,然后将其上传到亚马逊可能不是一种选择。
我有什么方法可以抓取互联网文件并将其直接插入S3?
答案 0 :(得分:10)
对于经验不足的人(如我),以下是通过EC2对该过程进行更详细的描述:
在与目标S3存储桶相同的区域中启动Amazon EC2实例。最小的可用(默认的亚马逊Linux)实例应该没问题,但一定要给它足够的存储空间来保存你的文件。如果您需要高于~20MB / s的传输速度,请考虑选择具有较大管道的实例。
启动与新EC2实例的SSH连接,然后下载文件,例如使用wget
。 (例如,要通过FTP下载整个目录,可以使用wget -r ftp://name:passwd@ftp.com/somedir/
。)
使用AWS CLI(请参阅Amazon's documentation),将文件上传到S3存储桶。例如,aws s3 cp myfolder s3://mybucket/myfolder --recursive
(对于整个目录)。 (在此命令工作之前,您需要将S3安全凭证添加到配置文件中,如Amazon文档中所述。)
终止/销毁您的EC2实例。
答案 1 :(得分:6)
[2017年编辑] 我在2013年给出了原始答案。今天我建议使用AWS Lambda下载文件并将其放在S3上。这是期望的效果 - 将对象放在S3上而不涉及服务器。
[原始答案] 不可能直接这样做。
为什么不使用EC2实例而不是本地PC呢?在同一地区从EC2到S3的上传速度非常好。
关于从/到s3的流读/写我使用python的smart_open
答案 2 :(得分:4)
通过from flask import Flask
app = Flask(__name__)
app.config['SERVER_NAME'] = 'localhost:5000'
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True)
下载数据并将内容直接传送到S3。数据直接流式传输到S3,不会存储在本地,从而避免了任何内存问题。
curl
如上所述,如果本地计算机上的下载速度太慢,请启动EC2实例curl "https://download-link-address/" | aws s3 cp - s3://aws-bucket/data-file
并在其中执行上述命令。
答案 3 :(得分:0)
您可以使用Python将文件从互联网流式传输到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>'})