内存没满但是频繁fullgc,是不是ReservedCodeCacheSize的锅

业务中的现象表现

运行一段时间后,频繁fullgc,2s10几次fullgc,无法对外提供服务

环境

gc日志

内存还有非常多的情况下就开始了fullgc

dump分析

只看到class loader的一直重新加载?内存指向java.security.Permission,没有其他大对象?没有搞懂重新改好了也是这样,需要再搞懂

jvm参数
1
2
3
4
5
-Xms128m -Xmx256m -XX:ReservedCodeCacheSize=50m -XX:MetaspaceSize=96m -XX:MaxMetaspaceSize=96m -Xss256k -XX:MaxDirectMemorySize=16m
-XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled
-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:GCLogFileSize=10M -XX:NumberOfGCLogFiles=3 -Xloggc:/var/logs/gc1.log
-XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:NativeMemoryTracking=summary
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/logs/dump1-$(date +%Y%m%d%H%M%S).hprof"
修改

怀疑是-XX:ReservedCodeCacheSize=50m导致Meta不生效,导致重新加载fullgc?

修改为jvm参数,后好使了

1
2
3
4
-Xms128m -Xmx256m -XX:PermSize=128m -XX:-UseGCOverheadLimit -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80
-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:GCLogFileSize=10M -XX:NumberOfGCLogFiles=3 -Xloggc:/var/logs/gc1.log
-XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:NativeMemoryTracking=summary
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/logs/dump1-$(date +%Y%m%d%H%M%S).hprof"

需要再研究,怎么来指向这个问题。

另外火焰图必不可少

怎样使用DataX将HBase数据导入到MySQL

有需求使用DataX将HBase表中数据迁移到MySQL中,有的表在Phoenix中定义,使用hbase20xsqlreader读取。有的没有在Phoenix中定义,数据是动态插入,列是不固定的。

  • hbase20xsqlreader,读取Phoenix
  • hbase11xreader,读取HBase

不管读取HBase还是Phoenix都要求填写column,但是可以写sql占位,传进来。

我这里由于业务原因就没有使用占位符的方式传递。

现在的业务需求是我HBase横表迁移到MySQL纵表中。

动态列中的列名有在MySQL表中记录,所以实现流程就是

  1. shell 脚本调用mysql读取出要在HBase中读取的列
  2. 循环生成hbase11xreader读取-写入txt的DataX json
  3. 调用DataX执行上面的json文件导出txt
  4. 循环txt为每行加入MySQL要插入的列key
  5. 生成读取txt,写入MySQL

Read More

符合国际标准的城市编码

问题

fork的项目running_page有一个Issue提到国家和地区识别不正确,看了数据样例较为复杂,有的是有国家省市区,有的只有部分,还有国外的。running_page中代码以逗号分隔取国家,然后根据统计用区划代码和城乡划分代码对比取出城市。

问题是,数据是全球的用户是全球的,那全球各个国家和区域的标准应该是什么?中国有省市区,那其他国家有吗?有统一标准吗?

国际标准 ISO 3166

全球化那就必然要找国际标准了,看这里ISO 3166, Codes for the representation of names of countries and their subdivisions

里面又包含了

如何使用

我们拿到gps后做需要逆地址解析拿到ISO 3166标准的代码,有哪些方式可以呢,google map?

我调研了2个方式

Read More

如何启动Phoenix Query Server

问题

启动Phenix Query Server 6.0.0报错

1
2
3
2023-08-03 15:20:01.672088 launching /var/jdk/bin/java -cp /etc/hbase/conf:/etc/hadoop/conf::/var/phoenix-queryserver-6.0.0/bin/../phoenix-queryserver-6.0.0.jar: -Dproc_phoenixserver -Dlog4j.configuration=file:/var/phoenix-queryserver-6.0.0/bin/log4j.properties -Dpsql.root.logger=INFO,DRFA -Dpsql.log.dir=/tmp/phoenix -Dpsql.log.file=phoenix-root-queryserver.log org.apache.phoenix.queryserver.server.QueryServer

