在具有不同路径的单个接收器中发射“侧面输出”和“过程输出”

时间:2018-12-13 17:17:53

标签: apache-flink

如何使用单个接收器发出“侧面输出”和“过程输出”。在这种情况下,两种输出都需要发送到单个接收器,并且基于标记文件夹路径而有所不同

例如

OutputTag<String> outputTag = new OutputTag<String>("side-output") {};    
SingleOutputStreamOperator<String> mainDataStream = source.process(new ProcessFunction<String, String>() {
    @Override
    public void processElement(String value, Context ctx, Collector<String> out) {
        try {
             builder.parse(new InputSource(new StringReader(value)));
             out.collect(value);
        } catch (SAXException | IOException e) {
             ctx.output(outputTag, value);
        }
    }
});
DataStream<String> sideOutputStream = mainDataStream.getSideOutput(outputTag);

还有其他更好的解决方案吗?只是担心性能

2 个答案:

答案 0 :(得分:0)

如果要使用单个接收器,则可以在输出格式中添加属性,并使用该属性来标识单个接收器中的数据源。

您还可以构造两个具有不同参数的接收器,以接收来自不同来源的数据。我认为,在不考虑您使用的数据库的情况下,这种多线程方式具有更好的性能。

答案 1 :(得分:0)

Flink的BucketingSink可以使用Bucketer来确定将使用基本目录中的哪个子目录。因此,您可以使用它来根据要写入的记录中的属性来设置子目录。

就使用单个接收器而言,由于函数的主输出和侧面输出都是String对象(相同类型),因此可以mainDataStream.union(sideOutputStream)将两个流一起from tkinter import * calculator = Tk() calculator.title("Calculator") calculator.resizable(0, 0) class Application(Frame): def __init__(self, master, *args, **kwargs): Frame.__init__(self, master, *args, **kwargs) self.createWidgets() def createWidgets(self): self.display = Entry(self, font=("Helvetica", 16), relief=RAISED, justify=RIGHT) self.display.insert(0, "default value") self.display.grid(row=0, column=0) app = Application(calculator).grid calculator.mainloop() 输出结果。