动手实验2OLHbj.docx
《动手实验2OLHbj.docx》由会员分享,可在线阅读,更多相关《动手实验2OLHbj.docx(22页珍藏版)》请在冰豆网上搜索。
动手实验2OLHbj
动手实验:
OracleHadoop装载程序
实验环境2
实验1:
装载Hadoop文件到数据库3
步骤1:
创建目标表3
步骤2:
在Hadoop中放入示例文件3
步骤3:
运行OracleHadoop装载程序3
步骤4:
验证结果4
实验2:
装载Hadoo文件到DataPump格式文件5
步骤1:
创建目标表5
步骤2:
在Hadoop中放入示例文件5
步骤3:
运行OracleHadoop装载程序5
步骤4:
把生成的文件取回到本地6
步骤5:
将文件以外部表附加到数据库6
步骤6:
检查结果7
步骤7:
导入数据7
步骤8:
再次检查结果7
实验3:
装载Hadoo文件到预分区的DataPump格式文件8
步骤1:
创建目标表8
步骤2:
在Hadoop中放入示例文件8
步骤3:
运行OracleHadoop装载程序9
步骤4:
把生成的文件取回到本地9
步骤5:
将部分文件以外部表附加到数据库10
步骤6:
检查结果11
步骤7:
把其他分区附加到数据库11
步骤8:
再次检查结果11
实验4:
装载多个Hadoop文件12
步骤1:
创建目标表12
步骤2:
在Hadoop中放入示例文件12
步骤3:
运行OracleHadoop装载程序,使用文件名通配符12
步骤4:
检查结果13
步骤5:
运行OracleHadoop装载程序,使用文件名列表13
步骤6:
再次检查结果14
实验环境
软件环境:
本实验主要由以下软件搭建而成:
OracleEnterpriseLinux,Oracle11g,JavaSE6update30,ApacheHadoop,OracleConnectorforHadoop等.
实验用到的文件:
实验用到的文件保存在/home/hadoop/training/OLH目录下,包括脚本文件以及一些示例数据文件。
环境变量:
在文件olhodchenv.sh中保存了实验中需要用到的环境变量.为了简化操作,已经在实验中的$HOME/.bash_profile引用该文件,这些环境变量会自动生效。
变量名
变量值
ORACLE_HOME
/home/oracle/app/oracle/product/11.2.0/dbhome_2
HADOOP_HOME
/opt/hadoop
OLH_HOME
/opt/OLH
OLH_JAR
OLH_HOME/jlib/oraloader.jar
HADOOP_CONF_DIR
${HADOOP_HOME}/conf
ORACLE_SID
orcl
一些有用的信息
下表中也列出了实验中可能需要的一些信息.
项目
值
虚拟机IP
172.16.22.131
虚拟机主机名
bigdata01
HadoopdefaultFS
hdfs:
//bigdata01:
9000
HadoopJobTrackerURL
hdfs:
//bigdata01:
9001
实验用操作系统用户密码
hadoop/oracle
实验用数据库用户密码
Scott/tiger
操作系统oracle用户密码
oracle/oracle
数据库超级用户
sys/oracle
操作系统超级用户
root/oracle
文档中‘PROMPT>’指的是操作系统SHELL的输入界面
‘SQL->’指的是OracleSQL*Plus的输入界面
用hadoop/oracle登录172.16.22.131.
检查环境变量是否正确设置.
PROMPT>env
应该能看到上面提到的环境变量.
检查hadoop是否正常.
PROMPT>hadoopdfsadmin-report
检查数据库是否正常
PROMPT>sqlplusscott/tiger
SQL>select*fromtab;
实验1:
装载Hadoop文件到数据库
在实验1里,我们将会把一个Hadoop文件系统上的文件装载到数据库中(使用JDBC连接)。
这是OLH的最基本功能。
步骤1:
创建目标表
首先,我们在数据库中新建一个表,我们的数据将会装载到这个表里.
检查脚本文件并运行之:
PROMPT>cd/home/hadoop/training/OLH
PROMPT>sqlplusscott/tiger
SQL>!
catlab1.1_target_tab.sql
--Droptableiftableexists
droptableolh_tablepurge;
--createtableolh_table(col1NUMBER,col2VARCHAR2(30),col3VARCHAR2(128),col4date);
createtableolh_table(
col1NUMBER,col2VARCHAR2(30),col3VARCHAR2(128),col4date);
SQL>@lab1.1_target_tab.sql;
步骤2:
在Hadoop中放入示例文件
因为OLH需要从Hadoop文件系统中读取数据,所以我们先要在Hadoop中放入一个的数据文件。
下面的脚本先在Hadoop中建立一个目录,然后把data.dat放入该目录中.
检查脚本文件并运行之:
PROMPT>cat./lab1.2_init_hadoop_files.sh
#Setupinputdirectory
hadoopfs-rmrolh_lab_in
hadoopfs-mkdirolh_lab_in
hadoopfs-putolh_lab.datolh_lab_in/data.dat
PROMPT>./lab1.2_init_hadoop_files.sh
步骤3:
运行OracleHadoop装载程序
我们现在就可以开始装载程序了.
检查脚本文件:
PROMPT>cat./lab1.3_run_loader.sh
hadoopfs-rmrolh_lab_out
hadoopjar$OLH_JARoracle.hadoop.loader.OraLoader-confMyConf.xml
在装载程序中,需要建立一个在Hadoop中新建一个目录,用来存放”_SUCCESS”和”_logs”文件;在使用离线装载选项时,还有可能需要存放一些离线装载的文件。
所以,我们先要确保没有该目录,以免创建失败。
装载程序需要读取一些配置信息,在这个例子中,我们使用配置文件:
MyConf.xml.仔细检查MyConf.xml.文件里包含里一些运行OLH所需的主要参数,如下表所示:
表:
OLH的主要参数
mapreduce.inputformat.class
指定输入文件的格式。
除了文本文件,还支持hive格式文件。
也可以是自定义的文件格式。
mapred.input.dir
Hadoop里输入的数据文件(含路径)
mapreduce.outputformat.class
指定装载的输出方式
在线装载:
OCIOutputFormat(*),JDBCOutputFormat
离线装载:
DataPumptOutputFormat,DelimitedTextOutputFormat
mapred.output.dir
输出目录(同时也是LOG所在目录)
oracle.hadoop.loader.loaderMapFile
文件与表的对应关系,包括表名,栏位对应等
oracle.hadoop.loader.connection.url/user/pass
目标数据库的连接信息,包括url,用户名,密码
(注:
OCIOutputFormat只支持64位的Linux)
对于实验1,最关键参数是mapreduce.outputformat.class,确保它的值是JDBCOutputFormat.
运行脚本文件.
PROMPT>./lab1.3_run_loader.sh
除了使用-conf=配置文件,我们也可以用“-D参数=值”的方式来传递参数,而且,-D方式会覆盖-conf设定的值.
比如:
hadoopjar${OLH_JAR}oracle.hadoop.loader.OraLoader-Dmapred.input.dirolh_lab_in-Dmapreduce.inputformat.classoracle.hadoop.loader.lib.input.DelimitedTextInputFormat
….
步骤4:
验证结果
登录到数据库,检查数据是否已经成功进入到数据库
PROMPT>sqlplusscott/tiger
SQL>selectcount(*)fromolh_table;
10000
返回10000,表示我们已经成功装载了10000行记录到数据库里面了.
实验2:
装载Hadoop文件到DataPump格式文件
我们也可以不直接把数据装载到数据库,而是装载成为datapump格式文件.再根据需要使用该文件。
步骤1:
创建目标表
首先,我们在数据库中新建一个表,我们的datapump的格式定义根据这个表产生.
检查脚本文件并运行之:
PROMPT>cd/home/hadoop/training/OLH
PROMPT>sqlplusscott/tiger
SQL>!
catlab2.1_target_tab.sql
--Droptableiftableexists
droptableolh_tablepurge;
--createtableolh_table(col1NUMBER,col2VARCHAR2(30),col3VARCHAR2(128),col4date);
createtableolh_table(
col1NUMBER,col2VARCHAR2(30),col3VARCHAR2(128),col4date);
SQL>@lab2.1_target_tab.sql;
步骤2:
在Hadoop中放入示例文件
和实验1一样,在HDFS中创建新的数据文件.
检查脚本文件并运行之:
PROMPT>cat./lab2.2_init_hadoop_files.sh
#Setupinputdirectory
hadoopfs-rmrolh_lab_in
hadoopfs-mkdirolh_lab_in
hadoopfs-putolh_lab.datolh_lab_in/data.dat
PROMPT>./lab2.2_init_hadoop_files.sh
步骤3:
运行OracleHadoop装载程序
开始运行装载程序之前,需要编辑文件MyConf.xml。
把参数mapreduce.outputformat.class的值修改成oracle.hadoop.loader.lib.output.DataPumpOutputFormat。
当然,也可以直接在命令行中指定该参数.
(vi简单操作提示:
按i或者a进入编辑模式,按esc退出编辑模式,输入:
wq保存并退出,输入:
q!
退出但不保存)
PROMPT>viMyConf.xml
…
mapreduce.outputformat.class
oracle.hadoop.loader.lib.output.DataPumpOutputFormat
检查脚本文件并运行之:
PROMPT>cat./lab2.3_run_loader.sh
hadoopfs-rmrolh_lab_out
hadoopjar$OLH_JARoracle.hadoop.loader.OraLoader-confMyConf.xml\
-Dmapreduce.outputformat.class=oracle.hadoop.loader.lib.output.DataPumpOutputFormat
PROMPT>./lab2.3_run_loader.sh
…
步骤4:
把生成的文件取回到本地
通过离线装载选项,OLH已经生成了一个Oracle可以直接访问的文件.我们需要把这个文件先拷贝到本地文件系统.由于在后面的操作中,Oracle需要使用文件所在目录,所以我们直接拷贝整个out目录,并授予oracle用户读写权限。
检查脚本文件并运行之:
PROMPT>catlab2.4_get_datapump_files.sh
rm-rfdatapumpfiles
hadoopfs-getolh_lab_outdatapumpfiles
chmod777datapumpfiles
PROMPT>./lab2.4_get_datapump_files.sh
步骤5:
将文件以外部表附加到数据库
OLH在生成离线文件同时,也生成了一个用来创建外部表的脚本<输出目录>/oraloader-dp.sql.我们可以通过编辑文件,来创建外部表.首先,把脚本中的目录改为实际目录(/home/hadoop/training/OLH/datapumpfiles),然后,去掉“CREATEORREPLACEDIRECTORY”前面的注释标记,即可运行.
CREATEORREPLACEDIRECTORYOLH_EXTTAB_DIRAS'/home/hadoop/training/OLH/datapumpfiles';
step5_load_dpfile_as_ext_tab.sql是已经修改好的文件。
检查脚本文件并运行之:
PROMPT>sqlplusscott/tiger
SQL>!
catstep5_load_dpfile_as_ext_tab.sql
--OracleLoaderforHadoopRelease1.1.0.0.1-Production
--
--Copyright(c)2011,Oracleand/oritsaffiliates.Allrightsreserved.
--
--GeneratedbyDataPumpOutputFormat
--
CREATEORREPLACEDIRECTORYOLH_EXTTAB_DIRAS
'/home/hadoop/training/OLH/datapumpfiles';
--GRANTREAD,WRITEONDIRECTORYOLH_EXTTAB_DIRTOSCOTT;
--
--ALTERSESSIONENABLEPARALLELDML;
--INSERTINTO"SCOTT"."OLH_TABLE"SELECT*FROM"SCOTT"."EXT_OLH_TABLE";
--
droptable"SCOTT"."EXT_OLH_TABLE";
CREATETABLE"SCOTT"."EXT_OLH_TABLE"
(
"COL1"NUMBER,
"COL2"VARCHAR2(30),
"COL3"VARCHAR2(128),
"COL4"DATE
)
ORGANIZATIONEXTERNAL
(TYPEORACLE_DATAPUMP
DEFAULTDIRECTORYOLH_EXTTAB_DIR
LOCATION('oraloader-00000-dp-0.dat')
);
SQL>@lab2.5_load_dpfile_as_ext_tab.sql
步骤6:
检查结果
SQL>selectcount(*)fromEXT_OLH_TABLE;
10000
结果显示,我们已经成功的以外部表形式访问到数据。
步骤7:
导入数据
我们也可以通过insert/select语句把数据真正导入到数据库中。
检查脚本文件并运行之:
SQL>!
catlab2.7_load_to_heap_table.sql
--Droptableiftableexists
droptableolh_tablepurge;
--createtableolh_table(col1NUMBER,col2VARCHAR2(30),col3VARCHAR2(128),col4date);
createtableolh_table(
col1NUMBER,col2VARCHAR2(30),col3VARCHAR2(128),col4date
);
INSERTINTO"SCOTT"."OLH_TABLE"SELECT*FROM"SCOTT"."EXT_OLH_TABLE";
SQL>@lab2.7_load_to_heap_table.sql
步骤8:
再次检查结果
SQL>selectcount(*)fromolh_table;
10000
结果显示,数据成功导入到数据库。
实验3:
装载Hadoop文件到预分区的DataPump格式文件
OLH支持把Hadoop文件根据数据库内定义的分区条件,在Hadoop中把数据文件装载成预分区的DataPump文件,每个文件对应一个分区。
步骤1:
创建目标表
首先,我们在数据库中新建一个分区表,以第一个栏位为分区条件(value=0/1/2),我们的datapump输出文件将这个表的分区条件自动生成多个文件.
检查脚本文件并运行之:
PROMPT>cd/home/hadoop/training/OLH
PROMPT>sqlplusscott/tiger
SQL>!
catlab3.1_target_tab.sql
--Droptableiftableexists
droptableolh_parted_tablepurge;
--createtableolh_parted_table(part_keynumber,col1NUMBER,col2VARCHAR2(30),col3VARCHAR2(128),col4date)partition..;
createtableolh_parted_table(
part_keynumber,col1NUMBER,col2VARCHAR2(30),col3VARCHAR2(128),col4date
)
partitionbylist(part_key)
(
partitionp0values(0),
partitionp1values
(1),
partitionp2values
(2),
partitionpnvalues(default)
)
;
SQL>@lab3.1_target_tab.sql;
步骤2:
在Hadoop中放入示例文件
和实验1一样,在HDFS中创建新的数据文件。
为了更为直观,文件中第一栏等于0的数据会比1/2的数据稍多.我们可以通过脚本简单计算一下:
PROMPT>awk-F,'{a[$1]++}END{for(iina)print"KEY="i":
",a[i],"rows"}'olh_lab_with_part_key.dat
PART_KEY=0:
4010rows
PART_KEY=1:
2990rows
PART_KEY=2:
3000rows
检查脚本文件并运行之:
PROMPT>cat./lab3.2_init_hadoop_files.sh
#Setupinputdirectory
hadoopfs-rmrolh_lab_in
hadoopfs-mkdirolh_lab_in
hadoopfs-putolh_lab_with_part_key.datolh_lab_in/data.dat
PROMPT>./lab3.2_init_hadoop_files.sh
步骤3:
运行OracleHadoop装载程序
开始运行装载程序之前,由于表结构和文件结构有所变化,需要把oracle.hadoop.loader.loaderMapFile参数指向一个新的Mapping文件。
编辑MyConf.xml,设置oracle.hadoop.loader.loaderMapFile=file:
///home/hadoop/training/OLH/loaderMap_lab_part_tab.xml
当然,这个参数也可以直接在命令行中指定。
PROMPT>viMyConf.xml
…
mapreduce.outputformat.class
oracle.hadoop.loader.lib.output.DataPumpOutputFormat
…
oracle.hadoop.loader.loaderMapFile
file:
///home/hadoop/training/OLH/loaderMap_lab_part_tab.xml
…
同时看一下loaderMap_lab_part_tab.xml文件,了解一下新的mapping关系:
PROMPT>catloaderMap_lab_part_tab.xml
xmlversion="1.0"encoding="UTF-8"?
>
SCOTT
PART_KEY
COL1
COL2
COL3
mm:
ss">COL4
检查脚本文件并运行之:
PROMPT>cat./lab3.3_run_loader.sh
hadoopfs-rmrolh_lab_out
hadoopjar$OLH_JARoracle.hadoop.loader.OraLoader-conf