6.7. 不同表不同分片

6.7.1. 使用背景

​ 目前部分业务中存在表的数量很多,但是每张表的数据很少的情况。这会造成文件数量很多,导致分布式文件系统压力很大,故针对小表,我们可以通过减少分片的方式,从而减少文件数量。

6.7.2. 使用方法

注意 partcount部分的写法 ;partcount 的值如果为0 则会写所有分片(默认值)。

下面按照例子分别说明:

  • 2:表示默认值,当后面所有的规则都没有匹配上会取该值

  • mm@8:如果分区名含有mm关键字,则会使用8个分片

  • single@1:如果分区名含有single关键字,则会使用1个分片

  • all@0:如果分区名含有all关键字,则会使用所有分片

  • yyyyMMdd_3@6: 最近3天的分区,转换为yyyyMMdd后如果能匹配上,会写6个分片

  • yyyyMM_20@5 : 最近20天的分区,转换为yyyyMM后如果能匹配上,会写5个分片(适用于部分按月分区的情形)

  • yyyy_60@3: 最近60天的分区,转换为yyyy后如果能匹配上,会写3个分片(适用于按年分区的情形)

create table olap_test(
s_high y_string_is,
s_middle y_string_is,
s_low y_string_is,

l_high y_long_is,
l_middle y_long_is,
l_low y_int_is,

d_high y_double_is,
d_middle y_double_is,
d_low y_double_is 
)
tableproperties
(
partcount='2 mm@8 yyyyMMdd_3@6 yyyyMM_20@5 yyyy_60@3 single@1 all@0 ',
);

6.7.3. 实时模式配置

实时模式需要依赖kafka的dispatch设置,dispatch名称不可更改,必须是这个名字。

cl.stream.reader.list=xxx其他topic,dispatch
kafka.topic.dispatch=dispatch_test_topic
bootstrap.servers.dispatch=10.10.12.7:9092,10.10.12.8:9092,10.10.12.9:9092,10.10.12.10:9092
kafka.group.dispatch=dispatch_group
kafka.conf.params.dispatch=
#dispatch目前kafka与json的设置不可以变,且kafka的partition的数量>=lsql的进程数*每个进程的分片数(非常重要)
cl.stream.consumer.class.dispatch=cn.lucene.plugins.service.stream.api.impl.CLKafkaConsumer
cl.stream.parser.class.dispatch=cn.lucene.plugins.service.stream.api.impl.CLJsonParser

6.7.4. 对数据量较大的topic禁用转发功能

不同表不同分片的kafka模式,可以针对数据量较大的topic禁用转发功能,以提高性能。

​ 可以通过"kafka.dispatch"+prefix=false来单独控制某个topic是否禁用,true表示禁用,不配置或者false表示不禁用。

6.7.5. 不同表不同分片,可以按照视图表进行hash

​ 不同表不同分片,可以按照视图表进行hash(目前仅限实时模式),可以根据表名或字段名hash 1~多个不同的分片中去,这个功能属于备用功能,在特定的场景会用到:

tableproperties
(
partcount='4',
dispatchfield='mapping_name@2'
);

6.7.6. 测试过程

测试日期为20190616。

1. 实时导入测试

  • 测试1:
sh ./kafka.sh mm_kafka_001 1000000    #命中mm 应该为8个分片 1000000条记录
  • 测试2:
sh ./kafka.sh mm_kafka_002 1000000    #命中mm 应该为8个分片 1000000条记录
  • 测试3:
sh ./kafka.sh 20190616_kafka 1000000    #命中yyyyMMdd_3 应该为6个分片 1000000条记录
  • 测试4:
sh ./kafka.sh 20190602_kafka 1000000    #命中yyyyMM_20 应该为5个分片 1000000条记录
  • 测试5:
sh ./kafka.sh 20190402_kafka 1000000 #命中yyyy_60 应该为3个分片 1000000条记录
  • 测试6:
sh ./kafka.sh 20180302_kafka 1000000 #无命中 应该为2个分片 1000000条记录
  • 测试7:
