Flink AsyncDataStream如何传递和使用配置参数

时间:2017-05-02 15:53:41

标签: java apache-flink

我在Main()函数中有这个代码:

DataStream<OutputObject> asyncResultStream = AsyncDataStream.orderedWait(
            listOfData,
            new CustomAsyncConnector(),
            5,
            TimeUnit.SECONDS,
            10).setParallelism(3).startNewChain().uid("customUid");

在1.2中使用AsyncDataStreams的简单格式。 CustomAsyncConnector中的代码就像您将在其核心找到的每个示例一样:

public class CustomAsyncConnector extends RichAsyncFunction<CustomObject, ResultObject> {

private transient Session client;

@Override
public void open(Configuration parameters) throws Exception {
    client = Cluster.builder().addContactPoint("<CustomUrl>")
            .withPort(1234)
            .build()
            .connect("<thisKeyspace>");
}
@Override
public void close() throws Exception {
    client.close();
}
@Override
public void asyncInvoke(final CustomObject ctsa, final AsyncCollector<ResultObject> asyncCollector) throws Exception {

    //Custom code here...

}

}

现在我的问题是: 1.)在CustomAsyncConnector()中将“参数”传递给open()函数的正确方法是什么,从而在Main()函数中调用它。 2.)如何在open()函数中使用参数来建立与客户端的连接?

我对第一个问题的猜测是在main中创建一个新的CustomAsyncConnector()对象实例,然后直接调用open()函数并将参数对象传递给它,然后将该实例放在AsysDataStream的代码中。但是我不确定这是否是最佳方式,或者更重要的是,在Configuration类型对象中设置字段的正确方法(再次假设执行“configParameters.setString(”contactPointUrl“,”127.0.0.1“)) “是对的,但我不确定。”这导致了我的第二个,也是最重要的问题。

关于我的第二个问题,我想传递给open()函数的参数是contactPointUrl,portNumber和要放入.connect()的键空间。但是我似乎无法通过执行类似“.addContactPoint(parameters.getString(”contactPointUrl“))”的操作来访问它们。我也尝试过看看是否或者我应该在哪里进行Cluster.builder()。getConfiguration(参数)但是我在黑暗中拍摄甚至属于或者如果有的话,如果参数名称必须是特定的等等。< / p>

所以我希望我没有说得太糟糕,但任何和所有的帮助都会非常感激。

提前致谢!

1 个答案:

答案 0 :(得分:0)

这是最终起作用的。仍然不确定如何将配置参数传递给.open()方法,但是很好。

将此添加到CustomAsyncConnector类:

private final CustomProps props;

public CustomAsyncConnector(CustomProps props) {
    super();
    this.props = props;
}

我在main()方法中传递的内容:

AsyncDataStream
                .unorderedWait(
                        dataToProcess,
                        new CustomAsyncConnector(props),
                        5,
                        TimeUnit.SECONDS,
                        10);

并使用.open()方法中的道具,就像我想要使用参数一样。