FASTLOAD的使用

来源:互联网 发布:北塔软件怎么样 编辑:程序博客网 时间:2024/06/09 15:55

Fastload

1. 简介:
Teradata 作为数据仓库行业的老大,其对数据并行处理能力令人钦佩,而Fastload 工具填充数据的速度绝对可以让任何人惊讶。本文就Fastload 工具的使用作一介绍,希望能帮助读者快速掌握这个工具的使用。
Fastload 支持批处理的脚本编写方式,也支持交互式的方式。其功能就是从数据文件中把大批数据快速插入Teradata 数据库。在数据仓库建设阶段对ETL是非常重要的手段,平均比其他第三方ETL 工具快3 倍以上。


另外Fastload也提供了错误-恢复执行功能,能够继续先前由于各种原因停下来没有完成的工作。
Fastload 能够从主机、专线、或者一般的TCP/IP 连接的计算机节点上运行。
使用限制:必须是空表,并且该表上没有外健,也没有除了UPI 或者NUPI 以外的索引。还有要注意的一点,
就是即使要上载的表是MULITISET(允许重复纪录)的,FASTLOAD 也不会将重复的纪录装入。


2. Fastload 运行过程介绍
共有2 个步骤,数据装载和数据排序过程
装载过程:接收从数据源文件传来的大量数据,并且按照HASH 算法把数据进行分布,分布到对应的AMP 里面去。
数据记录被写入没有排序的数据块中。
数据排序:把装载步骤生成的大量数据块进行排序操作,并且把数据块写入磁盘。
3. 支持的文件格式
在使用FASTLOAD 时候,数据源文件有很严格的规则。
FASTLOAD 支持5 种文件格式
a) DATA 文件:使用FASTEXPORT 或者BTEQ 生成的数据文件。(用.export data file=… 命令生成)。
b) INDICDATA 文件: 和第一种的区别在于文件包含了NULL 的信息(用.export indicdata file=…命令生成)。
c) VARTEXT 文件:变长的纪录字段,每个字段之间用某个特定的字符分隔。
d) 无格式文件:需要指定某个字段的起始位置和长度,还要指定换行符的长度
(需要注意的是UNIX 里面用一个字节长度表示换行,WINDOWS 里面是2 个)
例如文件格式为:
+470000000542+0010+470000000659+Jan 01 2003+
+470000000543+0011+470000000660+Jan 11 2003+
+470000000544+0012+470000000661+Jan 23 2003+
就必须这样定义字段(WINDOWS 环境)
define
SERV_ID (char(12)), deliml(char(1)),
CUST_ID (char(4)), delim2(char(1)),
CONTRACT (char(12)), delim3(char(1)),
C_DATE (char(11)), delim4(char(1)),
newlinechar(char(2))
e)二进制文件:用得比较少。
4. Fastload 的.Begin Loading 命令介绍
.begin loading dbname.tablename errorfiles dname.e1,dname.e2,checkpoint 1000 indicators;
dbname 表示要装入的数据库名称
tablename 表示要装载的表的名称(必须已经存在)
e1 和e2 可以随意指定(不能和数据库中已经存在的对象重名)用来记录当FASTLOAD 不成功时候的错误信息,
对应错误的数据包等信息,并且能够利用这2 个表进行一旦出现上传友问题时候,不用全部重新开始上传的恢复机制。
Checkpoint 1000 表示每1000 条记录检查一次,在第一步骤暂停情况下,可以不用重新从第一条记录开始,而从最
后一次检查点处继续装载过程。
Indicators 表示当数据文件里面有表示空子段的标示时,可以保留空子段。前提是要上传的文件时使用fastexport 或者
bteq 的 .import indicdata file=…;方式生成的数据文件。
5. Fastload 的“错误恢复执行”功能
a)如果数据在装载过程出错(数据库空间不够或者用户中止程序的执行等),在排除错误后可以重新执行FASTLOAD 脚本,
如果指定了CHECKPOINT 参数,数据将在通过CHECKPOINT 点处开始继续装载。如果没有指定CHECKPOINT,系统将不知道从
哪里开始是准确的,从第一条开始重新装载。
b)多次装载,这个功能非常有用,比如要装载的表的内容在2 个文件中,就应该采用该功能。如果在一个脚本中执行了
BEGIN LOADING 但是没有ENDLOADING 语句,并且没有任何错误。装载将停下来,等待用户选择装载下个一个文件或者执
行END LOADING 语句。
c)如果程序在第二阶段出错,只要简单的执行BEGIN LOAGING 和END LOADING命令即可,这样将重新第二阶段的运行。
6. Fastload 交互方式常用命令
HELP;可以看到FASTLOAD 的全部语法
SHOW;可以查看由DEFINE 命令定义的字段格式
HELP TABLE TNAME;比较有用,可以不用对字段进行逐一定义,省略DEFINE语句。
CLEAR;清除上面所有DEFINE 的定义
另外DEFINE 的内容可以叠加,可以定义若干字段之后,HELP TABLE 这时候SHOW之后就会发现定义的内容是
DEFINE命令和HELP TABLE命令的全部内容。
7. Sessions 命令说明
sessions 指定了同时连接TERADATA 服务器的进程数目,
sessions 命令的语法是 sessions max min;
限制条件是最多可以指定与AMP 个数相同个session,如果大于AMP 个数,将按照AMP 个数进行处理。
Sessions *;表示将用系统的AMP 个数进行操作。
题外话:session 命令在不同的工具中有不同的写法,多个session 不一定好,对fastload 来说,session
多一些很有好处,但是对于需要进行全表扫描的操作多个session 仍然会造成session 的顺序执行,同时浪费资
源,降低系统的性能。例如bteq 里面如果需要在没有索引的字段上进行对某条记录的查询,就不要用多个session.
8. Fastload 脚本例子和说明(其中数据源文件的格式是变长纪录的文本文件)
sessions 4;
errlimit 25;
/*登陆服务器,要修改hosts 文件格式为增加一行 teracop1 10.10.10.10 */
logon tera/qin,qin;
/*创建要插入的空表*/
create table qin.mb_nbr (
SERV_ID varchar(12),
CUST_ID smallint,
CONTRACT varchar(12),
C_DATE date
)unique primary index(SERV_ID);
/*设置源文件的格式为变长的字符串,并且每个字段用’:’分隔*/
set record vartext ":" ;
/*定义要传入的表的字段格式和数据文件名称*/
define
SERV_ID (varchar(12)),
CUST_ID (smallint),
CONTRACT (varchar(12)),
C_DATE (date ,NULLIF=0)
) file=e:MB_SERV_ACC_NBR;
/*显示上面的定义*/
show;
/*开始装载数据*/
begin loading mb_nbr errorfiles qin.e1, qin.e2 checkpoint 1000;
insert into qin.mb_nbr(
:SERV_ID,
:CUST_ID,
:CONTRACT);
/*结束装载并退出*/
end loading;
logoff;
9. 执行的片断,从中可以清楚地看到FASTLOAD 的2 个阶段。
C:_fastload>fastload <fl_in.ctl >fl_out.txt ( <表示输入脚本, >表示
输入屏幕内容)
**** 16:57:45 Number of recs/msg: 232
**** 16:57:45 Starting to send to RDBMS with record 1
**** 16:57:51 Starting row 100000
**** 16:57:59 Starting row 200000
**** 16:58:07 Starting row 300000
**** 16:58:14 Starting row 400000
**** 16:58:22 Starting row 500000
**** 16:58:32 Starting row 600000
**** 16:58:43 Starting row 700000
**** 16:58:48 Sending row 747882
**** 16:58:48 Finished sending rows to the RDBMS
==============================================================
= End Loading Phase =
==============================================================
0010 end loading;
**** 17:00:55 END LOADING COMPLETE
Total Records Read = 747882
Total Error Table 1 = 0 ---- Table has been dropped
Total Error Table 2 = 0 ---- Table has been dropped
Total Inserts Applied = 747882
Total Duplicate Rows = 0
Start: Thu Sep 04 16:58:50 2003
End : Thu Sep 04 17:00:55 2003
0011 logoff;
==============================================================
= Logoff/Disconnect
==============================================================
**** 17:01:05 Logging off all sessions
**** 17:01:05 Total processor time used = '11.1761 Seconds'
. Start : Thu Sep 04 16:57:40 2003
. End : Thu Sep 04 17:01:05 2003
. Highest return code encountered = '0'.
**** 17:01:05 FDL4818 FastLoad Terminated

