Flink流式传输作业未按预期进行扩展

时间:2018-05-26 09:09:25

标签: apache-flink flink-streaming

我们正在测试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

如图所示,缩放几乎没有。任何线索?感谢。

2 个答案:

答案 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分区是否行为不当(通过检查接收器的延迟,这将在每个分区的基础上报告)。你可以寻找背压。