【问题标题】:s3 awk bash pipelines3 awk bash管道
【发布时间】:2018-08-28 14:55:58
【问题描述】:

关注这个问题Splitting out a large file

我想从包含大型 gzip 压缩文件的 Amazon s3:// 存储桶中传输调用,并使用 awk 命令处理它们。

要处理的示例文件

...
  {"captureTime": "1534303617.738","ua": "..."}
...

要优化的脚本

aws s3 cp s3://path/to/file.gz - \
 | gzip -d \
 | awk -F'"' '{date=strftime("%Y%m%d%H",$4); print > "splitted."date }'

gzip splitted.*
# make some visual checks here before copying to S3

aws s3 cp splitted.*.gz s3://path/to/splitted/

您认为我可以将所有内容包装在同一管道中以避免在本地写入文件吗?

我可以使用 Using gzip to compress files to transfer with aws command 来进行 gzip 和即时复制,但是在 awk 中进行 gzip 会很棒。

谢谢。

【问题讨论】:

  • 我是否理解正确,您希望在不创建单个临时文件的情况下完成所有这些处理? IE。没有splitted.YYYYMMDDHH?
  • gzip splitted.* 行似乎需要时间和空间。也许我可以在 awk 中 printgzip,而不用直接写 splitted.YYYYMMDDHHsplitted.YYYYMMDDHH.gzip
  • 成本来自于编写临时解压文件。
  • 你还没有告诉我们# make some visual checks here before copying to S3 是什么意思。您是在目视检查 splitted.YYYYMMDDHHsplitted.YYYYMMDDHH.gzip 文件中的内容还是其他内容?
  • 只是纳闷,怎么又打开了。我认为这是重复的:stackoverflow.com/questions/21698296/…

标签: bash amazon-s3 awk


【解决方案1】:

让我明白了您的管道为源文件中的每一行创建一个“拆分。date 文件。由于 shell 管道对字节流而不是文件进行操作,而 S3 对文件进行操作(对象),您必须将字节流转换为本地存储上的一组文件,然后再将它们发送回 S3。因此,仅靠管道是不够的。

但我会问:你想要实现的更大目标是什么?

您正在生成大量 S3 对象,每行一个用于“大型 gzip 压缩文件”。这是使用 S3 作为键值存储吗?我会问这是否是您努力目标的最佳设计?换句话说,S3 是该信息的最佳存储库,还是其他存储(DynamoDB 或其他 NoSQL)会是更好的解决方案?

一切顺利

【讨论】:

  • 你猜对了。整个管道设计得不好。我们正在考虑使用 Redshift 使用按小时划分的 S3 数据,但这是另一个问题
【解决方案2】:

两种可能的优化:

  • 对于大型和多个文件,使用所有内核对文件进行 gzip 压缩、使用 xargs、pigz 或 gnu 并行处理会有所帮助

Gzip with all cores

【讨论】:

  • 很高兴您解决了您的问题,但我不会赞成仅提供链接的答案。为什么不编辑您的 A 以显示增强管道的实际代码,并显示您正在使用哪些命令来“使用所有内核”。我会赞成 ;-) 祝你好运。
  • 我看不出使用所有内核对文件进行 gzip 压缩会如何减少代码生成的文件数量。
  • 它将减少运行代码所花费的时间。我正在尝试优化计算成本和空间成本。我认为awk 命令也可以并行化。如果我按照 cpu 时间的优先级排序脚本:它是gzip,然后是 aws s3 cp,然后是 awkaws s3 是网络时间,但有点不同。
猜你喜欢
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2013-11-24
  • 2011-10-21
  • 2013-02-26
  • 1970-01-01
相关资源
最近更新 更多