如何将 Apache Streaming 与 DynamoDB Stream 结合使用



我们有一个要求,即每当向最终用户投放广告时,我们都会在 DynamoDB 表中记录事件。在 dynamoDB 表中,每秒有超过 250 次写入此表。

我们希望汇总这些数据并将其移动到 Redshift 进行分析。

我想,对于表中的每个插入,都会调用 DynamoDB 流。如何将 DynamoDB 流馈送到某种批次中,然后处理这些批次。有没有关于这类用例的最佳实践?

我正在阅读有关apache spark的信息,似乎使用Apache Spark我们可以进行这种聚合。但 apache 火花流不会读取 DynamoDB 流。

任何帮助或指示不胜感激。

谢谢

DynamoDB 流有两个接口:低级 API 和 Kinesis Adapter。Apache Spark具有Kinesis集成,因此您可以将它们一起使用。如果您想知道应该使用哪种 DynamoDB 流接口,AWS 建议使用 Kinesis Adapter 。

下面介绍如何将 Kinesis 适配器用于 DynamoDB。

还有几件事需要考虑:

与其使用 Apache
  • Spark,不如看看 Apache Flink。它是一个流优先解决方案(Spark 使用微批处理实现流(,具有更低的延迟、更高的吞吐量、更强大的流运算符,并支持循环处理。它还有一个Kinesis适配器

  • 您可能
  • 不需要 DynamoDB 流即可将数据导出到 Redshift。您可以使用 Redshift 命令导出数据。

Amazon 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);
}

最新更新