内容纲要
概要描述
早期版本的 inceptor server 会有FGC 异常的情况,本文 记录一下 jmap 中特定关键字对应的特定问题;
详细说明
只针对 TDH 6.2.2 及之前版本的 inceptor server
Inceptor Server 常见的 GC 相关问题
- PL/SQL死循环profile信息积累
org.apache.hadoop.hive.ql.pl.runtime.PLProfile$PLFuncProfile org.apache.hadoop.hive.ql.hooks.PerfStatistics
解决方案:
- 低版本手动 set plsql.runtime.profile设置为false,参考链接:http://172.16.0.244:8080/browse/WARP-29255
- orc表的列统计信息过多
org.apache.hadoop.hive.ql.io.orc.OrcProto$ColumnStatistics org.apache.hadoop.hive.ql.io.orc.OrcProto$StringStatistics org.apache.hadoop.hive.ql.io.orc.OrcProto$DecimalStatistics org.apache.hadoop.fs.FileSystem$Statistics$StatisticsData
解决方案:
- hive-server2.log 里面搜 FooterCacheHitRatio, 如果绝大部分是0,可以考虑把hive.orc.cache.stripe.details.size设成0。作为一个cache,如果命中率没有达到50%以上,这个cache的整体效果不会很好。
- 另外一种情况可能是 orc 表的小文件数量很多,需要合并小文件;
- 4040 Spark UI 监控信息bug
org.apache.spark.executor.TaskMetrics org.apache.spark.scheduler.TaskInfo org.apache.spark.storge.RDDInfo
解决方案:
- 重启 Inceptor 缓解,或者是升级到 dbaservice
- 连接数量太多,HiveConf 实例数量超过 1w
org.apache.hadoop.hive.conf.HiveConf
解决方案:
- 查看beeline 连接的 session 个数,是否存在连接没有释放;ctc表太大(垃圾太多)HiveConf中会包含CTC表的信息,如果记录数目太多,占用内存会比较多;
- SELECT count(1) FROM hive_metastore.COMPLETED_TXN_COMPONENTS,调大inceptor server内存,适当调大ttl时间,比如server&executor配置-Dspark.cleaner.ttl.BROADSACT_FAST参数为900 (改参数没有副作用),该参数影响范围内容:当Inceptor以Cluster模式“高并发”连续执行批处理作业时(一般是平均1分钟执行20个SQL以上)连续执行数小时,会导致Executor严重FullGC,并且无法自然缓解
- 表的 partition 太多(多级分区),导致的properity string累积造成server gc
org.apache.hadoop.hive.ql.io.orc.OrcSplit orc.apache.spark.rdd.HadoopValueOnlyPartition io.transwarp.inceptor.inceptor.execution.HadoopTableReader$$annofun$10
解决方案:
- 优化分区表,不建议使用多级分区,会导致小文件问题以及加载的 fspath 太长,每一个HadoopTableReader hold 两个 property(partProp, tableProp)。Properties 数量为 54w
-
小文件数量过多,查询导致 server gc
org.apache.hadoop.fs.Path org.apache.hadoop.fs.FileStatus
解决方案:
- 查看小文件是不是特别多,表设计是不是合理的(存在不存在多级分区、很多分桶、delta文件没有合并的情况);如果是metastore端,是不是合并任务hand住了(warp-32079)
-
特定sql parse 产生大量中间数据,导致 server gc
org.apache.hadoop.hive.ql.parse.ASTNode org.antlr.runtime.CommonToken
解决方案:
- 一般是因为有大量的 sql parse 导致的,比如 batch insert,或者是开了 MBO 时查询语句在大量 cube 中选择时会触发这种问题;可以尝试检查当时提交的 sql 大小;
- holodesk 表 accumulable 泄漏
io.transwarp.holodesk.storage.ds.column.block.filter.MinMaxBlockFilter
解决方案:
- 升级版本(出包)或者重启缓解
- with as …select join 语句,在外层查询对该临时表做 join,而在 Driver 的逻辑里,会把查询的结果全部堆积在cachedPlanResult 这个 ArrayList 里面从而导致 GC
org.apache.hadoop.hive.common.type.HiveVarchar org.apache.hadoop.hive.common.type.HiveData org.apache.hadoop.hive.serde2.objectinspector.StandardListObjectInspector
解决方案:
-
stellerDB 图数据库相关 zk 连接泄露导致
org.apache.curator.framework.imps.NamespaceWatcher
解决方案:
- 进入 zkcli 创建几个空的 node
export CLIENT_JVMFLAGS="-Djava.security.auth.login.config=/etc/zookeeper1/conf/jaas.conf" # 此处必须使用 hostname ,不能用 ip zookeeper-client -server zk-address-host:2181 create /graph "" create /graph/master "", create /graph/worker "", create /graph/database "" 然后重启 inceptor-server
- 进入 zkcli 创建几个空的 node
-
任务失败会保留最小线程数的 session 不断开,如果刚好这些没断开的session 中 partition相关内存非常多,就会造成 server 内存压力。
org.apache.hadoop.mapred.SplitLocationInfo org.apache.hadoop.mapreduce.lib.input.FileSplit org.apache.hadoop.hive.metastore.api.FieldSchema org.apache.spark.rdd.HadoopValueOnlyPartition
解决方案:
- 重启需要换包修复;参考threadToSessions在closeSession时没有清理信息导致session泄露
- 也可以重启Inceptor,然后重建表结构,将分区数量减小到可控范围内来规避问题