我们正在测试Flink的扩展能力。但是我们发现缩放不起作用,无论增加更多插槽还是增加任务管理器的数量。我们期望线性,即使不是接近线性的缩放性能,但结果甚至会显示降级。赞赏任何评论。
测试详情,
-VMWare vsphere
- 只需简单的通过测试,
- auto gen source 3mil records, each 1kb in size, parallelism=1
- source pass into next map operator, which just return the same record, and sent counter to statsD, parallelism is in cases = 2,4,6
3 TM,共6个插槽(2 / TM)每个JM / TM有32个vCPU,100GB内存
结果:
2个插槽:26秒,3mil / 26 = 115k TPS
4个插槽:23秒,3mil / 23 = 130k TPS
6个插槽:22秒,3mil / 22 = 136k TPS
如图所示,缩放几乎没有。任何线索?感谢。
答案 0 :(得分:0)
请参阅示例代码,
public class passthru extends RichMapFunction<String, String> {
public void open(Configuration configuration) throws Exception {
... ...
stats = new NonBlockingStatsDClient();
}
public String map(String value) throws Exception {
... ...
stats.increment();
return value;
}
}
public class datagen extends RichSourceFunction<String> {
... ...
public void run(SourceContext<String> ctx) throws Exception {
int i = 0;
while (run){
String idx = String.format("%09d", i);
ctx.collect("{\"<a 1kb json content with idx in certain json field>\"}");
i++;
if(i == loop)
run = false;
}
}
... ...
}
public class Job {
public static void main(String[] args) throws Exception {
... ...
DataStream<String> stream = env.addSource(new datagen(loop)).rebalance();
DataStream<String> convert = stream.map(new passthru(statsdUrl));
env.execute("Flink");
}
}
reductionState代码,
dataStream.flatMap(xxx).keyBy(new KeySelector<xxx, AggregationKey>() {
public AggregationKey getKey(rec r) throws Exception {
... ...
}
}).process(new Aggr());
public class Aggr extends ProcessFunction<rec, rec> {
private ReducingState<rec> store;
public void open(Configuration parameters) throws Exception {
store= getRuntimeContext().getReducingState(new ReducingStateDescriptor<>(
"reduction store", new ReduceFunction<rec>() {
... ...
}
public void processElement(rec r, Context ctx, Collector<rec> out)
throws Exception {
... ...
store.add(r);
答案 1 :(得分:0)
你真的应该使用RichParallelSourceFunction。如果您关心来自源的不同实例的记录是不同的,您可以从RuntimeContext获取每个实例的索引,该索引可通过RichFunction接口中的getRuntimeContext()方法获得。 / p>
此外,Flink有一个你应该使用的内置statsd metrics reporter而不是自己滚动。此外,numRecordsIn,numRecordsOut,numRecordsInPerSecond和numRecordsOutPerSecond是already being computed for you,因此无需自己创建此检测。您还可以通过Flink的Web界面或REST API访问这些指标。
至于为什么你可能会遇到Kafka消费者的可扩展性差,有很多事情可能导致这种情况。如果您正在使用事件时间处理,那么空闲分区可以保持正常状态(请参阅https://issues.apache.org/jira/browse/FLINK-5479)。如果流是键控的,那么数据偏斜可能是个问题。如果您要连接到外部数据库或服务,那么它很容易成为瓶颈。如果检查点配置错误,可能会导致这种情况。或网络容量不足。
我将通过查看Flink Web UI中的一些关键指标来开始调试。负载在子任务中是否平衡,还是倾斜?您可以启用延迟跟踪,并查看其中一个kafka分区是否行为不当(通过检查接收器的延迟,这将在每个分区的基础上报告)。你可以寻找背压。