分析别人的Bug让自己“零”Bug
文章平均质量分 85
我们在大数据开发的时候会经常遇到各种bug,如果对技术底层原理理解不到位,就算通过网上搜的方案把问题“暂时”解决了,但是可能会带来潜在隐患。这个专栏就想通过分析各种bug,首先通过原理让我们更清楚地知道为什么会有这样的bug出现,然后才是如何避免或者解决这样bug。
SunnyRivers
在通信、游戏、互联网、新能源等不同行业从事过多年大数据开发相关工作,想通过博客和大家一起分享大数据技术带来的经验和乐趣。
展开
-
org.apache.doris.spark.exception.DorisException: Spark type is DATEV2, but arrow type is DATEDAY
例如,在不同的上下文中,日期的格式可能不同(如“YYYY-MM-DD”、“DD/MM/YYYY”等),这可能导致解析错误或比较时的问题。类型来存储日期信息是一种常见的做法,尤其是在需要存储非标准日期格式或需要保留额外信息(如时区信息)的情况下。date和datetime类型可以全部用varchar替代,但要从根本解决问题,依然得用第一种方式,因为date类型本身就是常用的日期类型。类型的长度是固定的,即使存储较短的日期字符串,也会占用预先定义的空间。因为字符串索引的查找效率通常低于日期类型的索引。原创 2024-08-08 11:09:57 · 140 阅读 · 0 评论 -
Unable to clear output directory
这个错误通常发生在使用Apache Spark进行数据处理并尝试使用insertInto或overwrite方法将数据写入一个表时。报错"Unable to clear output directory"意味着Spark无法清空指定的输出目录,这通常是因为权限问题、目录不存在或目录中有文件正在被使用。任务直接的依赖关系正常来说是非常严格的,有依赖必须配置,没有依赖就别配置。这种bug是偶现的,大部分情况都不会出现,忽然某一天就报错了,重新运行就好了。原创 2024-08-05 09:14:39 · 247 阅读 · 0 评论 -
fieldIndex on a Row without schema is undefined
这种情况可能是因为第一次 flatMap 操作改变了原始 Dataset 的结构或类型,导致后续的操作失去了原有的 schema 信息。为了解决这个问题,你需要确保在 flatMap 中处理的数据仍然保持有 schema 信息。有些bug网络上可能没有对应的解决方式,不同是spark版本可能遇到不同的问题,我们可以根据给出的异常提示进行不同的尝试。明显能打印出schema信息,下面去尝试解决这个问题。我们直译一下大概就是你用row.getAs(“字段名”)的时候代码根本不清楚你这个row里面有哪些字段。原创 2024-08-02 13:55:36 · 188 阅读 · 0 评论 -
return code 1 from org.apache.hadoop.hive.ql.ddl.DDLTask
注意:set命令是一次性的,而且无法在shell脚本中使用,否则直接报错:Error: Error while processing statement: Cannot modify hive.msck.path.validation at runtime. It is not in list of params that are allowed to be modified at runtime (state=42000,code=1)原创 2024-03-20 18:25:14 · 668 阅读 · 0 评论 -
Set cancelled by MemoryScratchSinkOperator
这个参数决定了单个查询在执行过程中可以使用的最大内存量。了,那么是谁的内存不够呢?显然不是spark,因为spark内存一般直接报OutOfMemory,那么就是starrocks内存不够,我们的代码中显然没有设置有关starrocks内存相关的参数。如果你将这个参数设置得足够大,确实可以为查询提供更大的内存空间,从而可能加速查询的执行,尤其是对于那些需要大量内存来执行复杂计算的查询。也就是说spark一次只能从starrocks表中读2GB的数据,超过这个值就会抛异常,于是把该值调大。原创 2024-03-13 19:32:04 · 435 阅读 · 0 评论 -
Container killed on request. Exit code is 143
大部分时候都是直接加大内存来解决,不要把太多精力放在这方面的调优。原创 2024-02-29 18:19:58 · 778 阅读 · 0 评论 -
spark读sqlserver出现的异常
Spark通过JDBC读取数据之前很早写过一篇博客,本以为所有通过jdbc读取的方式都一样,谁知道这次读sqlserver的时候竟然出现的很多异常,这里把异常的问题进行记录。原创 2024-01-08 14:58:50 · 1242 阅读 · 0 评论 -
Flink往Starrocks写数据报错:too many filtered rows
这个其实比较郁闷,你抛出的异常是过滤出太多行,与not null有什么关系呢?但是,当你把not null去掉后,发现很多too many filtered rows的bug都能解决了。这个时候你把最新的数据导入,可能会报上面的错。正当你以为你根据字面意思就知道bug的本质的时候,你会发现有些场景,你日期写的完全没有问题依然会报上面的错(说明这个starrocks源码写的不严谨)。比如你写的是tinyint,但实际来的值超过这个范围,就会报错too many filtered rows(真有点扯淡啊)。原创 2023-11-06 10:40:36 · 1718 阅读 · 0 评论 -
error=‘Cannot allocate memory‘ (errno=12)
Linux中的top命令是一个动态显示过程,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。需要注意的是,在top命令运行的界面中,按下f键可以进入字段管理模式,可以选择要显示的列,并对列的顺序进行调整。NI:进程的nice值,表示进程的优先级调整值,数值越大,优先级越低。RES:进程使用的、未被换出的物理内存大小,单位为KB。PID:进程ID,每个进程都有一个唯一的ID。VIRT:进程使用的虚拟内存总量,单位为KB。PR:进程的优先级,数值越小,优先级越高。原创 2023-10-16 16:31:12 · 1423 阅读 · 0 评论 -
java.lang.OutOfMemoryError: GC overhead limit exceeded
不同的管理模式下,这三部分占用的空间大小各不相同。Spark 对堆内内存的管理是一种逻辑上的”规划式”的管理,因为对象实例占用内存的申请和释放都由 JVM 完成,Spark 只能在申请后和释放前记录这些内存,我们来看其具体流程:原创 2023-10-09 09:23:03 · 644 阅读 · 0 评论 -
executor.CoarseGrainedExecutorBackend: RECEIVED SIGNAL TERM
大概的意思就是当把spark.dynamicAllocation.enabled参数设置为true的时候Spark自动根据任务的负载情况增加或减少执行者的数量。当executor空闲时间达到 spark.dynamicAllocation.executorIdleTimeout=60s的时间后,executor会被移除掉。首先程序能够正常运行,只是发现某些executor状态为Dead了,说明该executor被移除了,至于为什么会被移除,就得理解spark的动态分区了,这部分内容请参考。原创 2023-07-26 13:34:44 · 801 阅读 · 0 评论 -
Total size of serialized results of x tasks (x MB) is bigger than spark.driver.maxResultSize (y MB)
序列化是在网络传输过程中将数据对象转换为一系列字节的处理。在我们的Spark场景中,executor之间或driver和executor之间的数据传输是通过序列化数据进行的。原创 2023-07-26 10:03:10 · 798 阅读 · 0 评论 -
Container killed by YARN for exceeding memory limits
通过调整该参数,可以对executor的内存分配进行更精细的调节,以适应不同的任务和数据特征。那我们可以很明确了,如果是因为例如JVM堆外内存、Spark缓存、执行器本身的内部开销等导致的内存不足,的确增大这个参数有一定的效果,但是如果一个container的内存已经限制了,那么增加这个参数是没有任何效果的。关闭虚拟内存检测,有的时候的确能够让代码可以运行,但是关闭了对container内存的监控,虽然可以运行,但是明显没有实际性的处理问题,而且不可控的内存使用,对多租户的环境不友好。原创 2023-07-14 17:42:43 · 853 阅读 · 0 评论