X

Big Data、Data Integration、Data Lakeに関するテクノロジー、製品・サービス情報、セミナー情報などをお届けします

Big Data SQL - Kerberos

Hadoopの世界では、Kerberosがクラスタを保護するデファクトスタンダードであり、Big Data SQLもKerberosをサポートします。 オラクル社では、Big Data SQLをKerberizedクラスタにインストールする方法をドキュメントで提示しています。今日はKerberosインストールのテストとデバッグの代表的な手順を示します。

まず、テスト環境について説明します。4つのノードがあります。中には、3つがHadoopクラスタのノード(vm0 [1-3])で、1つがデータベースのノード(vm04)です。

Kerberosチケットはkeytabファイルから起動されます。KeytabはHadoopの各ノートとデータベースのノード(RACの場合、各データベースノード)に存在する必要があります。

データベースノードに有効なKerberosチケットがあることを確認します。

 

[oracle@vm04 ~]$ id
uid=500(oracle) gid=500(oinstall) groups=500(oinstall),501(dba)
[oracle@scaj0602bda09vm04 ~]$ klist 
Ticket cache: FILE:/tmp/krb5cc_500
Default principal: oracle/martybda@MARTYBDA.ORACLE.COM

Valid starting     Expires            Service principal
07/23/18 01:15:58  07/24/18 01:15:58  krbtgt/MARTYBDA.ORACLE.COM@MARTYBDA.ORACLE.COM
    renew until 07/30/18 01:15:01

 

データベースホストからHDFSにアクセスできることを確認します。

[oracle@vm04 ~]$ cd $ORACLE_HOME/bigdatasql
[oracle@vm04 bigdatasql]$ ls -l|grep hadoop*env
-rw-r--r-- 1 oracle oinstall 2249 Jul 12 15:41 hadoop_martybda.env
[oracle@vm04 bigdatasql]$ source hadoop_martybda.env 
[oracle@vm04 bigdatasql]$ hadoop fs -ls
...
Found 4 items
drwx------   - oracle hadoop          0 2018-07-13 06:00 .Trash
drwxr-xr-x   - oracle hadoop          0 2018-07-12 05:10 .sparkStaging
drwx------   - oracle hadoop          0 2018-07-12 05:17 .staging
drwxr-xr-x   - oracle hadoop          0 2018-07-12 05:14 oozie-oozi
[oracle@vm04 bigdatasql]$ 

 

確認を完了した後、 Hadoopノードでも同様に確認します。

 

[root@vm01 ~]# su - oracle
[oracle@scaj0602bda09vm01 ~]$ id
uid=1000(oracle) gid=1001(oinstall) groups=1001(oinstall),127(hive),1002(dba)
[oracle@vm01 ~]$ klist 
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: oracle/martybda@MARTYBDA.ORACLE.COM

Valid starting     Expires            Service principal
07/23/18 01:15:02  07/24/18 01:15:02  krbtgt/MARTYBDA.ORACLE.COM@MARTYBDA.ORACLE.COM
    renew until 07/30/18 01:15:02

Hadoop環境にアクセスできることを確認します。環境にアクセスして、HDFS上でテストファイルを作成します。

 

[oracle@vm01 ~]$ echo "line1" >> test.txt
[oracle@vm01 ~]$ echo "line2" >> test.txt
[oracle@vm01 ~]$ hadoop fs -mkdir /tmp/test_bds
[oracle@vm01 ~]$ hadoop fs -put test.txt /tmp/test_bds

 

データベースノードにアクセスして、HDFS上のテストファイルへの外部表を作成します。

 

[root@vm04 bin]# su - oracle
[oracle@vm04 ~]$ . oraenv <<< orcl
ORACLE_SID = [oracle] ? The Oracle base has been set to /u03/app/oracle
[oracle@vm04 ~]$ sqlplus / as sysdba

SQL*Plus: Release 12.1.0.2.0 Production on Mon Jul 23 06:39:06 2018 

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


Connected to:

Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> alter session set container=PDBORCL;

Session altered.

SQL> CREATE TABLE bds_test (line VARCHAR2(4000)) 
  ORGANIZATION EXTERNAL
 (   TYPE ORACLE_HDFS 
     DEFAULT DIRECTORY 
     DEFAULT_DIR LOCATION ('/tmp/test_bds') 
 ) 
  REJECT LIMIT UNLIMITED;   

Table created.

