我有一个Web应用程序,需要发送有关其使用情况的报告,我想将Amazon RedShift用作为此目的的数据仓库,
我应该如何收集数据?

每次用户与我的应用程序交互时,我都希望报告该问题。那么,我应何时将文件写入S3?多少?
我的意思是:
-如果不立即发送信息,则可能由于连接断开而丢失信息,或者由于系统中的一些错误而导致信息丢失,并且准备将其发送到S3 ...
-如果我确实在每次用户交互时都将文件写入S3,则最终我将得到数百个文件(每个文件上的数据最少),这些文件在复制到RedShift后需要进行管理,排序和删除。就像一个很好的解决方案。

我想念什么?我应该使用DynamoDB,还是应该在Redshift中使用简单插入!
如果确实需要将数据写入DynamoDB,则复制后应该删除保留表..最佳做法是什么?

无论如何,在RedShift中避免数据重复的最佳实践是什么?

感谢帮助!

最佳答案

最好先聚合事件日志,然后再将其吸收到Amazon Redshift中。

好处是:

  • 您将使用Redshift的并行性质更好; S3(或来自大型DynamoDB表)中一组较大文件上的COPY速度比单独插入一个小文件或COPY的快得多。
  • 您可以在将数据加载到Redshift之前,对数据进行预先排序(特别是如果排序基于事件时间)。这还可以提高您的加载性能,并减少对表的VACUUM的需求。

  • 在将事件汇总并加载到Redshift之前,您可以在多个地方累积事件:
  • 到S3的本地文件-最常见的方法是在客户端/服务器上聚合日志,每x MB或y分钟将它们上传到S3。有许多支持此功能的日志附加程序,您无需在代码中进行任何修改(例如FluentDLog4J)。这只能通过容器配置来完成。缺点是您可能会丢失一些日志,并且可以在上载之前删除这些本地日志文件。
  • DynamoDB -如@Swami所述,DynamoDB是积累事件的一种非常好的方法。
  • Amazon Kinesis-最近发布的服务也是一种将事件从各种客户端和服务器以快速可靠的方式流式传输到中心位置的好方法。这些事件按插入顺序排列,这使得以后将其预先分类到Redshift时很容易加载它。这些事件在Kinesis中存储24小时,例如,您可以安排每小时从kinesis读取并加载到Redshift,以提高性能。

  • 请注意,所有这些服务(S3,SQS,DynamoDB和Kinesis)都允许您从最终用户/设备直接将事件推送到事件,而无需通过中间Web服务器。这可以显着提高服务的高可用性(如何处理增加的负载或服务器故障)和系统成本(您只需为使用的内容付费,而不必为日志仅使用未充分利用的服务器)。

    例如,在此处查看如何获取移动设备的临时安全 token :http://aws.amazon.com/articles/4611615499399490

    允许与这些服务直接交互的另一套重要工具是各种SDK。例如对于Java.NETJavaScriptiOSAndroid

    关于重复数据删除要求;在上面的大多数选项中,您都可以在聚合阶段执行此操作,例如,当您从Kinesis流中读取内容时,可以检查事件中是否有重复项,但是可以在放入事件之前分析大量事件进入数据存储。

    但是,您也可以在Redshift中进行此检查。一个好的实践是将数据COPY到暂存表中,然后SELECT INTO一个组织良好且排序良好的表。

    您可以实现的另一种最佳实践是每天(或每周)进行表分区。即使您希望有一个大的长事件表,但大多数查询都在一天中运行(例如,最后一天),您也可以创建一组结构相似的表(events_01012014,events_01022014,events_01032014) ...)。然后,您可以SELECT INTO ... WHERE date = ...到每个表。如果要查询多天的数据,可以使用UNION_ALL

    10-05 21:14
    查看更多