fastload(2)

FASTLOAD的特性:
1)FASTLOAD脚本包含三个主要模块:
建表模块、Define模块、Insert模块。

2)FASTLOAD分为两个阶段:
第1阶段 - 从数据文本中读取记录,只需放到目标AMP上即可
第2阶段 - 在AMP内部按Rowhash进行排序
3)FASTLOAD的目标表初始的时候只能是个空表。
4)FASTLOAD的目标表不能定义次索引,但可以定义分区字段。
5)FASTLOAD一次只能对一张表进行加载,不支持对多张表进行加载。
6)FASTLOAD支持多个数据文件一次性加入一张表中,但这些数据文件是串行加载并非并行加载。
7)FASTLOAD在加载的时候会自动剔除文本中的重复记录,即使目标表定义为multiset table。

典型的fastload脚本示例如下:
/* 限制错误记录条数*/
ERRLIMIT 1;

/* 数据库登录语句*/
LOGON ETL_TD_STAGE,ETL_TD_STAGE;

/* 建表模块*/
DATABASE TD_STAGE;
DROP TABLE AUCTION_PROPERTY;
DROP TABLE PLOG.AUCTION_PROPERTY_E1;
DROP TABLE PLOG.AUCTION_PROPERTY_E2;

CREATE MULTISET TABLE AUCTION_PROPERTY ,NO FALLBACK ,
NO BEFORE JOURNAL,
NO AFTER JOURNAL,
CHECKSUM = DEFAULT
(
AUCTION_ID CHAR(32) CHARACTER SET LATIN CASESPECIFIC,
PROPERTY_ID DECIMAL(11,0),
PROP_VID INTEGER,
STATUS INTEGER,
GMT_CREATE TIMESTAMP(0),
GMT_MODIFIED TIMESTAMP(0),
INS_DATE TIMESTAMP(0))
PRIMARY INDEX ( AUCTION_ID );

