实验 : 直接访问单个 HDFS 文件
步骤1: 配置操作系统的目录和数据库的Directory对象
步骤2: 创建外部表
步骤3: 在Hadoop中放入示例文件
步骤4: 生成“位置文件”
步骤5: 检查结果
步骤6: 改动HDFS文件,检查结果.
配置hdfs_stream script文件。在使用直接连接器前,需要配置hdfs_stream 脚本. hdfs_stream 是 包含在ODCH的安装包中(ODCH_HOME/bin). 我们需要在脚本中指定HADOOP_HOME和DIRECTHDFS_HOME.
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
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
检查脚本文件并运行:
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
创建外部表,里面有个ODCH的关键参数–“preprocessor HDFS_BIN_PATH:hdfs_stream”。
另外,下面SQL脚本中的LOCATION对应的文件不用预先存在,会在步骤4中生成。
在LOCATION中使用多个文件,可以使Oracle可以多个程序并行访问HDFS。
PROMPT> sqlplus scott/tiger
检查脚本文件并运行:
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
ODCH从Hadoop文件系统中读取数据. 所以我们先要在Hadoop中放入几个的数据文件. 下面的脚本先在Hadoop中建立一个目录,然后把odch*.dat放入该目录中.
检查脚本文件并运行:
${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
要让Oracle Hadoop直接连接器知道需要访问的HDFS上的文件路径。下面运行的程序将会生成包含HDFS上文件路径的“位置文件”。
检查脚本文件并运行:
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’.
检查位置文件内容.
CompressionCodec=
hdfs://bigdata01:9000/user/hadoop/odch_data/odch.dat
这里 CompressionCodec 是默认值, HDFS 文件指向
PROMPT> sqlplus scott/tiger
SQL> select count(*) from odch_ext_table;
90000
91000是符合odch.*.dat的文件的总行数.
可以在sqlplus中设置 autotrace , 看看执行计划中是否有并行操作(“PX”)出现.
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方式将数据完全装载到数据库中。
删除部分文件,从数据库中检查结果:
SQL> select count(*) from odch_ext_para_table;
41000
数据已经更新。