sh ./kafka.sh kafka_single 1000000 #命中single 应该为3个分片 1000000条记录
  • 测试8:
sh ./kafka.sh mm_mix_001 1000000 #命中mm 应该为8个分片 1000000条记录
  • 测试9:
sh ./kafka.sh single_mix_001 1000000 #命中single 应该为3个分片 1000000条记录
  • 测试10:
sh ./kafka.sh mix_001 1000000  #无命中 应该为2个分片 1000000条记录
  • 测试11:
sh ./kafka.sh all_kafka_001 1000000 #命中all 应该为16个分片 1000000条记录

2. 离线导入测试

  • 测试1:
 ./load.sh -t olap_test -p mm_load_001 -tp txt -f /data/example/scan/c -sp , -fl s_high,s_middle,s_low,l_high,l_middle,l_low,d_high,d_middle,d_low #命中mm 应该为8个分片 1000000条记录
  • 测试2:
 ./load.sh -t olap_test -p mm_load_002 -tp txt -f /data/example/scan/c -sp , -fl s_high,s_middle,s_low,l_high,l_middle,l_low,d_high,d_middle,d_low #命中mm 应该为8个分片 1000000条记录
  • 测试3:
 ./load.sh -t olap_test -p 20190616_load -tp txt -f /data/example/scan/c -sp , -fl s_high,s_middle,s_low,l_high,l_middle,l_low,d_high,d_middle,d_low #命中yyyyMMdd_3 应该为6个分片 1000000条记录
  • 测试4:
 ./load.sh -t olap_test -p 20190602_load -tp txt -f /data/example/scan/c -sp , -fl s_high,s_middle,s_low,l_high,l_middle,l_low,d_high,d_middle,d_low #命中yyyyMM_20 应该为5个分片 1000000条记录
  • 测试5:
 ./load.sh -t olap_test -p 20190402_load -tp txt -f /data/example/scan/c -sp , -fl s_high,s_middle,s_low,l_high,l_middle,l_low,d_high,d_middle,d_low #命中yyyy_60 应该为3个分片 1000000条记录
  • 测试6:
 ./load.sh -t olap_test -p 20190302_load -tp txt -f /data/example/scan/c -sp , -fl s_high,s_middle,s_low,l_high,l_middle,l_low,d_high,d_middle,d_low #无命中 应该为2个分片 1000000条记录
  • 测试7:
./load.sh -t olap_test -p load_single -tp txt -f /data/example/scan/c -sp , -fl s_high,s_middle,s_low,l_high,l_middle,l_low,d_high,d_middle,d_low #命中single 应该为3个分片 1000000条记录
  • 测试8:
./load.sh -t olap_test -p mm_mix_001 -tp txt -f /data/example/scan/c -sp , -fl s_high,s_middle,s_low,l_high,l_middle,l_low,d_high,d_middle,d_low #命中mm 应该为8个分片 2000000条记录 (有实时导入的100万)
  • 测试9:
./load.sh -t olap_test -p single_mix_001 -tp txt -f /data/example/scan/c -sp , -fl s_high,s_middle,s_low,l_high,l_middle,l_low,d_high,d_middle,d_low #命中single 应该为3个分片 2000000条记录 (有实时导入的100万)
  • 测试10:
./load.sh -t olap_test -p mix_001 -tp txt -f /data/example/scan/c -sp , -fl s_high,s_middle,s_low,l_high,l_middle,l_low,d_high,d_middle,d_low #无命中 应该为2个分片 2000000条记录 (有实时导入的100万)
  • 测试11:
./load.sh -t olap_test -p all_load_001 -tp txt -f /data/example/scan/c -sp , -fl s_high,s_middle,s_low,l_high,l_middle,l_low,d_high,d_middle,d_low #命中all 应该为16个分片 1000000条记录
Copyright © lucene.xin 2020 all right reserved修改时间: 2021-07-02 11:42:23

results matching ""

    No results matching ""