【问题标题】:zcat on amazon s3亚马逊s3上的zcat
【发布时间】:2011-12-05 11:40:35
【问题描述】:

我想知道是否可以对存储在 amazon s3 上的 gzip 文件进行分类。也许使用一些流媒体客户端。你怎么看?

我们正在寻找类似于zcat s3://bucket_name/your_file | grep "log_id"的操作

【问题讨论】:

    标签: amazon-s3 amazon


    【解决方案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 Kayrecommended 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
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-10-29
              • 2012-03-30
              • 2010-10-20
              • 2012-05-01
              • 2018-02-10
              • 2013-05-12
              相关资源
              最近更新 更多