Java 使用Flink'时出现运行时异常;带Cassandra的s映射函数;插入“;但不包括;声明;

Java 使用Flink'时出现运行时异常;带Cassandra的s映射函数;插入“;但不包括;声明;,java,cassandra,datastax,query-builder,apache-flink,Java,Cassandra,Datastax,Query Builder,Apache Flink,在与Cassandra一起试验Flink流时,我在尝试在MapFunction中生成INSERT语句时遇到了一个有趣的问题。如果我使用DataStream,我会得到一个混乱的RuntimeException。然而,通过使用DataStream,一切都按照我的预期工作,即使我仍然在执行的代码中使用Insert实例 我通过反复试验找到了一个解决方案(使用DataStream),但我仍然不清楚是什么导致了这种情况。这是故意的还是错误?我无法通过谷歌搜索找到任何解释,所以不妨在这里问一下是否有人知道发生

在与Cassandra一起试验Flink流时,我在尝试在MapFunction中生成INSERT语句时遇到了一个有趣的问题。如果我使用
DataStream
,我会得到一个混乱的
RuntimeException
。然而,通过使用
DataStream
,一切都按照我的预期工作,即使我仍然在执行的代码中使用
Insert
实例

我通过反复试验找到了一个解决方案(使用
DataStream
),但我仍然不清楚是什么导致了这种情况。这是故意的还是错误?我无法通过谷歌搜索找到任何解释,所以不妨在这里问一下是否有人知道发生了什么

预期输出(使用数据流):

错误输出(使用数据流):

代码示例(针对两种不同的情况切换注释代码):

import java.util.HashMap;
导入java.util.Map;
导入java.util.Map.Entry;
导入org.apache.flink.api.common.functions.MapFunction;
导入org.apache.flink.streaming.api.datastream.datastream;
导入org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
导入org.apache.flink.streaming.api.functions.source.RichSourceFunction;
导入com.datastax.driver.core.Statement;
导入com.datastax.driver.core.querybuilder.Insert;
导入com.datastax.driver.core.querybuilder.querybuilder;
索卡桑德拉库里公共级考试{
公共静态void main(字符串[]args)引发异常{
最终StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
环境(一);
DataStream myDataStream=env.addSource(新的RichSourceFunction(){
@凌驾
公共无效运行(SourceContext ctx)引发异常{
Map Map=newhashmap();
地图放置(“名称”、“测试名称”);
地图.put(“年龄”,27岁);
收集(地图);
}
@凌驾
公开作废取消(){
}
});
/*很好用*/
DataStream debugDatastream=myDataStream.map(新的MapFunction(){
@凌驾
公共语句映射(映射数据行)引发异常{
Insert=QueryBuilder.insertInto(“tablename”);
对于(条目e:datarow.entrySet()){
insert.value(e.getKey(),e.getValue());
}
返回插入;
}
});
/*如果使用“插入”而不是“语句”,则引发RuntimeException*/
//DataStream debugDatastream=myDataStream.map(新的MapFunction(){
//
//@覆盖
//公共插入映射(映射数据行)引发异常{
//Insert=QueryBuilder.insertInto(“tablename”);
//
//对于(条目e:datarow.entrySet()){
//insert.value(e.getKey(),e.getValue());
//                }
//返回插入;
//            }
//        });
debugDatastream.print();
环境执行(“CassandraQueryTest”);
}
}
环境:

  • 爪哇8
  • Flink 1.1.3(来自maven软件包的Cassabdra驱动程序)
  • EclipseIDE

Flink正在分析通过网络发送的类型,以生成快速序列化程序,并允许在构建窗口或在网络上洗牌数据时访问密钥

这里的问题可能是: -当使用
Insert
作为用户类型时,Flink尝试为该类型生成一个
PojoSerializer
,但由于
RuntimeException
而失败。我认为这种行为是不正确的。我已经在弗林克项目中为这个问题提交了一份申请。 -对于
语句
,Flink发现它无法将类型序列化为POJO,因此它会退回到泛型序列化程序(在Flink的例子中是Kryo)


我认为这个文档页面是我们最接近描述Flink序列化堆栈工作原理的页面:

