亚马逊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" 的等价物,您可以:

&gt; 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 之后似乎有一些尾随字节,但 zcatbzcat 方便地只是向 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的主要内容,如果未能解决你的问题,请参考以下文章

为亚马逊 s3 上的每个视频商店创建缩略图的最佳方法是啥?

亚马逊 S3 服务器上的 Concat MP3/媒体音频文件

强制从 s3 亚马逊服务器下载

从亚马逊s3桶下载文件的Javascript?

aws S3使用总结

WinHttp 不会从 WinXP 上的 Amazon S3 下载