S3 AWK的bash管道(s3 awk bash pipeline)

2019-10-30 03:46发布

关注此问题拆分出一个大文件 。

我想管从亚马逊呼叫s3://含有大量gzip文件,对它们进行处理桶的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/

你觉得我可以包装在同一管道所能避免本地写入文件?

我可以用使用gzip压缩的文件与AWS命令转移到能够gzip和复制的飞行,但里面的awk gzip压缩将是巨大的。

谢谢。

Answer 1:

我花了一点要明白,你的管道创建在源文件中每行一个“分裂。 日期的文件。因为蛋壳管道字节流,而不是文件进行操作,而S3上的文件(对象)进行操作,你必须把你的字节流为一组送他们回S3之前在本地存储的文件。因此,管道本身是不够的。

不过,我会问:什么是你努力实现更大的目的是什么?

你的路径,产生大量的S3对象,一个是你的“大gzip文件”的每一行上。 这是使用S3作为一个键值存储? 我会问,如果这是你努力的目标,最好的设计? 换句话说,是S3的最佳存储库信息或这里其他一些商店(DynamoDB,或其他的NoSQL),这将是一个更好的解决方案吗?

祝一切顺利



Answer 2:

两种可能的优化:

  • 在大型和多个文件,这将有助于使用所有内核gzip压缩的文件,使用xargs的,pigz或GNU并行

Gzip已与所有核心

  • 并行S3上传: https://github.com/aws-samples/aws-training-demo/tree/master/course/architecting/s3_parallel_upload


文章来源: s3 awk bash pipeline