Java AbstractCassandraTupleSink的实现不可序列化

Java AbstractCassandraTupleSink的实现不可序列化,java,cassandra,apache-flink,Java,Cassandra,Apache Flink,我创建了一个程序来计算维基百科中的单词。它工作正常,没有任何错误。然后我创建了Cassandra表,其中有两列“word(text)和count(bigint)”。问题是当我想在Cassandra表中输入单词和计数时。我的程序如下所示: public class WordCount_in_cassandra { public static void main(String[] args) throws Exception { // Checking inpu

我创建了一个程序来计算维基百科中的单词。它工作正常,没有任何错误。然后我创建了Cassandra表,其中有两列“word(text)和count(bigint)”。问题是当我想在Cassandra表中输入单词和计数时。我的程序如下所示:

    public class WordCount_in_cassandra {


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

        // Checking input parameters
        final ParameterTool params = ParameterTool.fromArgs(args);

        // set up the execution environment
        final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // make parameters available in the web interface
        env.getConfig().setGlobalJobParameters(params);

     DataStream<String> text=env.addSource(new WikipediaEditsSource()).map(WikipediaEditEvent::getTitle);

       DataStream<Tuple2<String, Integer>> counts =
                // split up the lines in pairs (2-tuples) containing: (word,1)
                text.flatMap(new Tokenizer())
                        // group by the tuple field "0" and sum up tuple field "1"
                        .keyBy(0).sum(1);

        // emit result
        if (params.has("output")) {
            counts.writeAsText(params.get("output"));
        } else {
            System.out.println("Printing result to stdout. Use --output to specify output path.");

            counts.print();

            CassandraSink.addSink(counts)
                    .setQuery("INSERT INTO mar1.examplewordcount(word, count) values values (?, ?);")
                    .setHost("127.0.0.1")
                    .build();
       }

        // execute program
        env.execute("Streaming WordCount");
    }//main

  public static final class Tokenizer implements FlatMapFunction<String, Tuple2<String, Integer>> {

        @Override
        public void flatMap(String value, Collector<Tuple2<String, Integer>> out) {
            // normalize and split the line
            String[] tokens = value.toLowerCase().split("\\W+");

            // emit the pairs
            for (String token : tokens) {
                if (token.length() > 0) {
                    out.collect(new Tuple2<>(token, 1));
                }
            }
        }
    }

}
cassandra中的公共类字数{ 公共静态void main(字符串[]args)引发异常{ //检查输入参数 final ParameterTool params=ParameterTool.fromArgs(args); //设置执行环境 最终StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment(); //使参数在web界面中可用 env.getConfig().setGlobalJobParameters(参数); DataStream text=env.addSource(新的WikipediaEditsSource()).map(WikipediaEditEvent::getTitle); 数据流计数= //将行分成两行(2元组),包含:(单词,1) text.flatMap(新标记器()) //按元组字段“0”分组,并对元组字段“1”求和 .keyBy(0)。总和(1); //发射结果 如果(参数有(“输出”)){ counts.writesText(params.get(“output”); }否则{ System.out.println(“将结果打印到stdout.Use--output以指定输出路径”); counts.print(); CassandraSink.addSink(计数) .setQuery(“插入mar1.examplewordcount(word,count)值(?,);”) .setHost(“127.0.0.1”) .build(); } //执行程序 环境执行(“流字计数”); }//主要 公共静态最终类标记器实现FlatMapFunction{ @凌驾 公共void平面图(字符串值,收集器输出){ //标准化并分割线 String[]tokens=value.toLowerCase().split(\\W+); //发出成对的声音 for(字符串标记:标记){ if(token.length()>0){ out.collect(新的Tuple2(令牌,1)); } } } } } 运行此代码后,我出现以下错误:

线程“main”org.apache.flink.api.common.invalidProgrameException中出现异常:AbstractCassandraTupleSink的实现不可序列化。对象可能包含或引用不可序列化的字段

我找了很多,但找不到解决办法。你能告诉我怎么解决这个问题吗


提前谢谢。

,这可能会有所帮助。发生这种情况是因为您正在将未序列化的字段分配给序列化的字段。

我试图复制您的问题,但没有解决序列化问题。虽然因为我没有运行Cassandra集群,它在
open()
调用中失败。但这发生在序列化之后,正如TaskManager启动操作符时所调用的那样。因此,感觉您的依赖项可能有问题,因此它对实际的Cassandra接收器使用了错误的类

顺便说一句,包含错误的上下文总是很有帮助的——例如,Flink的哪个版本,您是从IDE还是在集群上运行它,等等

仅供参考,这是我课堂上的弗林克罐子

flink-java/1.7.0/flink-java-1.7.0.jar
flink-core/1.7.0/flink-core-1.7.0.jar
flink-annotations/1.7.0/flink-annotations-1.7.0.jar
force-shading/1.7.0/force-shading-1.7.0.jar
flink-metrics-core/1.7.0/flink-metrics-core-1.7.0.jar
flink-shaded-asm/5.0.4-5.0/flink-shaded-asm-5.0.4-5.0.jar
flink-streaming-java_2.12/1.7.0/flink-streaming-java_2.12-1.7.0.jar
flink-runtime_2.12/1.7.0/flink-runtime_2.12-1.7.0.jar
flink-queryable-state-client-java_2.12/1.7.0/flink-queryable-state-client-java_2.12-1.7.0.jar
flink-shaded-netty/4.1.24.Final-5.0/flink-shaded-netty-4.1.24.Final-5.0.jar
flink-shaded-guava/18.0-5.0/flink-shaded-guava-18.0-5.0.jar
flink-hadoop-fs/1.7.0/flink-hadoop-fs-1.7.0.jar
flink-shaded-jackson/2.7.9-5.0/flink-shaded-jackson-2.7.9-5.0.jar
flink-clients_2.12/1.7.0/flink-clients_2.12-1.7.0.jar
flink-optimizer_2.12/1.7.0/flink-optimizer_2.12-1.7.0.jar
flink-streaming-scala_2.12/1.7.0/flink-streaming-scala_2.12-1.7.0.jar
flink-scala_2.12/1.7.0/flink-scala_2.12-1.7.0.jar
flink-shaded-asm-6/6.2.1-5.0/flink-shaded-asm-6-6.2.1-5.0.jar
flink-test-utils_2.12/1.7.0/flink-test-utils_2.12-1.7.0.jar
flink-test-utils-junit/1.7.0/flink-test-utils-junit-1.7.0.jar
flink-runtime_2.12/1.7.0/flink-runtime_2.12-1.7.0-tests.jar
flink-queryable-state-runtime_2.12/1.7.0/flink-queryable-state-runtime_2.12-1.7.0.jar
flink-connector-cassandra_2.12/1.7.0/flink-connector-cassandra_2.12-1.7.0.jar
flink-connector-wikiedits_2.12/1.7.0/flink-connector-wikiedits_2.12-1.7.0.jar

非常感谢。但这是因为“CassandraSink.addSink”中的“build()”。亲爱的@kkrugler谢谢你的回答。我使用Flink 1.6.1,并根据Intellij的想法运行它。另外,我有两个节点的Cassandra集群;但是我在本地运行Flink,希望将数据写入Cassandra集群。我将Flink版本从1.6.1更新到1.7.0,并在本地运行程序。它运行时没有任何错误。但是我不能在Cassandra集群中运行该程序。我在Cassandra集群中运行时出现此错误:“线程“main”org.apache.flink.runtime.client.JobExecutionException:作业执行失败。”我可以在Cassandra集群上运行该程序。因为我在“sethost”中写了两个IP地址,所以程序没有正确运行。