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) 
    
相關問題