/* 方式一:设置加载方式为变长,分割符为Tab键*/
/* 同时,进入加载第1阶段*/
.SET RECORD VARTEXT " " NOSTOP
BEGIN LOADING AUCTION_PROPERTY ERRORFILES PLOG.AUCTION_PROPERTY_E1,PLOG.AUCTION_PROPERTY_E2;

/* DEFINE模块,定义数据文本格式和存放路径*/
DEFINE
AUCTION_ID (VARCHAR(42),nullif='')
,PROPERTY_ID (VARCHAR(21),nullif='')
,PROP_VID (VARCHAR(20),nullif='')
,STATUS (VARCHAR(20),nullif='')
,GMT_CREATE (VARCHAR(25),nullif='')
,GMT_MODIFIED (VARCHAR(25),nullif='')
,INS_DATE (VARCHAR(25),nullif='')

FILE=/bak/Teradata/auction_property.txt;

/* 方式二:设置加载方式为定长,分割符为Tab键*/

DEFINE
AUCTION_ID (VARCHAR(42),nullif='')
,TAB1 (CHAR(1))
,PROPERTY_ID (VARCHAR(21),nullif='')
,TAB2 (CHAR(1))
,PROP_VID (VARCHAR(20),nullif='')
,TAB3 (CHAR(1))
,STATUS (VARCHAR(20),nullif='')
,TAB4 (CHAR(1))
,GMT_CREATE (VARCHAR(25),nullif='')
,TAB5 (CHAR(1))
,GMT_MODIFIED (VARCHAR(25),nullif='')
,TAB6 (CHAR(1))
,INS_DATE (VARCHAR(25),nullif='') 
,NEWLINE (CHAR(1))

FILE=/bak/Teradata/auction_property.txt;

/* 设置加载起点,也可以设置加载终点(THRU)*/
RECORD 1;

/* INSERT模块,定义物理表对应的格式*/
INSERT INTO TD_STAGE.AUCTION_PROPERTY(
AUCTION_ID 
,PROPERTY_ID 
,PROP_VID 
,STATUS 
,GMT_CREATE 
,GMT_MODIFIED 
,INS_DATE 
)
VALUES (
:AUCTION_ID 
,:PROPERTY_ID 
,:PROP_VID 
,:STATUS 
,:GMT_CREATE (format 'yyyymmddhhmiss') 
,:GMT_MODIFIED (format 'yyyymmddhhmiss') 
,:INS_DATE (format 'yyyymmddhhmiss') 
);

/* 第1阶段结束,进入加载第2阶段*/
END LOADING;

/* 数据库退出语句*/
LOGOFF;


典型的fastload日志示例如下:

/* 第1阶段,文本记录无序录入到AMP上*/

**** 19:44:59 Number of recs/msg: 3
**** 19:44:59 Starting to send to RDBMS with record 1
**** 19:45:08 Starting row 100000
**** 19:45:18 Starting row 200000
**** 19:45:28 Starting row 300000
**** 19:45:38 Starting row 400000
**** 19:45:48 Starting row 500000
**** 19:45:58 Starting row 600000
**** 19:46:08 Starting row 700000
**** 19:46:18 Starting row 800000
**** 19:46:28 Starting row 900000
**** 19:46:38 Starting row 1000000
**** 19:46:39 Sending row 1015760
**** 19:46:39 Finished sending rows to the RDBMS

/* 第2阶段,AMP内部进行排序*/
===================================================================
= =
= End Loading Phase =
= =
===================================================================

0013 END LOADING;

**** 19:47:58 END LOADING COMPLETE

Total Records Read = 1015760
- skipped by RECORD command = 0
- sent to the RDBMS = 1015760
Total Error Table 1 = 0 ---- Table has been dropped
Total Error Table 2 = 0 ---- Table has been dropped
Total Inserts Applied = 1015760
Total Duplicate Rows = 0

Start: Thu Mar 01 19:46:40 2007
End : Thu Mar 01 19:47:58 2007


2.Using fastload

batch mode运行参数:

3.两个错误日志表区别:
errortname1 
? Constraint violations
? Conversion errors
? Unavailable AMP conditions
These types of errors always occur during the loading phase of your FastLoad job—after executing the BEGIN LOADING command, but
before the END LOADING command.

errortname2 
Unique primary index violations
This type of error always occurs during the end-loading phase of your FastLoad job—after executing the END LOADING command.