在大数据实时处理领域,Flink 作为流批一体的计算引擎已经成为事实标准。而2.2版本带来的增强型连接器生态,让数据在不同系统间的流转变得前所未有的简单。最近我在一个跨国电商项目中,就成功用这套技术栈打通了从AWS数据源到多种存储系统的实时管道。
这个方案最吸引人的地方在于:原本需要编写大量定制代码的数据路由逻辑,现在通过配置就能实现。比如将DynamoDB的订单变更事件,经过Kinesis流转后,最终同步到Elasticsearch做商品推荐,整个过程就像搭积木一样直观。下面我就拆解这套架构的具体实现。
推荐使用Flink 2.2.3以上版本,这个版本修复了多个连接器的稳定性问题。Maven依赖需要包含以下核心组件:
xml复制<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-aws-kinesis_2.12</artifactId>
<version>2.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-connector-elasticsearch7_2.12</artifactId>
<version>2.2.3</version>
</dependency>
注意:AWS相关连接器需要额外配置IAM权限,建议为每个服务创建独立的访问策略。比如DynamoDB连接器至少需要
dynamodb:DescribeStream和dynamodb:GetRecords权限。
在AWS控制台需要特别注意:
NEW_AND_OLD_IMAGES作为流视图类型使用DynamoDBStreamsSource可以低延迟捕获表变更事件。关键配置参数:
java复制Properties sourceProps = new Properties();
sourceProps.setProperty("aws.region", "us-east-1");
sourceProps.setProperty("stream.initpos", "LATEST");
DynamoDBStreamsSource<String> dynamoSource = new DynamoDBStreamsSource<>(
new SimpleStringSchema(),
sourceProps,
"MyTableStreamARN"
);
实测中发现三个优化点:
polling.wait.timeout为3000ms可平衡延迟与资源消耗JsonNodeDeserializationSchema这里采用KinesisSource配合ElasticsearchSink实现:
java复制ElasticsearchSink.Builder<String> esSinkBuilder = new ElasticsearchSink.Builder<>(
Collections.singletonList(new HttpHost("es-host", 9200, "https")),
(element, ctx, indexer) -> {
indexer.add(
Requests.indexRequest()
.index("orders_idx")
.source(element, XContentType.JSON)
);
}
);
esSinkBuilder.setBulkFlushInterval(5000);
踩坑记录:Elasticsearch的
_id生成策略要特别注意。我们最终采用DynamoDB主键+时间戳的组合键,避免文档覆盖。
针对不需要实时但要求可靠性的场景(如用户行为日志),采用Firehose+S3中转的方案:
java复制// S3文件读取源
FileInputFormat<String> inputFormat = new TextInputFormat(new Path("s3://bucket/prefix"));
inputFormat.setFilesFilter(FilePathFilter.createDefaultFilter());
// MongoDB写入器
MongoSink<String> mongoSink = MongoSink.<String>builder()
.setUri("mongodb://user:pass@host:27017")
.setDatabase("analytics")
.setCollection("user_events")
.setBatchSize(1000)
.build();
通过压力测试得出以下经验值:
java复制env.enableCheckpointing(60000);
env.getCheckpointConfig().setMinPauseBetweenCheckpoints(30000);
env.getCheckpointConfig().setCheckpointTimeout(120000);
特别提醒:DynamoDB流连接器要设置execution.checkpointing.unaligned=true避免背压问题。
现象:端到端延迟超过10秒
排查步骤:
IteratorAgeMillisecondsbulk.queue.size)解决方案组合:
这套架构经过验证也适用于:
在最近的一次压力测试中,单管道处理能力达到12,000 records/s,端到端延迟控制在3秒内。最让我惊喜的是,整个系统在AWS可用区中断时自动恢复了数据流,这得益于Flink的检查点机制与Kinesis的多AZ存储特性。