我使用 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
方法的参数,但结果没有差异!
我该如何解决问题?
答案 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);
}
});