SQL> 

 

前の手順で作成したHDFS上の2行のテストファイルを確認できます。

 

SQL> select * from bds_test;

LINE
------------------------------------
line1
line2

Kerberosを使ったよくあるケースを紹介し、解決方法について説明します。

シナリオ1:データベース側でKerberosチケットをミスした場合


データベース側でKerberosチケットをミスしたことをシミュレートします。 これはかなり簡単で、kdestroyコマンドを使用します。

 

[oracle@vm04 ~]$ kdestroy 
[oracle@vm04 ~]$ klist 
klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_500)


extprocはKerberosチケットをキャッシュするので、変更を適用するには、extprocを再起動する必要があります。まず、extprocのプロセスの名前を確認します。

 
[oracle@vm04 admin]$ cd $ORACLE_HOME/hs/admin
[oracle@vm04 admin]$ ls -l
total 24
-rw-r--r-- 1 oracle oinstall 1170 Mar 27 01:04 extproc.ora
-rw-r----- 1 oracle oinstall 3112 Jul 12 15:56 initagt.dat
-rw-r--r-- 1 oracle oinstall  190 Jul 12 15:41 initbds_orcl_martybda.ora
-rw-r--r-- 1 oracle oinstall  489 Mar 27 01:04 initdg4odbc.ora
-rw-r--r-- 1 oracle oinstall  406 Jul 12 15:11 listener.ora.sample
-rw-r--r-- 1 oracle oinstall  244 Jul 12 15:11 tnsnames.ora.sample

 

名前は、データベースSIDとHadoopクラスタ名で構成されるので、extproc名はbds_orcl_martybdaだと思われます。extprocを停止し、起動します。

 

oracle@vm04 admin]$ mtactl stop bds_orcl_martybda

ORACLE_HOME = "/u03/app/oracle/12.1.0/dbhome_orcl"
MTA init file = "/u03/app/oracle/12.1.0/dbhome_orcl/hs/admin/initbds_orcl_martybda.ora"

oracle 16776 1 0 Jul12 ? 00:49:25 extprocbds_orcl_martybda -mt
Stopping MTA process "extprocbds_orcl_martybda -mt"...

MTA process "extprocbds_orcl_martybda -mt" stopped!

[oracle@vm04 admin]$ mtactl start bds_orcl_martybda

ORACLE_HOME = "/u03/app/oracle/12.1.0/dbhome_orcl"
MTA init file = "/u03/app/oracle/12.1.0/dbhome_orcl/hs/admin/initbds_orcl_martybda.ora"

MTA process "extprocbds_orcl_martybda -mt" is not running!

Checking MTA init parameters...

[O]  INIT_LIBRARY=$ORACLE_HOME/lib/libkubsagt12.so
[O]  INIT_FUNCTION=kubsagtMTAInit
[O]  BDSQL_CLUSTER=martybda
[O]  BDSQL_CONFIGDIR=/u03/app/oracle/12.1.0/dbhome_orcl/bigdatasql/databases/orcl/bigdata_config

MTA process "extprocbds_orcl_martybda -mt" started!
oracle 19498 1 4 06:58 ? 00:00:00 extprocbds_orcl_martybda -mt

Kerberosチケットのキャッシュをリセットしました。 HDFSデータに対しクエリを実行します。

 

[oracle@vm04 admin]$ sqlplus / as sysdba
SQL*Plus: Release 12.1.0.2.0 Production on Mon Jul 23 07:00:26 2018
Copyright (c) 1982, 2014, Oracle.  All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
SQL> alter session set container=PDBORCL;
Session altered.
SQL> select * from bds_test;
select * from bds_test
*
ERROR at line 1:
ORA-29913: error in executing ODCIEXTTABLEOPEN callout
ORA-29400: data cartridge error

KUP-11504: error from external driver: java.lang.Exception: Error initializing JXADProvider: Failed on local exception: java.io.IOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by
GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]; Host Details : local host is: "m04.vm.oracle.com/192.168.254.5"; destination host is:
"vm02.vm.oracle.com":8020;

エラーを確認します。このエラーが表示された場合は、データベース側に有効なKerberosチケットがないことを意味します。 すべてを元に戻し、環境が正しく動作するようにします。

