分析别人的Bug让自己“零”Bug
文章平均质量分 84
我们在大数据开发的时候会经常遇到各种bug,如果对技术底层原理理解不到位,就算通过网上搜的方案把问题“暂时”解决了,但是可能会带来潜在隐患。这个专栏就想通过分析各种bug,首先通过原理让我们更清楚地知道为什么会有这样的bug出现,然后才是如何避免或者解决这样bug。
SunnyRivers
在通信、游戏、互联网、新能源等不同行业从事过多年大数据开发相关工作,想通过博客和大家一起分享大数据技术带来的经验和乐趣。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Your local changes will be overwritten by merge. Commit, stash, or revert them to proceed
当你尝试合并一个分支到当前工作分支时,Git检测到你的工作目录或暂存区存在未提交的改动,这些改动可能与即将合并的分支存在冲突。为了避免数据丢失或意外覆盖,Git暂停了合并操作,并抛出了上述警告。这一机制体现了Git对开发者工作的尊重与保护,但同时也要求开发者采取措施,主动管理这些未提交的更改。使用git reset --hard命令将工作目录和暂存区恢复到最近一次提交的状态。你决定放弃当前的本地更改,希望回到最近一次提交的状态。快速清除工作区,适合彻底放弃当前的修改。注意,此操作会永久丢失未提交的更改。原创 2024-12-04 21:23:17 · 1474 阅读 · 0 评论 -
java.lang.OutOfMemoryError: Unable to acquire 100 bytes of memory, got 0
如果不是,那么尽快减少使用,coalesce不会把数据块做 shuffle 操作,但是会让数据块在一个 Task 执行,同时后续的计算成为单块的任务了。没有Coalesce操作的时候,每个 partition 是一个task来计算,此时内存并不会有很大问题,假设 JVM 中32个 Cores 在计算, Page 默认大小为128M的情况下,内存损耗顶峰也不到4G,这个数量并不算多。那导致内存顶峰大小为 N*128M,而 shuffle 中的 N 值默认的情况为200,实际可能更大,那么就很容易内存溢出了。原创 2024-12-02 21:35:38 · 766 阅读 · 0 评论 -
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 · 557 阅读 · 0 评论 -
Unable to clear output directory
这个错误通常发生在使用Apache Spark进行数据处理并尝试使用insertInto或overwrite方法将数据写入一个表时。报错"Unable to clear output directory"意味着Spark无法清空指定的输出目录,这通常是因为权限问题、目录不存在或目录中有文件正在被使用。任务直接的依赖关系正常来说是非常严格的,有依赖必须配置,没有依赖就别配置。这种bug是偶现的,大部分情况都不会出现,忽然某一天就报错了,重新运行就好了。原创 2024-08-05 09:14:39 · 355 阅读 · 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 · 295 阅读 · 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 · 919 阅读 · 0 评论 -
Set cancelled by MemoryScratchSinkOperator
这个参数决定了单个查询在执行过程中可以使用的最大内存量。了,那么是谁的内存不够呢?显然不是spark,因为spark内存一般直接报OutOfMemory,那么就是starrocks内存不够,我们的代码中显然没有设置有关starrocks内存相关的参数。如果你将这个参数设置得足够大,确实可以为查询提供更大的内存空间,从而可能加速查询的执行,尤其是对于那些需要大量内存来执行复杂计算的查询。也就是说spark一次只能从starrocks表中读2GB的数据,超过这个值就会抛异常,于是把该值调大。原创 2024-03-13 19:32:04 · 660 阅读 · 0 评论 -
Container killed on request. Exit code is 143
大部分时候都是直接加大内存来解决,不要把太多精力放在这方面的调优。原创 2024-02-29 18:19:58 · 1341 阅读 · 0 评论 -
spark读sqlserver出现的异常
Spark通过JDBC读取数据之前很早写过一篇博客,本以为所有通过jdbc读取的方式都一样,谁知道这次读sqlserver的时候竟然出现的很多异常,这里把异常的问题进行记录。原创 2024-01-08 14:58:50 · 1373 阅读 · 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 · 2629 阅读 · 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 · 2132 阅读 · 0 评论 -
java.lang.OutOfMemoryError: GC overhead limit exceeded
不同的管理模式下,这三部分占用的空间大小各不相同。Spark 对堆内内存的管理是一种逻辑上的”规划式”的管理,因为对象实例占用内存的申请和释放都由 JVM 完成,Spark 只能在申请后和释放前记录这些内存,我们来看其具体流程:原创 2023-10-09 09:23:03 · 986 阅读 · 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 · 1198 阅读 · 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 · 1147 阅读 · 0 评论 -
Container killed by YARN for exceeding memory limits
通过调整该参数,可以对executor的内存分配进行更精细的调节,以适应不同的任务和数据特征。那我们可以很明确了,如果是因为例如JVM堆外内存、Spark缓存、执行器本身的内部开销等导致的内存不足,的确增大这个参数有一定的效果,但是如果一个container的内存已经限制了,那么增加这个参数是没有任何效果的。关闭虚拟内存检测,有的时候的确能够让代码可以运行,但是关闭了对container内存的监控,虽然可以运行,但是明显没有实际性的处理问题,而且不可控的内存使用,对多租户的环境不友好。原创 2023-07-14 17:42:43 · 1166 阅读 · 0 评论
分享