错误: 找不到或无法加载主类 org.apache.phoenix.queryserver.server.QueryServer

HBase 2.4.15

Phoenix 5.1.3

前因

升级HBase 2.4.15后,之前的Phoenix 4.13.1就不能用了。从Phoenix官网看到Phoenix和HBase的版本对应。

Current release 4.16.1 can run on Apache HBase 1.3, 1.4, 1.5 and 1.6.
Current release 5.1.3 can run on Apache HBase 2.1, 2.2, 2.3, 2.4 and 2.5.

然后Phoenix 5.1.3中没有带query server,需要单独下载query server并启动,如图

Query Server Installation

Read More

服务器时间错误导致MySQL证书错误问题

HibernateException ‘hibernate.dialect’ not set


同一个jar包,在某个环境下启动应用报错,另一个环境可以正常启动。报上面的错误

1
caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set

MySQL证书错误

查看MySQL日志mysql/mysqld.log其中有

1
2
2000-02-05T02:19:10.762462Z 0 [Note] Found ca.pem, server-cert.pem and server-key.pem in data directory. Trying to enable SSL support using them.
2000-02-05T02:19:10.762482Z 0 [Note] Skipping generation of SSL certificates as certificate files are present in data directory.

MySQL cert error

Read More

选择横表还是纵表

数据库:MySQL 5.7
业务上有25个维度共2000多个指标数据需要存储。对于这种可变字段的指标数据,第一想法是采用纵表存储。但是具体该如何选择还是得结合业务看优缺点才行。

业务场景

数据量

1k台设备,每台设备每5分钟一次全量指标数据,存储60天

  • 纵表:602460/510002000=345.6亿
  • 横表:345.6亿/2000=1728万
查询场景
  • 按指标维度+时间范围分页查
  • 按同一时间上报的指标数据(时间+指标名称)

Read More

宽表、窄表、横表、纵表有什么不同

宽表、窄表是大数据中的概念

宽表,字段比较多的数据库表。将业务主题相关的多个维度的字段关联在一起的一张数据库表。
宽表的本质:以空间换时间
好处:

  • 统一口径
  • 降低统计难度,减少表之间的关联
  • 节省跑数时间
  • 节省资源

窄表,符合三范式,相同维度的字段组成一张表。表和表之间关联查询。

横表、纵表
横表:也称为行表,将数据按照行进行排列。
纵表:也称为列式表或属性表,将数据按照列进行排列。

Read More

如何找到导致fullgc的问题代码

服务频繁fullgc无法对外提供服务。需要查看分析出是大对象?内存分配不合理还是造成了内存泄漏的问题。
查找步骤

  • 查看,确认gc情况
  • 查看jvm运行参数

  • dump分析

  • 找出问题代码

  • 查看存活对象情况

  • 查看该进程下占用CPU最高的线程

查看,确认gc情况

1
jstat -gc [pid] 2000

每2秒打印一次pid的gc情况
jstat gc

Read More

牛仔裤中的牛仔是什么

Q

牛仔裤中的牛仔是什么

A

“牛仔裤”一词源自英文单词“jeans”,最早可以追溯到1567年意大利热那亚港水手穿的一种粗帆布制作的裤子,当时水手们喜欢穿着这种粗糙而结实的布料做成的工作裤子,称之为Genoese, Genes,与Jeans有着相似的发音。1850年淘金热的浪潮下,移民到美国的巴伐利亚人李维·斯特劳斯创立了李维斯公司,该公司生产的帆布工装裤就是世人所知的牛仔裤的鼻祖。这种布料结实耐磨,十分适合应付繁重的日常劳作,受到当时矿工们的喜欢。
因此,牛仔裤中的“牛仔”并不是指牛,而是指穿着这种裤子的工人和冒险家
jeans