InfoBright入库
InfoBright入库有三种方式:1,用mysql的API入库;2,用mysql的load data入库;3,用InfoBright提供的工具Distributed Load Processor(DLP)入库。
Mysql接口支持绑定变量,但只能一条记录,所以我们只能使用insert value list的方式。
SQL 语句为 insert into table_name (col,col…) values (value…),(value…)….
这种方式入库优点:比较容易控制,使用方便,程序调用比较稳定。缺点:经测试入库速度太慢,不能满足需求;同一个表不能并发,在入库的时候如果采取这种方式会锁表,多线程入库会导致入库速度变慢。
Mysql客户端登陆,设置文件名,表名,字段,分隔符等。具体方法如下:
mysql -u root -h 192.168.8.68 –pmysql –D test
set @bh_dataformat = 'mysql';
LOAD DATA INFILE 'DS_CLT_ABIS_MR.csv'
IGNORE INTO TABLE DS_CLT_ABIS_MR
fields terminated by ','
LINES TERMINATED BY '\n'
(N24, CALLID, SEQNO …);
这种方式入库的优点:性能得到了提升,它的速度经测试能达到2M/s;配置导入的时候可以根据具体的字段进行配置,方便灵活。缺点:最大的缺点不支持并发,性能得不到有效提升,速度还是达不到要求;配置繁琐;性能还是达不到要求,错误返回不清晰。
1. file à dlp à 数据库
dataprocessor –i /tmp/ t1.csv –X –T t1 –H hostip –P 5029 –D…
2. file à dlp à .ib文件 à mysql load à 数据库
Dataprocessor –I /tmp/t1.csv –--output-path=c:\tmpib\tq.ib -T t1 …
这种方式入库优点:性能得到了很大的提升,单次入库性能甚至比mysql的dataload还高,而且支持并发,经测试并发性能几乎是线性的,性能能满足需求。缺点:开发不灵活,文件结构必须要跟数据库保持一致,这给开发带来了不方便;dlp不稳定,dlp存在一定的bug。
第一, 由于性能上的要求,以上三种方案我们只能选择第三种用DLP导入,其他两种都达不到性能要求。
第二, 这必须要求我们的CSV文件跟数据库保持一致。
第三, Windows下使用DLP入库的时候我们开始使用的DLP入库的第一种方案入库,在入单个大文件的时候,他不会有问题。但多线程频繁入库的时候,它便会非常频繁的报“得不到资源”的错误。另根据厂家的解释是,网络连接闪断所导致的,那这就是不可避免的而且无法解决的。我认为这是DLP的一个BUG,应该不是网络闪断造成的如果是网络闪断造成的应该是入单个大文件的时候这个问题应该会出现,不是多个文件多线程频繁入库。为了解决这个问题我先把表结构通过脚本加载到本地,然后再通过从本地读取表结构。这样避免了频繁的访问数据库。但是造成部署的工作的繁琐。
第四, Windows下我们从本地读取表结构之后,结果测试发现,多线程的入库会非常频繁的超时。这个厂家也没给出解释,为了解决这个问题,我们只有先把csv文件用DLP转换成InfoBright支持的ib文件格式。然后再用mysql的load data file入库。这种方式入库先从性能上说,性能还是挺快的,他对文件的压缩比非常大,一般能达到10:1,mysql导入很快,性能可以达到要求。
总结:windows下可以先把csv文件用DLP把文件转换成ib文件。最后通过mysql的load data入库。Linux下,崔春华测试多线程入库没有问题。
1,修改环境变量,
1)Linux:打开用户目录下.bash_profile或者.bashrc文件,添加:
export PATH=$PATH:mysql可执行文件路径:dlp可执行文件路径
执行$source .bash_profile
2)Windows可以右击我的电脑,点击属性->高级->环境变量->path中添加就行
2,修改.dataprocessorrc文件host,port,database,uway,login,password
3,把license文件,配置文件.dataprocessrrc,脚本文件拷到工作目录下。
4,执行dlp.sh脚本dlp.sh 文件名 表名
如果报获取不到表结构的错误,可以先把表结构下到本地,具体做法,在某处新建一个目录,比如我们存到/tmp目录下。
执行
dataprocessor -T 表名 --output-path=/tmp --fetch-schema-only -s /tmp/表名.schema
入库的命令改成
dataprocessor -i 文件名 -X -T 表名 -s /tmp/表名.schema.
dlp.sh
#!/bin/bash
# dlp.sh filename tablename
# 此脚本两个参数第一个为csv文件名,第二个为表名
# csv文件命名规则 表名-*.csv
CsvFileName=${1}
TableName=${2}
dlpfile()
{
dataprocessor -i ${CsvFileName} -X -T ${TableName}
if[ $? -eq 0 ]
then
rm -rf ${CsvFileName}
exit 0
else
echo dataprocess failed
exit 2
fi
}
dlpfile
----------------------
.dataprocessor
# Current dataprocessor configuration:
input-type = file
input-path =
output-type = file
#output-path =
schema-path =
host = 192.168.9.140
port = 5029
database = uway
table =
login = info
password = info
data-format = txt_variable
lines-terminated-by = \n
fields-terminated-by = ,
fields-enclosed-by =
escaped-by = \
log-path = dataprocessor.log
# config-path = .dataprocessorrc
heap-size = 320
buffer-size = 64
workers = 16
# compress-lookups = yes
# execute-load = yes
# verbose = yes
# quiet = yes