把文档中的例子改了一下将一个43亿的hive表和tidb中的一个1亿的表jioin 结果集回写tidb
在执行到foreachPartition at TiBatchWrite.scala:291 的时候tikv的监控显示开始写入最初的写入速度是90MB每秒左右这个后来持续下降1。7个小时后只有30M左右 什么原因导致的
表上没有索引有一个tiflash的副本
TiBatchWrite.scala:291这个一行是干了这个事:
今天重新做了一下测试 新建了表 pre_split_region 设为8 开启spark加载数据
开始的时候写入速度一直很稳定在100M左右当空region没有之后写入速度开始下降同时磁盘的读突然开始上升,是不是这时候开始region的分裂导致写入速度下降。另外我们看到region的数量有一个下降和上升的过程这是一个测试环境没有别的复杂,是不是大量的空region倍merge了?请指教我对这个过程的推断:
1.空region确实是被merge了
2.tisaprk中对region的分割值是10万数据,或者96M,在这里96M的估算是在spark中估算的,我不太确定数据落地之后,会不会是一致的,如果region数据过大,会引起region分裂。
select AVG_ROW_LENGTH from information_schema.TABLES t where TABLE_NAME = ‘table_name’;
查一下这个,可以估算一下数据大小。
几个跟splite有关的默认值:
minRegionSplitNum:8 – 最小分割数量
maxRegionSplitNum:4096 – 最大分割数量
regionSplitThreshold:100000 – 分割步长
是spark中把空region merge了吗?分割步长是一个全局的设定而每个数据加载业务中的平均行长是不一致的无法找到一个普世的数值。
另外那几个默认值在哪里改 找不到相关的文档啊
是TiDB把空region merge了,spark没有那么大权利,,
判断region数据量,大体流程是这样的:
基础值基于RDD的partitions数量作为初始region数量
1.如果总体数据量小于10万,直接返回
2.判断partitions数量在不在最大和最小之间,调整到最大或者最小值
3.获取样本数据(后续计算数据大小用)
4.基于样本数据衡量partitions中数据存储大小,如果单partition数据存储过大,则调整rgion数量
5.判断partitions数量在不在最大和最小之间,调整到最大或者最小值
6.返回
解决问题的最好办法是读源码,
观察了一下spakr入库时候的日志发现TwoPhaseCommitter阶段 prewrite secondary key row=27 size约为16K 如果将row 增大会不会增加入库效率 ,从主机测观察io占用率很高但是读写的速度毕竟并不是特别高最高只有100M左右。请教一下有哪些方法可以调整入库的批的大小看了一下源码 默认值是16K 由这个参数控制 TIDB_TXN_PREWITE_BATCH_SIZE
新的问题是这个参数是在哪设置的
val txnPrewriteBatchSize: Long = getOrDefault(TIDB_TXN_PREWITE_BATCH_SIZE, “16384”).toLong
// 16 * 1024 = 16K
val txnCommitBatchSize: Long = getOrDefault(TIDB_TXN_COMMIT_BATCH_SIZE, “16384”).toLong
// 32 * 1024