Apache spark Spark Cassandra连接器中的错误查询错误处理

Apache spark Spark Cassandra连接器中的错误查询错误处理,apache-spark,cassandra,spark-streaming,spark-cassandra-connector,Apache Spark,Cassandra,Spark Streaming,Spark Cassandra Connector,我有一个Spark Streaming应用程序,它有多个数据流(DStream),写入同一个Cassandra表。当在大量随机数据上测试我的应用程序时,我从Spark Cassandra Connector收到一个错误,该错误几乎没有对调试有用的信息。错误如下所示: java.util.concurrent.ExecutionException: com.datastax.driver.core.exceptions.InvalidQueryException: Key may not be e

我有一个Spark Streaming应用程序,它有多个数据流(DStream),写入同一个Cassandra表。当在大量随机数据上测试我的应用程序时,我从Spark Cassandra Connector收到一个错误,该错误几乎没有对调试有用的信息。错误如下所示:

java.util.concurrent.ExecutionException: com.datastax.driver.core.exceptions.InvalidQueryException: Key may not be empty
    at com.baynote.shaded.com.google.common.util.concurrent.AbstractFuture$Sync.getValue(AbstractFuture.java:299)
    at com.baynote.shaded.com.google.common.util.concurrent.AbstractFuture$Sync.get(AbstractFuture.java:286)
    at com.baynote.shaded.com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:116)
    at com.datastax.spark.connector.rdd.CassandraJoinRDD$$anonfun$fetchIterator$1.apply(CassandraJoinRDD.scala:268)
    at com.datastax.spark.connector.rdd.CassandraJoinRDD$$anonfun$fetchIterator$1.apply(CassandraJoinRDD.scala:268)
    at scala.collection.Iterator$$anon$13.hasNext(Iterator.scala:371)
    at com.datastax.spark.connector.util.CountingIterator.hasNext(CountingIterator.scala:12)
    at scala.collection.Iterator$$anon$13.hasNext(Iterator.scala:371)
    at org.apache.spark.util.collection.ExternalSorter.insertAll(ExternalSorter.scala:189)
    at org.apache.spark.shuffle.sort.SortShuffleWriter.write(SortShuffleWriter.scala:64)
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:73)
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:41)
    at org.apache.spark.scheduler.Task.run(Task.scala:89)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:213)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
Caused by: com.datastax.driver.core.exceptions.InvalidQueryException: Key may not be empty
    at com.datastax.driver.core.Responses$Error.asException(Responses.java:136)
    at com.datastax.driver.core.DefaultResultSetFuture.onSet(DefaultResultSetFuture.java:179)
    at com.datastax.driver.core.RequestHandler.setFinalResult(RequestHandler.java:184)
    at com.datastax.driver.core.RequestHandler.access$2500(RequestHandler.java:43)
    at com.datastax.driver.core.RequestHandler$SpeculativeExecution.setFinalResult(RequestHandler.java:798)
    at com.datastax.driver.core.RequestHandler$SpeculativeExecution.onSet(RequestHandler.java:617)
    at com.datastax.driver.core.Connection$Dispatcher.channelRead0(Connection.java:1005)
    at com.datastax.driver.core.Connection$Dispatcher.channelRead0(Connection.java:928)
    at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
    at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:266)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
    at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:244)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846)
    at io.netty.channel.epoll.AbstractEpollStreamChannel$EpollStreamUnsafe.epollInReady(AbstractEpollStreamChannel.java:831)
    at io.netty.channel.epoll.EpollEventLoop.processReady(EpollEventLoop.java:346)
    at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:254)
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:111)
    ... 1 more
它的问题是,我不知道是哪个数据流,哪个数据导致了它。我可以检查每个写入Cassandra的数据流,或者编写自己的数据验证器,但我正在寻找一个更通用的解决方案

另一个问题是,如果该错误终止了整个作业,而不是忽略它并继续写入其他数据。基本上,在简单的非火花写入的情况下,我会捕获异常,记录它并继续写入其余的数据。在Spark Cassandra连接器中是否有类似的方法


对这两个问题我能做些什么?

< P>我想我们应该考虑两个例子:

  • 验证输入数据,以确保键(在cassandra列中)的数据不是Null或无效的数据格式

  • 您的数据是RDD,所以您可以在调用save方法之前进行排序以忽略无效数据


  • 我认为我们应该考虑两种情况:

  • 验证输入数据,以确保键(在cassandra列中)的数据不是Null或无效的数据格式

  • 您的数据是RDD,所以您可以在调用save方法之前进行排序以忽略无效数据


  • 您是如何保存数据的?它是rdd还是数据帧,使用case类还是普通方式?它是元组的rdd。使用默认值尝试case类,而不是元组,您还可以编写一些验证来检查输入数据。我不知道它具体发生在哪里,因此,验证所有数据需要相当多的努力,我想确认这确实是推荐的方法,没有比这更通用的方法了。还有,案例类究竟能解决什么问题?如何保存数据?它是rdd还是数据帧,使用case类还是普通方式?它是元组的rdd。使用默认值尝试case类,而不是元组,您还可以编写一些验证来检查输入数据。我不知道它具体发生在哪里,因此,验证所有数据需要相当多的努力,我想确认这确实是推荐的方法,没有比这更通用的方法了。还有,案例类到底能解决什么问题?