动手实验: Oracle HDFS直接链接器... 1数据库
实验环境... 2bash
实验 1: 直接访问单个 HDFS 文件... 3oracle
步骤1: 配置操做系统的目录和数据库的Directory对象... 3app
步骤6: 改动HDFS文件,检查结果. 错误!未定义书签。spa
步骤1: 配置目录/Directory对象,和实验1同样. 3
实验环境
软件环境:
本实验主要由如下软件搭建而成: Oracle Enterprise Linux, Oracle 11g, Java SE6pdate30, Apache Hadoop, Oracle Connector for Hadoop等.
实验用到的文件:
实验用到的文件保存在 /home/hadoop/training/ODCH 底下. 包括脚本文件以及一些示例数据文件。
环境变量:
在文件olhodchenv.sh中保存实验中须要用到的环境变量. 为了简化操做,已经在实验中的$HOME/.bash_profile引用该文件,这些环境变量会自动生效。
变量名 |
变量值 |
ORACLE_HOME |
/home/oracle/app/oracle/product/11.2.0/dbhome_2 |
HADOOP_HOME |
/opt/hadoop |
DIRECTHDFS_HOME |
/opt/ODCH |
ORAHDFS_JAR |
$DIRECTHDFS_HOME /jlib/orahdfs.jar |
HDFS_BIN_PATH |
$DIRECTHDFS_HOME /bin |
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;
配置hdfs_stream script文件
实验 4: 直接访问HDFS数据文件
Oracle的HDFS直接链接器容许从数据库中直接访问HDFS的数据文件。 支持的数据文件格式取决于ORACLE_LOADER的驱动程序。
在实验1里, 咱们将会直接访问HDFS上的几个带分割符的文本文件。咱们能够在数据库中用SQL来查询该文件。
步骤1: 配置hdfs_stream script文件
在使用直接链接器前,须要配置hdfs_stream 脚本. hdfs_stream 是 包含在ODCH的安装包中(ODCH_HOME/bin). 咱们须要在脚本中指定HADOOP_HOME和DIRECTHDFS_HOME.
PROMPT> cd /home/hadoop/training/ODCH
PROMPT> vi ${DIRECTHDFS_HOME}/bin/hdfs_stream
…
export HADOOP_HOME=/opt/hadoop
…
export DIRECTHDFS_HOME=/opt/ODCH
…
另外Oracle用户须要在 {$DIRECTHDFS_LOG_DIR} 目录中建立log/bad文件. 因此要确保Oracle用户有读写权限.
PROMPT> su - oracle
PROMPT> touch /opt/ODCH/log/oracle_access_test
PROMPT> rm /opt/ODCH/log/oracle_access_test
步骤2: 配置操做系统的目录和数据库的Directory对象
在ODCH里面,须要用到3个Directory对象:
HDFS_BIN_PATH: hdfs_stream脚本所在目录.
XTAB_DATA_DIR:用来存放“位置文件”(location files)的目录。“位置文件”(location files) 是一个配置文件,里面包含HDFS的文件路径/文件名以及文件编码格式。
ODCH_LOG_DIR, Oracle用来存放外部表的log/bad等文件的目录.
对于第一个目录,已经在操做系统存在。对于第二和第三个目录,咱们将会在操做系统中新建立,而且授予oracle用户读写权限。
检查脚本文件并运行之:
PROMPT> cat lab4.2_setup_os_dir.sh
mkdir -p /home/hadoop/training/ODCH/logs
mkdir -p /home/hadoop/training/ODCH/extdir
chmod 777 /home/hadoop/training/ODCH/logs
chmod 777 /home/hadoop/training/ODCH/extdir
PROMPT> ./lab4.2_setup_os_dir.sh
链接到数据库,创建相应的3个Directory对象,以及相关受权。
PROMPT> sqlplus 'sys/oracle as sysdba'
检查脚本文件并运行之:
SQL> !cat lab4.2_setup_DB_dir.sql
SET ECHO ON
create or replace directory ODCH_LOG_DIR as '/home/hadoop/training/ODCH/logs';
grant read, write on directory ODCH_LOG_DIR to SCOTT;
create or replace directory ODCH_DATA_DIR as '/home/hadoop/training/ODCH/extdir';
grant read, write on directory ODCH_DATA_DIR to SCOTT;
create or replace directory HDFS_BIN_PATH as '/opt/ODCH/bin';
grant execute on directory HDFS_BIN_PATH to SCOTT;
SQL> @lab4.2_setup_DB_dir.sql
步骤3: 建立外部表
咱们将会建立外部表,里面有个ODCH的关键参数--“preprocessor HDFS_BIN_PATH:hdfs_stream”。
另外,下面SQL脚本中的LOCATION对应的文件不用预先存在,咱们会在步骤4中生成。
在LOCATION中使用多个文件,可使Oracle能够多个程序并行访问HDFS。
PROMPT> sqlplus scott/tiger
检查脚本文件并运行之:
SQL> !cat lab4.3_ext_tab.sql
drop table odch_ext_table;
CREATE TABLE odch_ext_table
( ID NUMBER
,OWNER VARCHAR2(128)
,NAME VARCHAR2(128)
,MODIFIED DATE
,Val NUMBER
) ORGANIZATION EXTERNAL
(TYPE oracle_loader
DEFAULT DIRECTORY "ODCH_DATA_DIR"
ACCESS PARAMETERS
(
records delimited by newline
preprocessor HDFS_BIN_PATH:hdfs_stream
badfile ODCH_LOG_DIR:'odch_ext_table%a_%p.bad'
logfile ODCH_LOG_DIR:'odch_ext_table%a_%p.log'
fields terminated by ','
missing field values are null
(
ID DECIMAL EXTERNAL,
OWNER CHAR(200),
NAME CHAR(200),
MODIFIED CHAR DATE_FORMAT DATE MASK "YYYY-MM-DD HH24:MI:SS",
Val DECIMAL EXTERNAL
)
)
LOCATION (
'odch_ext_table1.loc',
'odch_ext_table2.loc',
'odch_ext_table3.loc',
'odch_ext_table4.loc'
)
) PARALLEL REJECT LIMIT UNLIMITED;;
SQL> @lab4.3_ext_tab.sql
步骤4: 在Hadoop中放入示例文件
ODCH从Hadoop文件系统中读取数据. 因此咱们先要在Hadoop中放入几个的数据文件. 下面的脚本先在Hadoop中创建一个目录,而后把odch*.dat放入该目录中.
检查脚本文件并运行之:
PROMPT> cat lab4.4_hdfs_setup.sh
${HADOOP_HOME}/bin/hadoop fs -rmr odch_data
${HADOOP_HOME}/bin/hadoop fs -mkdir odch_data
${HADOOP_HOME}/bin/hadoop fs -put odch*.dat odch_data
echo "rows in file:"
wc -l odch*.dat
PROMPT> ./lab4.4_hdfs_setup.sh
步骤5: 生成“位置文件”
咱们须要让Oracle Hadoop直接链接器知道须要访问的HDFS上的文件路径。下面运行的程序将会生成包含HDFS上文件路径的“位置文件”。
检查脚本文件并运行之
PROMPT>cat lab4.5_create_loc_file.sh
hadoop jar \
${ORAHDFS_JAR} oracle.hadoop.hdfs.exttab.ExternalTable \
-D oracle.hadoop.hdfs.exttab.tableName=odch_ext_table \
-D oracle.hadoop.hdfs.exttab.datasetPaths=odch_data \
-D oracle.hadoop.hdfs.exttab.datasetRegex=odch*.dat \
-D oracle.hadoop.hdfs.exttab.connection.url="jdbc:oracle:thin:@//172.16.22.131:1521/orcl" \
-D oracle.hadoop.hdfs.exttab.connection.user=SCOTT \
-publish
PROMPT> ./lab4.5_create_loc_file.sh
须要输入数据库用户的密码,本实验中是 ‘tiger’.
检查位置文件内容.
PROMPT> cat /home/hadoop/training/ODCH/extdir/odch_ext_table*.loc
CompressionCodec=
hdfs://bigdata01:9000/user/hadoop/odch_data/odch.dat
这里 CompressionCodec 是默认值, HDFS 文件指向 hdfs://bigdata01:9000/user/hadoop/odch_data/odch.dat
步骤7: 检查结果
SQL> select count(*) from odch_ext_table;
90000
91000是符合odch.*.dat的文件的总行数.
咱们能够在sqlplus中设置 autotrace , 看看执行计划中是否有并行操做(“PX”)出现.
SQL> set autotrace trace exp
SQL> select count(*) from odch_ext_para_table;
Execution Plan
----------------------------------------------------------
Plan hash value: 2012719727
----------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
| 0 | SELECT STATEMENT | | 1 | 16(0)| 00:00:01 | | | |
| 1 | SORT AGGREGATE | | 1 | | | | | |
| 2 | PX COORDINATOR | | | | | | | |
| 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | | | Q1,00 | P->S | QC (RAND) |
| 4 | SORT AGGREGATE | | 1 | | | Q1,00 | PCWP | |
| 5 | PX BLOCK ITERATOR | | 8168 | 16 (0)| 00:00:01 | Q1,00 | PCWC | |
| 6 | EXTERNAL TABLE ACCESS FULL| ODCH_EXT_PARA_TABLE | 8168 | 16 (0)| 00:00:01 | Q1,00 | PCWP | |
固然,咱们也能够进行其余的SQL语句,好比join, where,group之类的。咱们也能够经过Create Table As Select方式将数据彻底装载到数据库中。
步骤7: 删除部分文件,从数据库中检查结果:
PROMPT> hadoop fs -rm odch_data/odch1.dat
SQL> select count(*) from odch_ext_para_table;
41000
数据已经更新。
实验2: 直接访问多个HDFS文件
和实验1不同,咱们也可使用多个HDFS文件做为Oracle外部表的输入。并且,在存在多个HDFS的状况下,咱们能够经过指定多个位置文件,从而容许Oracle并行的访问HDFS文件.
步骤1: 配置目录/Directory对象,和实验1同样.
运行脚本文件:
PROMPT> ./lab2.1_setup_os_dir.sh
PROMPT> sqlplus sys/oracle as sysdba
SQL> @lab2.1_setup_DB_dir.sql
步骤2: 建立外部表,包含多个位置文件
多个位置文件容许Oracle并行的访问多个HDFS文件.
检查脚本文件并运行之:
PROMPT> sqlplus scott/tiger
SQL> !cat lab2.2_ext_para_tab.sql
drop table odch_ext_para_table;
CREATE TABLE odch_ext_para_table
( ID NUMBER
,OWNER VARCHAR2(128)
,NAME VARCHAR2(128)
,MODIFIED DATE
,Val NUMBER
) ORGANIZATION EXTERNAL
(TYPE oracle_loader
DEFAULT DIRECTORY "ODCH_DATA_DIR"
ACCESS PARAMETERS
(
records delimited by newline
preprocessor HDFS_BIN_PATH:hdfs_stream
badfile ODCH_LOG_DIR:'odch_ext_para_table%a_%p.bad'
logfile ODCH_LOG_DIR:'odch_ext_para_table%a_%p.log'
fields terminated by ','
missing field values are null
(
ID DECIMAL EXTERNAL,
OWNER CHAR(200),
NAME CHAR(200),
MODIFIED CHAR DATE_FORMAT DATE MASK "YYYY-MM-DD HH24:MI:SS",
Val DECIMAL EXTERNAL
)
)
LOCATION (
'dch_ext_table_1.loc',
'dch_ext_table_2.loc',
'dch_ext_table_3.loc',
'dch_ext_table_4.loc'
)
) PARALLEL REJECT LIMIT UNLIMITED;
SQL>@lab2.2_ext_para_tab.sql
步骤3: 在HDFS生成一组文件.
咱们将在HDFS中生成一组文件,文件名应该有一些共性,以便使用表达式.
PROMPT> cat lab2.3_hdfs_setup_grp.sh
${HADOOP_HOME}/bin/hadoop fs -rmr odch_data
${HADOOP_HOME}/bin/hadoop fs -mkdir odch_data
${HADOOP_HOME}/bin/hadoop fs -put odch*.dat odch_data/
echo "rows in file:"
wc -l odch*.dat
PROMPT> ./lab2.3_hdfs_setup_grp.sh
步骤4: 建立指向一组文件的位置文件
检查脚本文件并运行之:
PROMPT> cat ./lab2.4_create_mul_loc_files.sh
hadoop jar ${ORAHDFS_JAR} oracle.hadoop.hdfs.exttab.ExternalTable \
-D oracle.hadoop.hdfs.exttab.tableName=odch_ext_para_table \
-D oracle.hadoop.hdfs.exttab.datasetPaths=odch_data \
-D oracle.hadoop.hdfs.exttab.datasetRegex=odch.*.dat \
-D oracle.hadoop.hdfs.exttab.connection.url="jdbc:oracle:thin:@//localhost.localdomain:1521/orcl" \
-D oracle.hadoop.hdfs.exttab.connection.user=SCOTT \
-publish
PROMPT> ./lab2.4_create_mul_loc_files.sh
步骤5: 检查结果
PROMPT> sqlplus scott/tiger
SQL> select count(*) from odch_ext_para_table;
91000
91000是符合odch.*.dat的文件的总行数.
咱们能够在sqlplus中设置 autotrace , 看看执行计划中是否有并行操做(“PX”)出现.
SQL> set autotrace trace exp
SQL> select count(*) from odch_ext_para_table;
COUNT(*)
----------
91000
Execution Plan
----------------------------------------------------------
Plan hash value: 2012719727
----------------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time | TQ |IN-OUT| PQ Distrib |
| 0 | SELECT STATEMENT | | 1 | 16(0)| 00:00:01 | | | |
| 1 | SORT AGGREGATE | | 1 | | | | | |
| 2 | PX COORDINATOR | | | | | | | |
| 3 | PX SEND QC (RANDOM) | :TQ10000 | 1 | | | Q1,00 | P->S | QC (RAND) |
| 4 | SORT AGGREGATE | | 1 | | | Q1,00 | PCWP | |
| 5 | PX BLOCK ITERATOR | | 8168 | 16 (0)| 00:00:01 | Q1,00 | PCWC | |
| 6 | EXTERNAL TABLE ACCESS FULL| ODCH_EXT_PARA_TABLE | 8168 | 16 (0)| 00:00:01 | Q1,00 | PCWP | |
步骤6: 删除部分文件,从数据库中检查结果:
PROMPT> hadoop fs -rm odch_data/odch1.dat
SQL> select count(*) from odch_ext_para_table;
41000
数据已经更新。