Java AbstractCassandraTupleSink的实现不可序列化
我创建了一个程序来计算维基百科中的单词。它工作正常,没有任何错误。然后我创建了Cassandra表,其中有两列“word(text)和count(bigint)”。问题是当我想在Cassandra表中输入单词和计数时。我的程序如下所示: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
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地址,所以程序没有正确运行。