热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Kudu:删除了不存在的数据报错status=Notfound:keynotfound(error0)

大数据-sparkspark专栏,sprak源码解读九师兄9.90去订阅1.美图2.背景一个实时同步的任务,突然发现写入Kudu的是时候,执行报错020-01-1709:3

1.美图


2.背景

一个实时同步的任务,突然发现写入Kudu的是时候,执行

报错

020-01-17 09:32:22,067 ERROR com.dtwave.meteor.connector.core.service.WorkerSubTask -[deliverRecords][590]: Sub task T_6676615507350773-0 threw an uncaught exception. Sub task is being killed and will not recover util manually restarted.
com.dtwave.meteor.connector.common.exception.SinkException: Sub task T_6676615507350773-0 flush error: Row error for primary key="1000", tablet=null, server=1a65f2ced6b84c2096b0fd39097bfe5e, status=Not found: key not found (error 0)at com.dtwave.meteor.connector.kudu.util.BufferedRecords.flush(BufferedRecords.java:106)at com.dtwave.meteor.connector.kudu.KuduWriter.write(KuduWriter.java:86)at com.dtwave.meteor.connector.kudu.KuduSinkTask.sink(KuduSinkTask.java:73)at com.dtwave.meteor.connector.core.service.WorkerSubTask.deliverRecords(WorkerSubTask.java:576)at com.dtwave.meteor.connector.core.service.WorkerSubTask.poll(WorkerSubTask.java:470)at com.dtwave.meteor.connector.core.service.WorkerSubTask.iteration(WorkerSubTask.java:360)at com.dtwave.meteor.connector.core.service.WorkerSubTask.execute(WorkerSubTask.java:291)at com.dtwave.meteor.connector.core.service.WorkerSubTask.doRun(WorkerSubTask.java:252)

3.原因分析

Apache Kudu不能删除不存在的数据

使用Apache Kudu客户端,对KafkaConnect Sink进行扩展。使用的Apache Kudu的Java客户端。突然有天发现作业无法提交,一直报错。

后来才发现这是Kudu自身的一种校验机制。为了忽略这种校验机制,更符合我们的SQL习惯,我对代码做了改造。

而在Kudu的提交配置.上,使用了手动提交的配置。而且我也建议使用手动提交的配置,这样效率更好,提交后对于异常数据的处理更加完整。
配置方式如下:

session . setFlushMode( SessionConf iguration. FlushMode . MANUAL_ FLUSH);

flush的代码原本是

/*** 最终flush操作,主要解决删除的时候,删除了不存在的数据*/private void terminalFlush() throws KuduException {final java.util.List<OperationResponse> responses = session.flush();for (OperationResponse response : responses) {if (response.hasRowError()) {throw new SinkException("encounter key not found error.More.detail " +"=> table : "+ response.getRowError().getOperation().getTable().getName() +"" +"=> row : "+response.getRowError().getOperation().getRow().stringifyRowKey());}}LOG.debug("Sub task {} flushed sink records", id);}

修改为

/*** 最终flush操作,主要解决删除的时候,删除了不存在的数据*/
private void terminalFlush() throws KuduException {final java.util.List<OperationResponse> responses = session.flush();for (OperationResponse response : responses) {if (!response.hasRowError()) {continue;}String errorString = response.getRowError().toString();// 主要过滤kudu 删除的时候,删除到了不存在的数据if(errorString.contains("key not found")){LOG.warn("encounter key not found error.More.detail " +"=> table : "+ response.getRowError().getOperation().getTable().getName() +"" +"=> row : "+response.getRowError().getOperation().getRow().stringifyRowKey());continue;}if (response.hasRowError()) {throw new SinkException("encounter key not found error.More.detail " +"=> table : "+ response.getRowError().getOperation().getTable().getName() +"" +"=> row : "+response.getRowError().getOperation().getRow().stringifyRowKey());}}LOG.debug("Sub task {} flushed sink records", id);
}

参考:http://www.rengongzineng.com.cn/post/5131.html


推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 在Java中,我会做这样的事情:classPerson{privateRecordrecord;publicStringname(){record().get(name);}p ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
author-avatar
岩蕃wy之人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有