我有一个Web应用程序,需要发送有关其使用情况的报告,我想将Amazon RedShift用作为此目的的数据仓库,
我应该如何收集数据?
每次用户与我的应用程序交互时,我都希望报告该问题。那么,我应何时将文件写入S3?多少?
我的意思是:
-如果不立即发送信息,则可能由于连接断开而丢失信息,或者由于系统中的一些错误而导致信息丢失,并且准备将其发送到S3 ...
-如果我确实在每次用户交互时都将文件写入S3,则最终我将得到数百个文件(每个文件上的数据最少),这些文件在复制到RedShift后需要进行管理,排序和删除。就像一个很好的解决方案。
我想念什么?我应该使用DynamoDB,还是应该在Redshift中使用简单插入!
如果确实需要将数据写入DynamoDB,则复制后应该删除保留表..最佳做法是什么?
无论如何,在RedShift中避免数据重复的最佳实践是什么?
感谢帮助!
最佳答案
最好先聚合事件日志,然后再将其吸收到Amazon Redshift中。
好处是:
在将事件汇总并加载到Redshift之前,您可以在多个地方累积事件:
请注意,所有这些服务(S3,SQS,DynamoDB和Kinesis)都允许您从最终用户/设备直接将事件推送到事件,而无需通过中间Web服务器。这可以显着提高服务的高可用性(如何处理增加的负载或服务器故障)和系统成本(您只需为使用的内容付费,而不必为日志仅使用未充分利用的服务器)。
例如,在此处查看如何获取移动设备的临时安全 token :http://aws.amazon.com/articles/4611615499399490
允许与这些服务直接交互的另一套重要工具是各种SDK。例如对于Java,.NET,JavaScript,iOS和Android。
关于重复数据删除要求;在上面的大多数选项中,您都可以在聚合阶段执行此操作,例如,当您从Kinesis流中读取内容时,可以检查事件中是否有重复项,但是可以在放入事件之前分析大量事件进入数据存储。
但是,您也可以在Redshift中进行此检查。一个好的实践是将数据
COPY
到暂存表中,然后SELECT INTO一个组织良好且排序良好的表。您可以实现的另一种最佳实践是每天(或每周)进行表分区。即使您希望有一个大的长事件表,但大多数查询都在一天中运行(例如,最后一天),您也可以创建一组结构相似的表(events_01012014,events_01022014,events_01032014) ...)。然后,您可以
SELECT INTO ... WHERE date = ...
到每个表。如果要查询多天的数据,可以使用UNION_ALL。