[oracle@vm04 admin]$ crontab -l
15 1,7,13,19 * * * /bin/su - oracle -c "/usr/bin/kinit oracle/martybda@MARTYBDA.ORACLE.COM -k -t /u03/app/oracle/12.1.0/dbhome_orcl/bigdatasql/clusters/martybda/oracle.keytab"
[oracle@vm04 admin]$ /usr/bin/kinit oracle/martybda@MARTYBDA.ORACLE.COM -k -t /u03/app/oracle/12.1.0/dbhome_orcl/bigdatasql/clusters/martybda/oracle.keytab
[oracle@vm04 admin]$ klist 
Ticket cache: FILE:/tmp/krb5cc_500
Default principal: oracle/martybda@MARTYBDA.ORACLE.COM
Valid starting     Expires            Service principal
07/23/18 07:03:46  07/24/18 07:03:46  krbtgt/MARTYBDA.ORACLE.COM@MARTYBDA.ORACLE.COM
    renew until 07/30/18 07:03:46
[oracle@vm04 admin]$ mtactl stop bds_orcl_martybda
...
[oracle@vm04 admin]$ mtactl start bds_orcl_martybda
...
[oracle@scaj0602bda09vm04 admin]$ sqlplus / as sysdba
...
SQL> alter session set container=PDBORCL;
Session altered.
SQL> select * from bds_test;
LINE
----------------------------------------
line1
line2
SQL> 

シナリオ2:Hadoop側でKerberosチケットをミスした場合


Hadoop側でKerberosチケットをミスしたケース(Oracleユーザーの場合)を紹介します。各Hadoopノードでkdestroyコマンドツールを使用し、チケットを削除します。
 

[oracle@vm01 ~]$ id
uid=1000(oracle) gid=1001(oinstall) groups=1001(oinstall),127(hive),1002(dba)
[oracle@vm01 ~]$ kdestroy
すべての手順を完了した後、データベース側でクエリを再実行します。
 
[oracle@vm04 bigdata_config]$ sqlplus / as sysdba
...
SQL> alter session set container=PDBORCL;
Session altered.
SQL> select * from bds_test;
LINE
----------------------------------------
line1
line2
SQL> 
すべてがうまく見えますが、実行統計情報を確認しましょう。
 
SQL> select n.name, s.value /* , s.inst_id, s.sid */ from v$statname n, gv$mystat s where n.name like '%XT%' and s.statistic# = n.statistic#;

NAME                                      VALUE
---------------------------------------------------------------- ----------
cell XT granules requested for predicate offload                1
cell XT granule bytes requested for predicate offload           12
cell interconnect bytes returned by XT smart scan               8192
cell XT granule predicate offload retries                       3
cell XT granule IO bytes saved by storage index                 0
cell XT granule IO bytes saved by HDFS tbs extent map scan      0
「cell XT granule predicate offload retries」が0ではないことを確認できます。つまり、実際の処理はすべてデータベース側で行われます。 HDFS上で10TBのテーブルにクエリを実行すると、10TBをデータベース側に移動し、処理します。つまり、Hadoop側でKerberosチケットをミスした場合、クエリは正常に終了しますが、SmartScanは機能しません。

 

Kerberosチケットの更新


Kerberosの特徴の1つは、チケットに有効期限があり、更新する必要があることです。
Big Data SQLのインストール時に、データベース側とHadoop側でcrontabジョブを作成します。何らかの理由でこれに失敗した場合、以下を例として使うことができます。
 

[oracle@vm04 ~]$ crontab -l
15 1,7,13,19 * * * /bin/su - oracle -c "/usr/bin/kinit oracle/martybda@MARTYBDA.ORACLE.COM -k -t /u03/app/oracle/12.1.0/dbhome_orcl/bigdatasql/clusters/martybda/oracle.keytab"
Big Data SQLは常にOracleプリンシパルを使用しますが、HDFSへのアクセスを細かく制御したい場合、マルチユーザー認証機能を使用する必要があります。

 

結論

  1. Big Data SQLはKerberizedクラスタで動作する
  2. KerberosチケットはDatabase側とHadoop側に存在する必要がある
  3. データベース側でKerberosチケットをミスした場合、クエリは失敗する
  4. Hadoop側でKerberosチケットをミスした場合、クエリは失敗しない。ただし、フェールバックモードで動作する(すべてのブロックをデータベースノードに移動し、そこで処理する。これは望んだことではない。)

 

本投稿は Big Data SQL Quick Start. Kerberos - Part 26. を元に投稿しています。

Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.