原文链接:https://www.gbase.cn/community/post/4649 更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。
概述
本文对GBase 8a集群的加载功能模块从原理和架构两方面进行说明,提供加载性能参数调优方案和kafka数据源的加载导出方案,为用户了解和使用GBase 8a加载功能提供参考。
功能特性
GBase 8a集群加载支持本地文件、ftp/sftp、http/https、hdfs、kafka、S3等常用数据源;
支持使用平文本、avro/orc(未release)文件格式进行加载;
支持使用压缩格式gzip、snnapy、lzo进行加载;
支持普通文本、定长、宽松加载模式;
支持kerberos认证,多namenode高可用。
支持多表、单表并行加载,多数据源并行加载;
支持多点传输,多节点并行数据解析,单节点多线程并行。
架构及原理
GBase 8a加载功能架构图如下:
1、数据加载SQL下发,gcluster接收SQL任务
2.1、gcluster解析URL生成具体的源数据文件列表
2.2、gcluster按gnode加载节点数量均分源数据文件。如15G数据文件均分3个加载节点时,gcluster进行数据切分,每个加载节点5G加载任务。完成数据切分后,gcluster给gnode加载节点下发加载SQL任务。
3、gnode接收加载SQL任务后,去文件服务器上读取指定数据。
3.1、gnode对读取到的加载数据进行解析。
3.2.1、将合法数据按表和hash列分配归入对应表分片的DC中。
3.2.2、gnode将DC压缩文件转发到对应的主分片节点上
3.2.3、主分片gnode节点将收到的dc文件组装好后实时转发到副本节点上
加载性能调优
GBase 8a采用多点传输技术,集群中的每个节点均参与数据的解析和加载,且加载性能可以随着集群节点数的增加线性扩展,通过加载性能调优,仅使用8台服务器即达到33TB/小时的加载速度。
加载性能相关参数
- gcluster_loader_max_data_processors
说明:单个加载任务并行加载机的个数
默认值:16
调优值:在加载并发较高、集群节点较多场景下推荐配置为4~8
- gbase_loader_parallel_degree
说明:data节点执行单个加载任务的并行度
默认值:0,使用CPU核数一半,当设置值大于线程池数量时,则使用线程池数量。
调优值:配置为4~6。可以通过set方式设置,也可以使用PARALLEL在加载语句中指定。
- _gbase_dc_sync_size
说明:数据文件磁盘落地大小
默认值:1TB
调优值:当存在data节点磁盘IO繁忙、加载性能缓慢、CPU资源利用底时,可调小该参数,推荐10M
- gbase_parallel_max_thread_in_pool
说明:线程池中的线程总数,用于配置线程池大小。
默认值:CPU核数的2倍
调优值:在每个服务器上部署1个gnode节点的情况下推荐该配置为CPU核数的4~8倍。
- gcluster_enable_serial_load、gcluster_serial_exec_query
说明:限制任务并发数,
调优值:开启gcluster_enable_serial_load参数后,每个gcluster节点可以下发gcluster_serial_exec_query个SQL任务(select、insert select、load等),主要控制并发时,下发到gnode的SQL数量,超过后排队。
- gbase_loader_max_line_length
说明:超长行大小
默认值:4M
调优值:当数据文件中存在超过4M大小的行时,加载任务会报错中断,增加该值可以跳过该行继续加载,超过4M的数据保存在errdata中
- gbase_loader_read_timeout
说明:数据文件读取超时,读取ftp/http/sftp文件超时的时间设置
默认值:300秒,0无限制。
调优值:当集群负载较高、数据源IO或网络较差时,调大该参数可避免数据源读取超时报错
- 数据源服务器参数
如ftp/sftp并发访问数、端口数等,具体问题具体分析
- 数据源并发数评估
集群最大并发加载任务数为N,单加载任务最大加载机数(max_data_processors)为M时,数据源推荐的并发数不低于M*N。
分块加载
分块加载原理:
gcluster文件切分是用URL表示的多个逻辑块,交由多个data节点并行加载,文件服务器并不实际进行文件切分。
8a加载按行处理,data节点对分配给自己的逻辑块数据逐行进行加载,排除开头属于前一个节点的数据(第一个换行符前),以及读取结尾完整的数据行(直到下一节点的第一个换行符为止)
加载数据量:
一次加载支持读取和处理的数据量大小与以下参数相关:
- gbase_loader_buffer_count
说明:加载使用内存块数。data节点内部维护一个内存链表。
默认值:16 - gbase_loader_line_length
说明:各内存块大小。data节点从数据源一次性读取4M大小的数据内容放到内存链表中进行后续处理
默认值:4M
分块加载使用场景:
对于不同使用场景,可灵活调整分块加载配置:
- 对于加载节点少,加载任务的数据总量大的使用场景,gcluster将一次加载任务中的数据总量按加载节点数均分给各个加载节点并行执行,能大幅提升加载性能。
- 对于加载节点多,加载任务的数据总量小,避免对数据切块粒度太小降低加载性能,可通过以下参数调优:
gcluster_loader_min_chunk_size
说明:设置大文件切块的最小粒度,范围4M—128M,作用同加载SQL参数MIN_CHUNK_SIZE。
默认值:64M,即小于128M的文件不进行切分。
- 以下使用场景执行加载时不会对数据文件进行切分:
1. 加载语句带参数NOSPLIT会关闭分块并行
2. 加载语句有having lines separator或者format 5
3. 加载的文件是.gz或者.snappy压缩文件,建议打包小文件
关闭分块并行功能后,每个data节点处理1个文件,如下图示。
负载均衡配置
GBase 8a支持负载均衡,根据任务数自动优选加载节点,提供以下参数配置加载任务负载均衡,提升加载性能:
- gcluster_loader_max_data_processors
说明:集群中加载节点的数量,同加载SQL参数MAX_DATA_PROCESSORS
取值范围:1-300
默认值:16
调优值:建议4-6。
- gcluster_load_rebalance_seed
说明:加载任务负载均衡控制,集群中加载节点的选择方式可通过此参数微调
默认值:5。
调优值:加载任务随机选择执行任务数最少的几个data节点作为数据加载节点。在加载并发较多场景下,可以适当增加该值,从而增加满足加载机条件的data节点个数。
示例:在12个data节点集群中,MAX_DATA_PROCESSORS=4的情况下,一次加载任务会随机选择不超过四个data节点作为加载机。
如果gcluster_load_rebalance_seed值为5,集群中所有data节点的最小任务数为20,则所有任务数<=25的data节点都可供本次加载任务随机选择为加载节点;
但是<=25的节点个数不足四个时,则使用满足该要求的几个节点作为加载机,因此可以调大rebalance_seed参数值来扩大可选加载机的范围,但通常不超过10。
加载状态监控
GBase 8a提供查看加载状态和加载结果的系统表与日志,支持加载过程监控、结果查询、错误数据溯源。
- 加载状态信息查看:
加载任务启动后,可通过SQL方式查看本次加载任务的状态信息。状态信息表information_schema.load_status中记录正在运行的所有加载任务的状态信息。 - 加载结果:
加载任务的结果信息存储在load_result.log文件中,可以通过information_schema.load_result系统视图查看。
LOAD_RESULT表:记录当前 coordinator 节点的加载信息
CLUSTER_LOAD_RESULT表:记录所有 coordinator 节点的加载信息
注意:information_schema库的表查询都会占用内存,load_result表会话之间不共享,并发查询时每个会话会读取一份,load_result到自己的session内存中。加载设计过程中及运维过程中需合理使用information_schema库表的查询,及时清理废弃日志。
加载接口开发
GBase 8a集群通过gccli工具、jdbc/.net开发接口执行SQL语句加载数据,提供的开发接口包括:
1、jdbc接口
executeUpdate(loadSql) -- 执行加载语句
stmt.getSkippedLines() -- 获取跳过错误数据行数
stmt.getLoadTaskID() -- 获取加载任务id
2、ado.net接口
cmd.ExecuteNonQuery() -- 执行时间加载SQL
cmd.RecordsSkipped -- 跳过错误数据行数
cmd.RecordsTaskID -- 加载任务ID
3、ODBC接口
提供SQLROWCOUNT(hstmt,&rowCount)获取加载成功行数
SQLGetStmtAttr()中的SQL_RES_GBASE_LOAD_TASK_ID获取任务ID
SQL_RES_LOAD_TASK_SKIPPED_LINES获取忽略行数
4、Python API接口
提供getInfo接口可获取成功行数、忽略行数、任务ID三个信息
其它加载问题
- 数据加载文件的读写一致性
在使用freeNas等软件搭建数据文件服务器时,建议使用同一种文件访问接口,避免对同一个数据文件同时使用NFS接口、FTP接口, 容易出现文件读写不一致问题。
- 加载SQL参数[MAX_BAD_RECORDS number]
说明:用于设定错误数据的行数上限。
取值范围:0~ 4294967295,0表示只要有错误数据就报错退出,加载任务自动回滚。
调优值:所有集群节点独立计算加载错误数量,一旦有一个节点加载时错误数据达到本限制,则终止所有节点的加载任务。集群加载提交之前检查总错误条数是否超出限制,如果超出限制,放弃提交,报错退出。
- 大量小文件加载优化(862.33R39、953版本及以上)
一般小于10M的文件为小文件,大于1G的文件为大文件。相同数据量,文件个数越多,提升越多;同样大小的文件,文件个数越多,提升越多。
相同数据源复用网络连接
集群层,相同目录文件转化成文件通配方式批量获取文件大小,不同目录文件复用网络连接
kafka数据集成
GBase 8a集群支持使用kafka集群作为数据源进行数据加载和导出,kafka数据源加载任务的相关信息可以在gclusterdb系统库中表topicname_dbname_tbname里查看。
- 加载kafka集群中的文本数据SQL如下:
kafka://broker/topic[?duration=1000][#frombeginning]
load data infile ‘kafka://192.168.146.20:9092/vct?duration=1000#frombeginning’ into table vc1.testdb.t
- 导出文本数据到kafka集群SQL如下:
kafka://broker1/topicname?[brokers=broker2|broker3|...][partition=pt1]
select * from test.lineitem into outfile 'kafka://192.168.8.127:9092/test?brokers=192.168.8.127:9092|192.168.8.127:9093&partition=0' [OPTIONS]
Kafka broker高可用
GBase 8a支持配置Kafka的broker高可用,支持一套带kerberos认证功能的kafka集群作为加载数据源:
1、在gcluster配置文件中添加参数:
gcluster_kafka_brokers ‘192.168.146.20:9092,192.168.146.21:9092’
2、重启gcluster服务使其起效:
gcluster_services all start
Kafka流式加载
GBase 8a通过脚本实现Kafka流式加载,如:
while true do load_sql done
load data infile ‘kafka://192.168.146.20:9092/topic1?duration=2000#frombeginning’ into table t;
原文链接:https://www.gbase.cn/community/post/4649 更多精彩内容尽在南大通用GBase技术社区,南大通用致力于成为用户最信赖的数据库产品供应商。