2

时,我有一个AWS Kinesis流水流将数据放入S3具有以下配置:串连S3文件使用AWS流水

S3 buffer size (MB)*  2 
S3 buffer interval (sec)* 60 

,一切工作正常。唯一的问题是Firehose为每个数据块创建一个s3文件。 (在我的情况下,每分钟一个文件,如截图中所示)。随着时间的推移,这是很多文件:每天1440个文件,每年525k个文件。

enter image description here

这是很难管理(例如,如果我想水桶复制到另外一个我需要一个到每一个文件一个副本,这将需要时间)。

两个问题:

  • 有没有办法告诉室壁运动到组/串连旧文件一起。 (例如,超过24小时的文件会在一天内分组为一块)。
  • 当从s3文件过多而不是几个COPY的红移性能受到影响?我还没有精确地衡量这一点,但根据我的经验,很多小文件的表现都非常糟糕。从我记得的情况来看,使用大文件时,大约2M行的COPY约为1分钟左右。 2M行有很多小文件(大约11k文件),需要长达30分钟。

我的两个主要问题是:

  • 更好的红移COPY演奏(S3)
  • 更容易整体S3文件管理(备份,任何形式的操纵)

回答

3

最简单的为您修复会增加firehose缓冲区大小和时间限制 - 您可以上升到15分钟,这将每天将1440个文件减少到每天96个文件(除非您达到文件大小限制)。除此之外,Kinesis中没有任何内容可以为您为您的文件进行连接,但您可以设置一个S3生命周期事件,每次创建一个新的Kinesis文件时触发它,并将一些自己的代码添加到(可能正在运行) EC2或者与Lambda一起无服务器)并自己进行连接。

无法评论红移加载性能,但我怀疑这不是一个巨大的交易,如果它是 - 或将成为一个,我怀疑AWS会做一些有关性能,因为这是他们设置的使用模式。

1

Kinesis Firehose旨在允许近乎实时地处理事件。它针对这种使用情况进行了优化,因此您可以设置更小更频繁的文件。通过这种方式,您可以更快地获取Redshift中的查询数据,或者更频繁地调用小文件上的Lambda函数。

对于服务的客户来说,为较长的历史查询准备数据也很常见。即使可以在Redshift上运行这些长期查询,对于这些查询使用EMR也许是有意义的。然后,您可以保留Redshift群集以适应最近流行的最新事件(例如,SSD上的“热”群集3个月,硬盘上的“冷”群集1年)。

它是有道理的,你会采取较小(未压缩?)文件存储在Firehose输出S3存储桶中,并将它们转移到更多的EMR(Hadoop/Spark/Presto)优化格式。您可以使用服务,如S3DistCp或类似的功能,将采取较小的文件,连接它们并将其格式转换为Parquet格式。

关于Redshift COPY的优化,您在聚合事件的时间和复制它们所花费的时间之间保持平衡。的确,在复制到Redshift时最好有更大的文件,因为每个文件的开销都很小。但另一方面,如果您每隔15分钟复制一次数据,则可能会有“安静”的时间表示您没有利用网络或集群在这些COPY命令之间摄取事件的能力。你应该找到对业务有利的平衡点(你需要多少新鲜的事情)和技术方面(你每天可以摄取多少次事件给你的Redshift)。

1

我遇到了类似的问题,其中文件数量太多,无法处理。这里有一个有用的解决方案:

i)将缓冲区大小增加到最大值。 (128 MB)

ii)将时间缓冲区增加到最大值。 (900秒)

iii)不是一次发布一个记录,而是一个俱乐部多个记录(通过一条线分隔),制作一个kinesis消防记录(KF记录的最大尺寸为:1000 KB )。

iv)此外,俱乐部多重kinesis firehose记录形成一个批次,然后做批处理。 (http://docs.aws.amazon.com/firehose/latest/APIReference/API_PutRecordBatch.html

这将使一个s3对象发布为:kinesis流水线可容纳的批处理数量。

希望这会有所帮助。

+0

是的。不幸的是,在我的情况下,我希望记录能够快速传递。我不能等待900秒,因为我需要半实时的新数据。所以我正在考虑一个解决方案,将所有数据加载到redshift中,然后在一个(或几个)s3文件中立即卸载所有数据。 –

+0

适合用例的另一种思路: i)在您的S3存储桶上安装AWS Lambda。 ii)根据需要保留AWS kinesis firehose流设置。 iii)因此,如问题所述,将会有太多的文件。 iv)现在,无论何时将发布到存储桶,Lambda函数都会触发将多个文件合并为一个并将其放入不同的存储桶中。如果您不想将其放入不同的存储桶中,可以将其放入具有不同前缀的相同存储桶中,以便它不会再次触发lambda功能。这会更简单。 –