我已经为这个bug打开了一个PR:
log4j:WARN No appenders could be found for logger (org.apache.flink.api.java.typeutils.TypeExtractor).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
Connected to JobManager at Actor[akka://flink/user/jobmanager_1#-638132790]
01/17/2017 15:57:42 Job execution switched to status RUNNING.
01/17/2017 15:57:42 Source: Custom Source -> Map -> Sink: Unnamed(1/1) switched to SCHEDULED 
01/17/2017 15:57:42 Source: Custom Source -> Map -> Sink: Unnamed(1/1) switched to DEPLOYING 
01/17/2017 15:57:42 Source: Custom Source -> Map -> Sink: Unnamed(1/1) switched to RUNNING 
INSERT INTO tablename (name,age) VALUES ('Test Nameson',27);
01/17/2017 15:57:42 Source: Custom Source -> Map -> Sink: Unnamed(1/1) switched to FINISHED 
01/17/2017 15:57:42 Job execution switched to status FINISHED.
Exception in thread "main" java.lang.RuntimeException: The field private java.util.List com.datastax.driver.core.querybuilder.BuiltStatement.values is already contained in the hierarchy of the class com.datastax.driver.core.querybuilder.BuiltStatement.Please use unique field names through your classes hierarchy
    at org.apache.flink.api.java.typeutils.TypeExtractor.getAllDeclaredFields(TypeExtractor.java:1762)
    at org.apache.flink.api.java.typeutils.TypeExtractor.analyzePojo(TypeExtractor.java:1683)
    at org.apache.flink.api.java.typeutils.TypeExtractor.privateGetForClass(TypeExtractor.java:1580)
    at org.apache.flink.api.java.typeutils.TypeExtractor.privateGetForClass(TypeExtractor.java:1479)
    at org.apache.flink.api.java.typeutils.TypeExtractor.createTypeInfoWithTypeHierarchy(TypeExtractor.java:737)
    at org.apache.flink.api.java.typeutils.TypeExtractor.privateCreateTypeInfo(TypeExtractor.java:565)
    at org.apache.flink.api.java.typeutils.TypeExtractor.getUnaryOperatorReturnType(TypeExtractor.java:366)
    at org.apache.flink.api.java.typeutils.TypeExtractor.getUnaryOperatorReturnType(TypeExtractor.java:305)
    at org.apache.flink.api.java.typeutils.TypeExtractor.getMapReturnTypes(TypeExtractor.java:120)
    at org.apache.flink.streaming.api.datastream.DataStream.map(DataStream.java:506)
    at se.hiq.bjornper.testenv.cassandra.SOCassandraQueryTest.main(SOCassandraQueryTest.java:51)
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.source.RichSourceFunction;

import com.datastax.driver.core.Statement;
import com.datastax.driver.core.querybuilder.Insert;
import com.datastax.driver.core.querybuilder.QueryBuilder;

public class SOCassandraQueryTest {

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

        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
        env.setParallelism(1);

        DataStream<Map<String, Object>> myDataStream = env.addSource(new RichSourceFunction<Map<String, Object>>() {

            @Override
            public void run(SourceContext<Map<String, Object>> ctx) throws Exception {
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("name", "Test Nameson");
                map.put("age", 27);
                ctx.collect(map);
            }

            @Override
            public void cancel() {
            }
        });

        /* Works just fine */
        DataStream<Statement> debugDatastream = myDataStream.map(new MapFunction<Map<String, Object>, Statement>() {

            @Override
            public Statement map(Map<String, Object> datarow) throws Exception {
                Insert insert = QueryBuilder.insertInto("tablename");

                for (Entry<String, Object> e : datarow.entrySet()) {
                    insert.value(e.getKey(), e.getValue());
                }
                return insert;
            }
        });

        /* Throws RuntimeException if using "Insert" instead of "Statement" */
//        DataStream<Insert> debugDatastream = myDataStream.map(new MapFunction<Map<String, Object>, Insert>() {
//
//            @Override
//            public Insert map(Map<String, Object> datarow) throws Exception {
//                Insert insert = QueryBuilder.insertInto("tablename");
//
//                for (Entry<String, Object> e : datarow.entrySet()) {
//                    insert.value(e.getKey(), e.getValue());
//                }
//                return insert;
//            }
//        });

        debugDatastream.print();

        env.execute("CassandraQueryTest");
    }
}