动手实验: Oracle Hadoop装载程序sql
实验环境... 2bash
实验1: 装载Hadoop文件到数据库... 3oracle
步骤3: 运行Oracle Hadoop装载程序... 3测试
实验2: 装载Hadoo文件到DataPump格式文件... 3spa
步骤1: 建立目标表... 3操作系统
实验3: 装载Hadoo文件到预分区的DataPump格式文件... 3
步骤3: 运行Oracle Hadoop装载程序,使用文件名通配符... 3
步骤5: 运行Oracle Hadoop装载程序,使用文件名列表... 3
软件环境:
本实验主要由如下软件搭建而成: Oracle Enterprise Linux, Oracle 11g, Java SE6update30, Apache Hadoop, Oracle Connector for Hadoop等.
实验用到的文件:
实验用到的文件保存在 /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 |
Hadoop default FS |
hdfs://bigdata01:9000 |
Hadoop Job Tracker URL |
hdfs://bigdata01:9001 |
实验用操做系统用户密码 |
hadoop/oracle |
实验用数据库用户密码 |
Scott/tiger |
操做系统oracle用户密码 |
oracle/oracle |
数据库超级用户 |
sys/oracle |
操做系统超级用户 |
root/oracle |
文档中‘PROMPT>’指的是操做系统SHELL的输入界面
‘SQL ->’指的是Oracle SQL*Plus的输入界面
用hadoop/oracle登陆172.16.22.131.
检查环境变量是否正确设置.
PROMPT> env
应该能看到上面提到的环境变量.
检查hadoop是否正常.
PROMPT> hadoop dfsadmin -report
检查数据库是否正常
PROMPT> sqlplus scott/tiger
SQL> select * from tab;
实验1: 装载Hadoop文件到数据库
在实验1里, 咱们将会把一个Hadoop文件系统上的文件装载到数据库中(使用JDBC 链接)。 这是OLH的最基本功能。
步骤1: 建立目标表
首先, 咱们在数据库中新建一个表,咱们的数据将会装载到这个表里.
检查脚本文件并运行之:
PROMPT> cd /home/hadoop/training/OLH
PROMPT> sqlplus scott/tiger
SQL> !cat lab1.1_target_tab.sql
-- Drop table if table exists
drop table olh_table purge;
-- create table olh_table (col1 NUMBER, col2 VARCHAR2(30), col3 VARCHAR2(128), col4 date);
create table olh_table(
col1 NUMBER, col2 VARCHAR2(30), col3 VARCHAR2(128), col4 date );
SQL> @lab1.1_target_tab.sql;
步骤2: 在Hadoop中放入示例文件
由于OLH须要从Hadoop文件系统中读取数据,因此咱们先要在Hadoop中放入一个的数据文件。 下面的脚本先在Hadoop中创建一个目录,而后把data.dat放入该目录中.
PROMPT> cat ./lab1.2_init_hadoop_files.sh
#Set up input directory
hadoop fs -rmr olh_lab_in
hadoop fs -mkdir olh_lab_in
hadoop fs -put olh_lab.dat olh_lab_in/data.dat
PROMPT> ./lab1.2_init_hadoop_files.sh
步骤3: 运行Oracle Hadoop装载程序
咱们如今就能够开始装载程序了.
检查脚本文件:
PROMPT> cat ./lab1.3_run_loader.sh
hadoop fs -rmr olh_lab_out
hadoop jar $OLH_JAR oracle.hadoop.loader.OraLoader -conf MyConf.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设定的值.
好比:
hadoop jar ${OLH_JAR} oracle.hadoop.loader.OraLoader -D mapred.input.dir olh_lab_in -D mapreduce.inputformat.class oracle.hadoop.loader.lib.input.DelimitedTextInputFormat
….
步骤4: 验证结果
登陆到数据库,检查数据是否已经成功进入到数据库
PROMPT> sqlplus scott/tiger
SQL> select count(*) from olh_table;
10000
返回10000,表示咱们已经成功装载了10000行记录到数据库里面了.
实验2: 装载Hadoop文件到DataPump格式文件
咱们也能够不直接把数据装载到数据库,而是装载成为datapump格式文件. 再根据须要使用该文件。
步骤1: 建立目标表
首先, 咱们在数据库中新建一个表,咱们的datapump的格式定义根据这个表产生.
检查脚本文件并运行之:
PROMPT> cd /home/hadoop/training/OLH
PROMPT> sqlplus scott/tiger
SQL> !cat lab2.1_target_tab.sql
-- Drop table if table exists
drop table olh_table purge;
-- create table olh_table (col1 NUMBER, col2 VARCHAR2(30), col3 VARCHAR2(128), col4 date);
create table olh_table(
col1 NUMBER, col2 VARCHAR2(30), col3 VARCHAR2(128), col4 date );
SQL> @lab2.1_target_tab.sql;
步骤2: 在Hadoop中放入示例文件
和实验1同样,在HDFS中建立新的数据文件.
检查脚本文件并运行之:
PROMPT> cat ./lab2.2_init_hadoop_files.sh
#Set up input directory
hadoop fs -rmr olh_lab_in
hadoop fs -mkdir olh_lab_in
hadoop fs -put olh_lab.dat olh_lab_in/data.dat
PROMPT> ./lab2.2_init_hadoop_files.sh
步骤3: 运行Oracle Hadoop装载程序
开始运行装载程序以前,须要编辑文件MyConf.xml。 把参数mapreduce.outputformat.class 的值修改为oracle.hadoop.loader.lib.output.DataPumpOutputFormat。 固然,也能够直接在命令行中指定该参数.
(vi简单操做提示:按i或者a进入编辑模式,按esc退出编辑模式,输入:wq保存并退出,输入 :q! 退出但不保存)
PROMPT> vi MyConf.xml
…
<property>
<name>mapreduce.outputformat.class</name>
<value>oracle.hadoop.loader.lib.output.DataPumpOutputFormat </value>
</property>
检查脚本文件并运行之:
PROMPT> cat ./lab2.3_run_loader.sh
hadoop fs -rmr olh_lab_out
hadoop jar $OLH_JAR oracle.hadoop.loader.OraLoader -conf MyConf.xml \
-Dmapreduce.outputformat.class=oracle.hadoop.loader.lib.output.DataPumpOutputFormat
PROMPT>./lab2.3_run_loader.sh
…
步骤4: 把生成的文件取回到本地
经过离线装载选项,OLH已经生成了一个Oracle能够直接访问的文件. 咱们须要把这个文件先拷贝到本地文件系统. 因为在后面的操做中,Oracle须要使用文件所在目录,因此咱们直接拷贝整个out目录,并授予oracle用户读写权限。
检查脚本文件并运行之:
PROMPT> cat lab2.4_get_datapump_files.sh
rm -rf datapumpfiles
hadoop fs -get olh_lab_out datapumpfiles
chmod 777 datapumpfiles
PROMPT> ./lab2.4_get_datapump_files.sh
步骤5: 将文件之外部表附加到数据库
OLH在生成离线文件同时,也生成了一个用来建立外部表的脚本<输出目录>/oraloader-dp.sql. 咱们能够经过编辑文件,来建立外部表. 首先,把脚本中的目录改成实际目录(/home/hadoop/training/OLH/datapumpfiles),而后,去掉 “CREATE OR REPLACE DIRECTORY”前面的注释标记,便可运行.
CREATE OR REPLACE DIRECTORY OLH_EXTTAB_DIR AS '/home/hadoop/training/OLH/datapumpfiles ';
step5_load_dpfile_as_ext_tab.sql是已经修改好的文件。
检查脚本文件并运行之:
PROMPT> sqlplus scott/tiger
SQL> !cat step5_load_dpfile_as_ext_tab.sql
--Oracle Loader for Hadoop Release 1.1.0.0.1 - Production
--
--Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
--
--Generated by DataPumpOutputFormat
--
CREATE OR REPLACE DIRECTORY OLH_EXTTAB_DIR AS
'/home/hadoop/training/OLH/datapumpfiles';
--GRANT READ, WRITE ON DIRECTORY OLH_EXTTAB_DIR TO SCOTT;
--
--ALTER SESSION ENABLE PARALLEL DML;
--INSERT INTO "SCOTT"."OLH_TABLE" SELECT * FROM "SCOTT"."EXT_OLH_TABLE";
--
drop table "SCOTT"."EXT_OLH_TABLE";
CREATE TABLE "SCOTT"."EXT_OLH_TABLE "
(
"COL1" NUMBER,
"COL2" VARCHAR2(30),
"COL3" VARCHAR2(128),
"COL4" DATE
)
ORGANIZATION EXTERNAL
(TYPE ORACLE_DATAPUMP
DEFAULT DIRECTORY OLH_EXTTAB_DIR
LOCATION ('oraloader-00000-dp-0.dat')
);
SQL> @lab2.5_load_dpfile_as_ext_tab.sql
步骤6: 检查结果
SQL> select count(*) from EXT_OLH_TABLE;
10000
步骤7: 导入数据
咱们也能够经过insert/select语句把数据真正导入到数据库中。
检查脚本文件并运行之:
SQL> !cat lab2.7_load_to_heap_table.sql
-- Drop table if table exists
drop table olh_table purge;
-- create table olh_table (col1 NUMBER, col2 VARCHAR2(30), col3 VARCHAR2(128), col4 date);
create table olh_table(
col1 NUMBER, col2 VARCHAR2(30), col3 VARCHAR2(128), col4 date
);
INSERT INTO "SCOTT"."OLH_TABLE" SELECT * FROM "SCOTT"."EXT_OLH_TABLE";
SQL>@lab2.7_load_to_heap_table.sql
步骤8: 再次检查结果
SQL> select count(*) from olh_table;
10000
结果显示,数据成功导入到数据库。
实验3: 装载Hadoop文件到预分区的DataPump格式文件
OLH支持把Hadoop文件根据数据库内定义的分区条件,在Hadoop中把数据文件装载成预分区的DataPump文件,每一个文件对应一个分区。
步骤1: 建立目标表
首先, 咱们在数据库中新建一个分区表,以第一个栏位为分区条件(value=0/1/2),咱们的datapump输出文件将这个表的分区条件自动生成多个文件.
检查脚本文件并运行之:
PROMPT> cd /home/hadoop/training/OLH
PROMPT> sqlplus scott/tiger
SQL> !cat lab3.1_target_tab.sql
-- Drop table if table exists
drop table olh_parted_table purge;
-- create table olh_parted_table (part_key number,col1 NUMBER, col2 VARCHAR2(30), col3 VARCHAR2(128), col4 date) partition ..;
create table olh_parted_table(
part_key number,col1 NUMBER, col2 VARCHAR2(30), col3 VARCHAR2(128), col4 date
)
partition by list(part_key)
(
partition p0 values(0),
partition p1 values(1),
partition p2 values(2),
partition pn values(default)
)
;
SQL> @lab3.1_target_tab.sql;
步骤2: 在Hadoop中放入示例文件
和实验1同样,在HDFS中建立新的数据文件。为了更为直观,文件中第一栏等于0的数据会比1/2的数据稍多. 咱们能够经过脚本简单计算一下:
PROMPT>awk -F, '{a[$1]++}END{for (i in a)print "KEY="i":",a[i],"rows"}' olh_lab_with_part_key.dat
PART_KEY=0: 4010 rows
PART_KEY=1: 2990 rows
PART_KEY=2: 3000 rows
检查脚本文件并运行之:
PROMPT> cat ./lab3.2_init_hadoop_files.sh
#Set up input directory
hadoop fs -rmr olh_lab_in
hadoop fs -mkdir olh_lab_in
hadoop fs -put olh_lab_with_part_key.dat olh_lab_in/data.dat
PROMPT> ./lab3.2_init_hadoop_files.sh
步骤3: 运行Oracle Hadoop装载程序
开始运行装载程序以前,因为表结构和文件结构有所变化,须要把oracle.hadoop.loader.loaderMapFile参数指向一个新的Mapping文件。编辑MyConf.xml,设置oracle.hadoop.loader.loaderMapFile=file:///home/hadoop/training/OLH/loaderMap_lab_part_tab.xml
固然,这个参数也能够直接在命令行中指定。
PROMPT> vi MyConf.xml
…
<property>
<name>mapreduce.outputformat.class</name>
<value>oracle.hadoop.loader.lib.output.DataPumpOutputFormat </value>
</property>
…
<property>
<name>oracle.hadoop.loader.loaderMapFile</name>
<value>file:///home/hadoop/training/OLH/loaderMap_lab_part_tab.xml</value>
</property>
…
同时看一下loaderMap_lab_part_tab.xml文件,了解一下新的mapping关系:
PROMPT> cat loaderMap_lab_part_tab.xml
<?xml version="1.0" encoding="UTF-8" ?>
<LOADER_MAP>
<SCHEMA>SCOTT</SCHEMA>
<TABLE>OLH_PARTED_TABLE</TABLE>
<COLUMN field="F0">PART_KEY</COLUMN>
<COLUMN field="F1">COL1</COLUMN>
<COLUMN field="F2">COL2</COLUMN>
<COLUMN field="F3">COL3</COLUMN>
<COLUMN field="F4" format="yyyy-MM-dd HH:mm:ss">COL4</COLUMN>
</LOADER_MAP>
检查脚本文件并运行之:
PROMPT> cat ./lab3.3_run_loader.sh
hadoop fs -rmr olh_lab_out
hadoop jar $OLH_JAR oracle.hadoop.loader.OraLoader -conf MyConf.xml \
-Dmapreduce.outputformat.class=oracle.hadoop.loader.lib.output.DataPumpOutputFormat \
-Doracle.hadoop.loader.loaderMapFile=file:///home/hadoop/training/OLH/loaderMap_lab_part_tab.xml
PROMPT>./lab3.3_run_loader.sh
步骤4: 把生成的文件取回到本地
如今把生成的文件取回到本地.
检查脚本文件并运行之:
PROMPT> cat lab3.4_get_datapump_files.sh
rm -rf datapumpfiles
hadoop fs -get olh_lab_out parted_datapumpfiles
chmod 777 parted_datapumpfiles
PROMPT> ./lab3.4_get_datapump_files.sh
检查一下文件大小.
PROMPT> cd parted_datapumpfiles; ls -l *.dat
文件 oraloader-00000-dp-1.dat 比另外两个要大,由于第一个分区有更多的记录.
步骤5: 将部分文件之外部表附加到数据库
修改OLH提供的oraloader-dp.sql的文件。首先,把脚本中的目录改成实际目录(/home/hadoop/training/OLH/parted_datapumpfiles),而后,去掉 “CREATE OR REPLACE DIRECTORY”前面的注释标记。.
CREATE OR REPLACE DIRECTORY OLH_EXTTAB_DIR AS '/home/hadoop/training/OLH/parted_datapumpfiles ';
另外,咱们能够只把一部分的文件映射到数据库中,只要在建立外部表脚本中去掉不想要的分区文件。这里,咱们只选择第一个分区.
检查脚本文件并运行之:
PROMPT> sqlplus scott/tiger
SQL> !cat lab3.5_load_dpfile_as_ext_tab.sql
--Oracle Loader for Hadoop Release 1.1.0.0.1 - Production
--
--Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
--
--Generated by DataPumpOutputFormat
--
CREATE OR REPLACE DIRECTORY OLH_EXTTAB_DIR AS '/home/hadoop/training/OLH/parted_datapumpfiles';
--GRANT READ, WRITE ON DIRECTORY OLH_EXTTAB_DIR TO SCOTT;
--
--ALTER SESSION ENABLE PARALLEL DML;
--INSERT INTO "SCOTT"."OLH_PARTED_TABLE" SELECT * FROM "SCOTT"."EXT_OLH_PARTED_TABLE";
--
CREATE TABLE "SCOTT"."EXT_OLH_PARTED_TABLE"
(
"PART_KEY" NUMBER,
"COL1" NUMBER,
"COL2" VARCHAR2(30),
"COL3" VARCHAR2(128),
"COL4" DATE
)
ORGANIZATION EXTERNAL
(TYPE ORACLE_DATAPUMP
DEFAULT DIRECTORY OLH_EXTTAB_DIR
LOCATION
( 'oraloader-00000-dp-1.dat' )
);
SQL> @lab3.5_load_dpfile_as_ext_tab.sql
步骤6: 检查结果
SQL> select count(*) from EXT_OLH_PARTED_TABLE;
4010
只有part_key=0的附加到数据库中.
步骤7: 把其余分区附加到数据库
继续修改OLH提供的oraloader-dp.sql的文件, 咱们也能够其余的数据附加到数据库.
检查脚本文件并运行之:
SQL> !cat lab3.7_load_rest_dpfile_as_ext_tab.sql
DROP TABLE "SCOTT"."EXT_OLH_REST_PARTED_TABLE";
CREATE TABLE "SCOTT"."EXT_OLH_REST_PARTED_TABLE"
(
"PART_KEY" NUMBER,
"COL1" NUMBER,
"COL2" VARCHAR2(30),
"COL3" VARCHAR2(128),
"COL4" DATE
)
ORGANIZATION EXTERNAL
(TYPE ORACLE_DATAPUMP
DEFAULT DIRECTORY OLH_EXTTAB_DIR
LOCATION
(
'oraloader-00000-dp-2.dat',
'oraloader-00000-dp-3.dat'
)
);
SQL>@ lab3.7_load_rest_dpfile_as_ext_tab.sql
步骤8: 再次检查结果
SQL> select count(*) from EXT_OLH_REST_PARTED_TABLE;
5990
正好是part_key=1和part_key=2的数据。
实验4: 装载多个Hadoop文件
OLH 也支持同时装载多个文件到同一个表里面。在实验4中,咱们将测试这个功能.
步骤1: 建立目标表
和实验1同样,建立目标表.
检查脚本文件并运行之:
PROMPT> cd /home/hadoop/training/OLH
PROMPT> sqlplus scott/tiger
SQL> !cat lab4.1_target_tab.sql
-- Drop table if table exists
drop table olh_table purge;
-- create table olh_table (col1 NUMBER, col2 VARCHAR2(30), col3 VARCHAR2(128), col4 date);
create table olh_table(
col1 NUMBER, col2 VARCHAR2(30), col3 VARCHAR2(128), col4 date );
SQL> @lab4.1_target_tab.sql;
步骤2: 在Hadoop中放入示例文件
往Hadoop中放入多个示例文件.
检查脚本文件并运行之:
PROMPT> cat ./lab4.2_init_hadoop_files.sh
#Set up input directory
hadoop fs -rmr olh_lab_in
hadoop fs -mkdir olh_lab_in
hadoop fs -put olh_lab.dat olh_lab_in/data.dat
hadoop fs -put olh_lab.dat olh_lab_in/data2.dat
hadoop fs -put olh_lab.dat olh_lab_in/data3.dat
hadoop fs -put olh_lab.dat olh_lab_in/data.txt
PROMPT> ./lab4.2_init_hadoop_files.sh
步骤3: 运行Oracle Hadoop装载程序,使用文件名通配符
运行OLH以前,编辑MyConf.xml,mapred.input.dir 参数改成带通配符的形式:olh_lab_in/*.dat. 把 mapreduce.outputformat.class 改回 oracle.hadoop.loader.lib.output.JDBCOutputFormat, 把 oracle.hadoop.loader.loaderMapFile改回files:///home/hadoop/training/OLH/loaderMap_lab.xml. 固然, 也能够直接在命令行中指定.
PROMPT> vi MyConf.xml
…
<property>
<name>mapred.input.dir</name>
<value>olh_lab_in/*.dat</value>
</property>
<property>
<name>mapreduce.outputformat.class</name>
<value>oracle.hadoop.loader.lib.output.JDBCOutputFormat</value>
</property>…
<property>
<name>oracle.hadoop.loader.loaderMapFile</name>
<value>files:///home/hadoop/training/OLH/loaderMap_lab.xml</value>
</property>…
检查脚本文件并运行之:
PROMPT> cat ./lab4.3_run_loader.sh
hadoop fs -rmr olh_lab_out
hadoop jar $OLH_JAR oracle.hadoop.loader.OraLoader -conf MyConf.xml \
-Dmapreduce.outputformat.class=oracle.hadoop.loader.lib.output.JDBCOutputFormat \
-Doracle.hadoop.loader.loaderMapFile=file:///home/hadoop/training/OLH/loaderMap_lab.xml \
-Dmapred.input.dir=olh_lab_in/*.dat
PROMPT>./lab4.3_run_loader.sh
步骤4: 检查结果
PROMPT> sqlplus scott/tiger
SQL> select count(*) from olh_table;
30000
返回30000的结果是由于 olh_lab_in/*.dat 匹配到3个输入文件.
步骤5: 运行Oracle Hadoop装载程序,使用文件名列表
运行OLH以前,编辑MyConf.xml,mapred.input.dir 参数改成件名列表的形式:
olh_lab_in/data.dat, olh_lab_in/data.txt。 固然,也能够直接在命令行中指定.
PROMPT> vi MyConf.xml
…
<property>
<name>mapred.input.dir</name>
<value>olh_lab_in/data.dat, olh_lab_in/data.txt</value>
</property>
<property>
<name>mapreduce.outputformat.class</name>
<value>oracle.hadoop.loader.lib.output.JDBCOutputFormat</value>
</property>
…
检查脚本文件并运行之:
PROMPT> cat ./lab4.5_run_loader.sh
hadoop fs -rmr olh_lab_out
hadoop jar $OLH_JAR oracle.hadoop.loader.OraLoader -conf MyConf.xml \
-Dmapreduce.outputformat.class=oracle.hadoop.loader.lib.output.JDBCOutputFormat \
-Doracle.hadoop.loader.loaderMapFile=file:///home/hadoop/training/OLH/loaderMap_lab.xml \
-Dmapred.input.dir=olh_lab_in/data.dat,olh_lab_in/data.txt
PROMPT>./lab4.5_run_loader.sh
步骤6: 再次检查结果
PROMPT> sqlplus scott/tiger
SQL> select count(*) from olh_table;
返回50000的结果是由于olh_lab_in/data.dat,olh_lab_in/data.txt匹配到2个输入文件.