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

How to use Apache Streaming with DynamoDB Stream

我们有一项要求,每当向最终用户投放广告时,我们都会在 DynamoDB table 中记录事件。在 dynamoDB table.

中每秒有超过 250 次写入此 table

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

我想 table 中的每个插入都会调用 DynamoDB 流。我如何将 DynamoDB 流提供给某种批次,然后处理这些批次。是否有关于此类用例的最佳实践?

我正在阅读有关 apache spark 的文章,似乎我们可以使用 Apache Spark 进行此类聚合。但是 apache spark 流不读取 DynamoDB 流。

感谢任何帮助或指点。

谢谢

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

这里是如何使用Kinesis adapter for DynamoDB

还有几件事需要考虑:

  • 与其使用 Apache Spark,还不如看看 Apache Flink. It is a stream-first solution (Spark implements streaming using micro-batching), has lower latencies, higher throughput, more powerful streaming operators, and has support for cycling processing. It also has a Kinesis adapter

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

Amazon EMR 作为 emr-hadoop-ddb.jar 的一部分提供了此连接器的实现,其中包含 DynamoDBItemWriteable class。使用此 class,您可以实现自己的 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);
}