我想要一个并行Flink源,它从内存阻塞队列中消耗。我的想法是让应用程序将元素推送到这个队列中,然后Flink pipeline 使用并处理它们。
对此,最佳模式是什么?我看过一些Flink源代码实现(如Kafka、RabbitMQ等),它们都在初始化源实例中所需的 join。我不能这样做(即从每个源实例中初始化队列),因为
每个源实例实例都将创建自己的队列。
目前,我提出了以下建议,但是静态队列的使用对我来说并不合适。
1每个Flink源实例从中获取其元素的队列。
public class TheQueue implements Serializable {
private static final Logger LOGGER = LoggerFactory.getLogger(TheQueue.class);
private transient static final BlockingQueue<Object> OBJECT_QUEUE = new LinkedBlockingQueue<>();
public static SerializableSupplier<Object> getObjectConsumer() {
return () -> {
return OBJECT_QUEUE.take();
}
};
}
2我的 Flink pipeline 节选。
final StreamExecutionEnvironment env = StreamExecutionEnvironment.createLocalEnvironment();
env.setParallelism(10);
env.addSource(TestParallelSourceFunction.getInstance(TheQueue.getObjectConsumer()))
三。Flink源函数。
public class TestParallelSourceFunction extends RichParallelSourceFunction{
private static final Logger LOGGER = LoggerFactory.getLogger(TestParallelSourceFunction.class);
private SerializableSupplier<T> supplier;
// initialisation code
@Override
public void run(final SourceContext<T> ctx) throws Exception {
LOGGER.info("Starting Flink source.");
isRunning = true;
while (isRunning) {
final T t = supplier.get();
if (t != null) {
ctx.collect(t);
}
}
LOGGER.info("Stopped Flink source.");
}