亚马逊s3上的zcat
Posted
技术标签:
【中文标题】亚马逊s3上的zcat【英文标题】:zcat on amazon s3 【发布时间】:2011-12-05 11:40:35 【问题描述】:我想知道是否可以对存储在 amazon s3 上的 gzip 文件进行分类。也许使用一些流媒体客户端。你怎么看?
我们正在寻找类似于zcat s3://bucket_name/your_file | grep "log_id"
的操作
【问题讨论】:
【参考方案1】:来自S3 REST API » Operations on Objects » GET Object:
要使用 GET,您必须对对象具有 READ 访问权限。如果您授予匿名用户 READ 访问权限,则可以在不使用授权标头的情况下返回对象。
如果是这样,您可以使用:
$ curl <url-of-your-object> | zcat | grep "log_id"
或
$ wget -O- <url-of-your-object> | zcat | grep "log_id"
但是,如果您尚未授予对象的匿名 READ 访问权限,则需要创建并发送授权标头作为 GET
请求的一部分,而使用 curl
/wget
会变得有些乏味.幸运的是,有人已经做到了,那就是 Perl aws script by Tim Kay 和 recommended by Hari。请注意,您不必将 Tim Kay 的脚本放在您的路径上或以其他方式安装它(除了使其可执行),只要您使用以 aws
开头的命令版本,例如。
$ ./aws cat BUCKET/OBJECT | zcat | grep "log_id"
【讨论】:
【参考方案2】:您还可以使用 s3cat,它是 Tim Kay 的 AWS 命令行工具包的一部分:
http://timkay.com/aws/
要获得 zcat FILENAME | grep "log_id"
的等价物,您可以:
> s3cat BUCKET/OBJECT | zcat - | grep "log_id"
【讨论】:
【参考方案3】:今天发现了这个帖子,并且喜欢 Keith 的回答。快进到今天完成的 aws cli:
aws s3 cp s3://some-bucket/some-file.bz2 - | bzcat -c | mysql -uroot some_db
可能会为其他人节省一点时间。
【讨论】:
【参考方案4】:不完全是 zcat,但使用 hadoop 从 S3 并行下载大文件的方法可能是 http://hadoop.apache.org/common/docs/current/distcp.html
hadoop distcp s3://YOUR_BUCKET/your_file /tmp/your_file
或
hadoop distcp s3://YOUR_BUCKET/your_file hdfs://master:8020/your_file
也许从这一点开始,您可以通过管道传输 zcat...
要添加您的凭据,您必须编辑 core-site.xml 文件:
<configuration>
<property>
<name>fs.s3.awsAccessKeyId</name>
<value>YOUR_KEY</value>
</property>
<property>
<name>fs.s3.awsSecretAccessKey</name>
<value>YOUR_KEY</value>
</property>
<property>
<name>fs.s3n.awsAccessKeyId</name>
<value>YOUR_KEY</value>
</property>
<property>
<name>fs.s3n.awsSecretAccessKey</name>
<value>YOUR_KEY</value>
</property>
</configuration>
【讨论】:
【参考方案5】:如果您的操作系统(可能)支持它,您可以使用/dev/fd/1
作为aws s3 cp
的目标:
aws s3 cp s3://bucket_name/your_file /dev/fd/1 | zcat | grep log_id
EOF 之后似乎有一些尾随字节,但 zcat
和 bzcat
方便地只是向 STDERR
写一个警告。
我刚刚通过像这样直接从 S3 加载一些 DB 转储来确认这是可行的:
aws s3 cp s3://some_bucket/some_file.sql.bz2 /dev/fd/1 | bzcat -c | mysql -uroot some_db
除了您计算机上已有的东西和官方 AWS CLI 工具外,什么都没有。赢了。
【讨论】:
一旦我通过添加破折号将标准输出指定为目标(即aws s3 cp s3://bucket_name/your_file - | zcat | grep log_id
)来修改命令,这对我有用。那是在 Ubuntu 18.04、python 3、aws cli 版本 1.18.43 上。
当我写这篇文章时,AWS CLI 不支持-
== stdin/stdout 的约定。他们很久以前就解决了这个问题。 /dev/fd/1
方式仍然有效......但现在我查看了我的答案,很明显第一个示例中有一个错字(现已修复)。【参考方案6】:
你需要尝试使用s3streamcat,它支持bzip、gzip和xz压缩文件。
安装方式
sudo pip install s3streamcat
用法
用法:
s3streamcat s3://bucketname/dir/file_path
s3streamcat s3://bucketname/dir/file_path | more
s3streamcat s3://bucketname/dir/file_path | grep something
【讨论】:
以上是关于亚马逊s3上的zcat的主要内容,如果未能解决你的问题,请参考以下文章