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条记录