0

我們有一個要求,即每當將廣告提供給最終用戶時,我們都會在DynamoDB表中記錄事件。在dynamoDB表中,每秒有超過250次寫入此表。如何在DynamoDB流中使用Apache Streaming

我們希望彙總這些數據並將其移至Redshift進行分析。

DynamoDB流將被調用,每個插入在表中我想。如何將DynamoDB流提供給某種批處理,然後處理這些批處理。圍繞這種用例有什麼最佳實踐嗎?

我正在閱讀有關Apache Spark的內容,似乎和Apache Spark一樣,我們可以做這樣的聚合。但是apache spark流不讀取DynamoDB流。

任何幫助或指針表示讚賞。

由於

回答

1

DynamoDB流具有兩個接口:低級API,和室壁運動適配器。 Apache Spark有Kinesis integration,所以你可以一起使用它們。如果您想知道應該使用哪種DynamoDB流接口,AWS建議使用Kinesis Adapter是推薦的方式。

以下是如何使用Kinesis adapter for DynamoDB

一些事情要考慮:

  • 而不是使用Apache的火花很值得看Apache Flink的。這是一個流優先解決方案(Spark使用微批處理實現流式傳輸),具有更低的延遲,更高的吞吐量,更強大的流媒體運營商,並且支持循環處理。它也有一個Kinesis adapter

  • 可能出現這種情況,您不需要DynamoDB流將數據導出到Redshift。您可以使用Redshift命令導出數據。

+0

嗨伊萬,謝謝你的迴應。我的桌子很大,包含超過1.5億行。這就是我不想使用redshift提供的複製命令加載整個dynamoDB表的原因。想要做一個從dynamoDB到redshift的增量拷貝,並且在這樣做的時候,彙總數據。 –

+0

然後流處理是一個真正可行的選擇。使用Apache Flink/Spark和Kinesis適配器來完成這個技巧。 –

+0

我發現這個https://github.com/awslabs/dynamodb-streams-kinesis-adapter將dynamoDB流轉換爲Kinesis流。我如何安排這個應用程序? Cron在EC2上工作? –

0

亞馬遜EMR提供了這種連接器的一個實現如EMR-Hadoop的ddb.jar,其中包含DynamoDBItemWriteable類的一部分。使用這個類,你可以實現你自己的DynamoDBInputFormat,如下所示。

public class DynamoDbInputFormat implements InputFormat, Serializable { 

    @Override 
    public InputSplit[] getSplits(@NonNull final JobConf job, final int numSplits) throws IOException { 
     final int splits = Integer.parseInt(requireNonNull(job.get(NUMBER_OF_SPLITS), NUMBER_OF_SPLITS 
      + " must be non-null")); 

     return IntStream. 
      range(0, splits). 
      mapToObj(segmentNumber -> new DynamoDbSplit(segmentNumber, splits)). 
      toArray(InputSplit[]::new); 
} 
+0

問題的作者建議他需要做流處理。您已經提供了有關如何將MapReduce與DynamoDB結合使用的答案。我沒有看到MapReduce如何執行流處理。爲此,您需要使用Spark/Flink(請參閱我的答案)。 –

+0

而不是使用MapReduce,您可以直接使用可以使用DynamoDB適配器的EMR Hive:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/EMRforDynamoDB.Tutorial.html並允許運行SQL查詢而不是寫入MapReduce代碼。 –

相關問題