動手實驗2-ODCH(11)

動手實驗: Oracle HDFS直接鏈接器sql

動手實驗: Oracle HDFS直接鏈接器... 1數據庫

實驗環境... 2bash

實驗 1: 直接訪問單個 HDFS 文件... 3oracle

步驟1: 配置操做系統的目錄和數據庫的Directory對象... 3app

步驟2: 建立外部表... 3dom

步驟3: 在Hadoop中放入示例文件... 3oop

步驟4: 生成「位置文件」... 3編碼

步驟5: 檢查結果... 3url

步驟6: 改動HDFS文件,檢查結果. 錯誤!未定義書籤。spa

實驗2: 直接訪問多個HDFS文件... 3

步驟1: 配置目錄/Directory對象,和實驗1同樣. 3

步驟2: 建立外部表,包含多個位置文件... 3

步驟3: 在HDFS生成一組文件. 3

步驟4: 建立指向一組文件的位置文件... 3

步驟5: 檢查結果... 3

步驟6: 刪除部分文件,從數據庫中檢查結果: 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: 檢查結果

PROMPT> sqlplus scott/tiger

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

數據已經更新。

相關文章
相關標籤/搜索