24

我有一个Web应用程序需要发送有关其使用情况的报告,我想使用Amazon RedShift作为此目的的数据仓库, 我应该如何收集数据 ?将数据(增量式)加载到Amazon Redshift,S3和DynamoDB中vs插入

每次,用户与我的应用程序进行交互,我想报告..所以我应该什么时候写文件到S3?和多少? 我的意思是: - 如果不立即发送信息,那么我可能会因连接丢失或系统中的某个错误而丢失它,因为它已被收集并准备好发送到S3 .. 。 - 如果我在每次用户交互时将文件写入S3,我最终会得到数百个文件(每个文件上的数据都很少),需要在复制到RedShift后进行管理,排序和删除。似乎不是一个好的解决方案。

我在想什么?我应该使用DynamoDB吗?我应该使用简单的插入到Redshift中吗?
如果我确实需要将数据写入DynamoDB,我应该在复制后删除保留表。最佳实践是什么?

在任何情况下,避免RedShift中数据重复的最佳做法是什么?

感谢帮助!

+0

http://stackoverflow.com/questions/38300416/how-to-load-files-from-zip-files-present-in-s3-to-redshift-using-copy-command – AWSDeveloper

回答

41

在将它们摄入Amazon Redshift之前,首选聚合事件日志。

的好处是:

  • 您将使用并行性质红移更好的; COPY对于S3中的一组较大文件(或来自大型DynamoDB表)将为,比单独的小文件的INSERT或COPY快多了

  • 您可以预先分类您的数据(尤其是如果排序是基于事件时间),然后将其加载到Redshift中。这也可以提高您的负载性能,并减少对表格VACUUM的需求。

可以积累在几个地方你的事件之前聚集并装入红移:

  • 本地文件到S3 - 最常见的方式是聚集在客户端上你的日志/服务器,每x MB或y分钟上传到S3。有许多日志appender支持此功能,并且不需要对代码进行任何修改(例如,FluentDLog4J)。这只能通过容器配置完成。不利的一面是您可能会丢失一些日志,并且可以在上传之前删除这些本地日志文件。

  • DynamoDB - 正如@Swami所述,DynamoDB是一种积累事件的好方法。

  • Amazon Kinesis - 最近发布的服务也是将您的活动从各种客户端和服务器以快速可靠的方式传输到中央位置的好方法。这些事件按照插入的顺序排列,这使得稍后将其加载到Redshift中很容易。事件存储在Kinesis中24小时,您可以安排从kinesis中读取数据并每小时加载到Redshift,例如,以获得更好的性能。

请注意,所有这些服务(S3,SQS,DynamoDB和室壁运动)让你推动直接从终端用户/设备的事件,而不需要经过一个中间Web服务器。这可以显着提高您的服务的高可用性(如何处理增加的负载或服务器故障)和系统成本(您只需支付您使用的费用,而您不需要将未充分利用的服务器仅用于日志)。

见,例如,你怎么能得到暂时的安全令牌,这里的移动设备:http://aws.amazon.com/articles/4611615499399490

的工具的另一个重要的设置为允许直接互动与这些服务是各种SDK秒。例如对于Java.NET,JavaScript,iOSAndroid

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

但是,您也可以在Redshift中进行此项检查。一个好的做法是将COPY的数据放入登台表中,然后将SELECT INTO组织好并排序好的表。

您可以实现的另一个最佳实践是拥有每日(或每周)的表分区。即使您希望有一个很长的事件表,但大多数查询都是在一天内(例如最后一天)运行,您可以创建一组具有类似结构的表(events_01012014,events_01022014,events_01032014 ...)。然后你可以SELECT INTO ... WHERE date = ...到每个表格。当您想要查询多天的数据时,可以使用UNION_ALL

+0

谢谢盖伊,你的回答非常详细,我想我会利用S3作为解决方案来聚合我的数据。 但有一件事我不确定我是否明白,为什么你是你声称我不需要通过中间Web服务器? –

+0

您可以直接将对象上传到S3。看到这里:http://docs.aws.amazon.com/AmazonS3/latest/dev/PresignedUrlUploadObject.html – Guy

+0

'你可以安排从kinesis阅读和加载到Redshift每小时' - 任何链接如何做到这一点,请? –

6

要考虑的一个选择是在DynamoDB中创建时间序列表,您可以在DynamoDB中每天或每周创建一个表来编写每个用户交互。在时间段结束时(日,小时或周),您可以将日志复制到Redshift。

有关详细信息,对DynamoDB的时间序列表中看到这样的图案:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GuidelinesForTables.html#GuidelinesForTables.TimeSeriesDataAccessPatterns

和这个博客:

http://aws.typepad.com/aws/2012/09/optimizing-provisioned-throughput-in-amazon-dynamodb.html

红移DynamoDB复制:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/RedshiftforDynamoDB.html

希望这有助于。

1

只是在这里有点自私,并且确切地描述了事件分析平台Snowplow的功能。他们使用这种真棒独特的方式从客户端收集事件日志并将其聚合到S3上。

他们为此使用Cloudfront。您可以做的是,在S3存储桶之一中放置一个像素,并将该存储桶放在CloudFront分配之后作为原点。为相同的CloudFront启用日志到S3存储桶。

无论何时在客户端调用该像素(与谷歌分析类似),您都可以将日志作为URL参数发送。这些日志然后可以使用复制来丰富并添加到Redshift数据库。

这解决了日志聚合的目的。这个设置将会为你处理所有这些。

您还可以查看Piwik这是一个开源分析服务,并查看是否可以根据您的需求修改它。

2

虽然已经有一个公认的答案在这里,AWS推出了新的服务,称为Kinesis Firehose根据用户定义的时间间隔,暂时上传到S3和上传(SAVE)红移,重试和错误处理,吞吐量它处理的聚集管理等...

这可能是最简单和最可靠的方法。

1

您可以将数据写入本地磁盘上的CSV文件,然后运行Python/boto/psycopg2脚本将数据加载到Amazon Redshift。使用boto Python模块和多上传

  1. 压缩和加载数据到S3:

    在我CSV_Loader_For_Redshift我做到这一点。

    conn = boto.connect_s3(AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY) 
    bucket = conn.get_bucket(bucket_name) 
    k = Key(bucket) 
    k.key = s3_key_name 
    k.set_contents_from_file(file_handle, cb=progress, num_cb=20, 
    reduced_redundancy=use_rr) 
    
  2. 使用psycopg2 COPY命令将数据添加红移表。

    sql=""" 
    copy %s from '%s' 
    CREDENTIALS 'aws_access_key_id=%s;aws_secret_access_key=%s' 
    DELIMITER '%s' 
    FORMAT CSV %s 
    %s 
    %s 
    %s;""" % (opt.to_table, fn, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY,opt.delim,quote,gzip, timeformat, ignoreheader) 
    
相关问题