Kerberos認証を開始したビッグデータプラットフォームクラスタ外クライアントの導入

4947 ワード

このドキュメントでは、クラスタ外ノードでビッグデータプラットフォームのクライアントを導入する方法について説明します.このビッグデータプラットフォームでは、Kerberos認証が開始されています.クラスタ内のhdfsデータをクエリーしたり、sparkタスクをクラスタ内にコミットしたりするなど、クラスタ内のサービスをクライアント・ユーザーがクラスタ外で使用できるようになりました.具体的な導入手順は次のとおりです.
1.クラスタ内のhadoop関連コンポーネントをクライアントにコピーする
ローカル作成ディレクトリ/opt/cloudera/parcels
mkdir –R /opt/cloudera/parcels

コピーパッケージCDH-5.7.2-1.cdh5.7.2.p0.18ディレクトリ/opt/cloudera/parcelsディレクトリへのソフト接続
cd /opt/cloudrea/parcels
ln –s CDH-5.7.2-1.cdh5.7.2.p0.18 CDH

2.クラスタ内のhadoop関連プロファイルをクライアントにコピーする
ディレクトリ/etc/hadoopを作成し、/etc/hadoop/confフォルダをディレクトリに入れ、node 1はクラスタ内ノード
mkdir /etc/hadoop
scp -r node1:/etc/hadoop/conf /etc/hadoop

ディレクトリ/etc/hiveを作成し、/etc/hive/confフォルダをディレクトリに挿入
mkdir /etc/hive
scp -r node1:/etc/hive/conf /etc/hive

ディレクトリ/etc/sparkを作成し、/etc/spark/confフォルダをディレクトリに挿入
mkdir /etc/spark
scp -r node1:/etc/spark/conf /etc/spark

3、クラスタ内の認証関連プロファイルkrb 5をコピーする.confからクライアントへ
scp node1:/etc/krb5.conf  /etc

4、クライアントスクリプトclientを実行する.sh、ファイルの内容は以下の通りです.
export HADOOP_HOME=/opt/cloudera/parcels/CDH/lib/hadoop
export HADOOP_CONF=/etc/hadoop/conf
export HADOOP_CONF_DIR=/etc/hadoop/conf
export YARN_CONF_DIR=/etc/hadoop/conf
export SPARK_CONF_DIR=/etc/spark/conf
#export SPARK_HOME=/opt/cloudera/parcels/CDH/lib/spark
CDH_HOME="/opt/cloudera/parcels/CDH"
export PATH=$CDH_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin/:$PATH
##beeline   hive  sql  
cd /opt/cloudera/parcels/CDH/bin
./beeline -u "jdbc:hive2://node128a7:10000/;principal=hive/[email protected]" --config /etc/hive/conf
##  hdfs  
#./hdfs --config /etc/hadoop/conf dfs -ls /
##  spark  
#cd /opt/cloudera/parcels/CDH/lib/spark/bin
#./spark-shell

注意:1、クライアントはクラスタ時間と同期しなければならない.そうしないと、アイデンティティ認証に失敗する.2、クライアントhostはクラスタhostsを追加し、クラスタhostsはクラスタのある点を接続して取得することができる.3、クラスタはkerberos認証をオンにし、shellコマンドを実行する前にkinitで認証する必要があります.例は以下の通りです.
#kinit    
[root@node128a225 client]# kinit -kt /home/user01.keytab user01
#      
[root@node128a225 client]# klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: [email protected]

Valid starting       Expires              Service principal
12/01/2016 20:48:50  12/02/2016 20:48:50  krbtgt/[email protected]
    renew until 12/08/2016 20:48:50

4、spark jdbcプログラミング、同様にkerberos認証を呼び出す必要がある.例は以下の通りである.完全工事は【spark jdbc例】ディレクトリの下でSecurityを見る
package kerberos.spark;


import org.apache.hadoop.security.UserGroupInformation;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Timer;
import java.util.TimerTask;

/*
 *        ,      principal   keytab       
 */
public class sparkjdbc {
   public static void main(String args[]) {
      final String principal = args[0];//    principal, user01
      final String keytab = args[1];//    keytab, /home/user01/user01.keytab
      String sql = args[2];//  sql    
      try {
         //1、    :  12      
         long interval=1;
         long now = System.currentTimeMillis();
         long start = interval - now % interval;
         Timer timer = new Timer();
         timer.schedule(new TimerTask(){
            public void run() {
               org.apache.hadoop.conf.Configuration conf = new org.apache.hadoop.conf.Configuration();
               conf.set("hadoop.security.authentication", "Kerberos");
               UserGroupInformation.setConfiguration(conf);
               try {
                  UserGroupInformation.loginUserFromKeytab(principal,keytab);
                  System.out.println("getting connection");
                  System.out.println("current user: "+UserGroupInformation.getCurrentUser());
                  System.out.println("login user: "+UserGroupInformation.getLoginUser());
               } catch (IOException e) {
                  e.printStackTrace();
               }
               System.out.println("execute task!"+ this.scheduledExecutionTime());
            }
         },start,12*60*60*1000);//    

         //    ,spark jdbc  hive  sql  
         Class.forName("org.apache.hive.jdbc.HiveDriver");
         Connection con = DriverManager
               .getConnection("jdbc:hive2://node128a7:10000/;principal=hive/[email protected]");
         System.out.println("got connection");
         Statement stmt = con.createStatement();
         ResultSet rs = stmt.executeQuery(sql);// executeQuery        ,      
            System.out.println("      :");
            while (rs.next()) {
                System.out.println(rs.getString(1));//        int     getInt()
            }
         
         con.close();
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}