在本地模式和Yarn集群中运行Flink的结果不同

时间:2018-04-24 16:15:51

标签: java apache-flink

我使用 Flink Java API运行代码,该API从 Kafka 获取一些字节并通过使用其他库插入 Cassandra 数据库来解析它 static 方法(解析和插入结果都由库完成)。在IDE中的本地运行代码,我得到了所需的答案,但是在 YARN 集群上运行,解析方法没有按预期工作!

public class Test {
    static HashMap<Integer, Object> ConfigHashMap = new HashMap<>();

    public static void main(String[] args) throws Exception {

        CassandraConnection.connect();
        Parser.setInsert(true);

        stream.flatMap(new FlatMapFunction<byte[], Void>() {
            @Override
            public void flatMap(byte[] value, Collector<Void> out) throws Exception {
                Parser.parse(ByteBuffer.wrap(value), ConfigHashMap);
                // Parser.parse(ByteBuffer.wrap(value));
            }
        });
        env.execute();
    }
}

Parser类中有一个静态HashMap字段,解析数据的配置基于其信息,数据将在执行期间插入。在YARN上运行的问题是此数据无法用于taskmanagers,他们只打印config is not available!

所以我将HashMap重新定义为parse方法的参数,但结果没有差异!

我该如何解决问题?

1 个答案:

答案 0 :(得分:0)

我将静态方法和字段更改为非静态,并使用RichFlatMapFunction解决了问题。

stream.flatMap(new RichFlatMapFunction<byte[], Void>() {
            CassandraConnection con = new CassandraConnection();
            int i = 0 ;

            @Override
            public void open(Configuration parameters) throws Exception {
                super.open(parameters);
                con.connect();
            }

            @Override
            public void flatMap(byte[] value, Collector<Void> out) throws Exception {

                ByteBuffer tb = ByteBuffer.wrap(value);
                np.parse(tb, ConfigHashMap, con);
            }
        });