0.14に基づく.0バージョン構成HiveServer 2


プロジェクトではmondrianの異種データソースとしてhiveにアクセスしてMDXクエリーを実行する必要がありますが、私は一般的にhiveを使用するときはhiveコマンドラインで直接SQLを実行したり、hiveのjarパッケージでプログラムにアクセスしたりします.この方法の使用中、訪問したhadoopクラスタは会社のクラスタです.
以前hiveをテストする過程で、hiveのjdbcソースコードを自分で修正したことを覚えています.主にいくつかのhiveを修正しました.jdbcを実現する中で実現していませんが、異常なインタフェースを投げ出します.mondrianはこれらのインタフェースを呼び出して、次のプロセスが進まなくなります.全体の修正は比較的簡単です.もう一つの問題は、当時のhiveは認証メカニズムを使用していなかったことであり、hadoopも含めて認証メカニズムがなかったことであり、現在は会社のhadoopクラスタを走るにはkerberos認証を使用する必要があり、これは自分ではまだ熟知していないが、使い方を知っているだけなので、kerberos認証に関する知識を補う必要がある.
次にhiveのいくつかの使い方について説明します.まずhiveのメタデータベースで、3つの形式に分かれています.
1つ目は埋め込まれたderbyデータベースで、derbyは現在のディレクトリにディレクトリを作成するため、スマートにhiveインスタンスを起動します.
2つ目の方法は、リモート・データベース、すなわちmysqlなどのリレーショナル・データベース・システム(現在mysqlのみテストされている)を使用し、hiveはjdbc接続mysqlを介してメタデータ情報を取得し、
もう1つの方法はhiveが持っているmetaserverで、このserverはメタデータに関係するために使用され、本当のメタデータマネージャの前にサービスを追加したのと同じです.
使用中は主にhiveを2つの方法で使用します.
1つ目は、hiveをファイルに対してSQLクエリーを使用できる根拠として使用することです.つまり、hiveコマンドラインを直接使用するか、プログラムでhiveが提供する関数を使用して起動します.この場合、hiveメタデータ・サーバ(hiveが格納しているデータベースとテーブル、およびそのプロパティを示す)とhiveのデータ・ウェアハウス・ディレクトリを構成するだけです.(一般的にはHDFSのディレクトリ)テストデータウェアハウスのディレクトリは、データベースの作成時にのみ機能し、テーブルの作成時にデータベースのディレクトリの下にテーブルのディレクトリを作成します.また、hadoopのプロファイルとjarパッケージを指定する必要があります.hiveはhadoopに依存してタスクを実行します.
      
第2の方法はhiveがSQLインタフェースを提供するデータベースとして使用されることであり、mysqlを使用する方法と同様にjdbcでアクセスできます.本稿では、このサーバを構成し、hiveが持参したクライアントを使用する方法と、jdbcを使用して接続する方法について説明します.
次にhiveを環境構成します.hiveでは、リモートのmysqlをソースデータサーバとして使用するのが一般的です.hiveが持参したmatestoreサーバを使用しないで、後者はもっと大きな同時をサポートできるようです.これはしばらく必要がなければ簡単です.メタデータベースのほかに、データウェアハウスアドレスがあります.私が構成した個人ユーザーinternのディレクトリ/user/internです.具体的な構成は以下の通りです.
<property>
  <name>hive.metastore.warehouse.dir</name>
  <value>/user/intern/</value>
  <description>location of default database for the warehouse</description>
</property>
<property>
  <name>javax.jdo.option.ConnectionURL</name>
  <value>jdbc:mysql://127.0.0.1:3306/HIVE</value>
  <description>JDBC connect string for a JDBC metastore</description>
</property>

<property>
  <name>javax.jdo.option.ConnectionDriverName</name>
  <value>com.mysql.jdbc.Driver</value>
  <description>Driver class name for a JDBC metastore</description>
</property>
<property>
  <name>javax.jdo.option.ConnectionUserName</name>
  <value>root</value>
  <description>username to use against metastore database</description>
</property>

<property>
  <name>javax.jdo.option.ConnectionPassword</name>
  <value>root</value>
  <description>password to use against metastore database</description>
</property>

また、ここではhiveメタデータの作成に注意する必要があります.一般的にutf 8をデータベースのデフォルトの文字セットとして使用します(中国語をサポートするためのはずです)が、utf 8文字セットhiveを使用するとわけのわからない間違いが多く、頭がつかめません.
したがって、hiveデータベースを再作成する必要がある場合は、文字セットをlatin 1として指定する必要があります.また、hiveに自動的に作成してもらうこともできます(試したことがありませんが、実行可能かどうか分かりません).
次にkerberos認証に関するものを構成する必要があります.具体的な構成内容は以下の通りです.
<property>
  <name>hive.server2.authentication</name>
  <value>KERBEROS</value>
  <description>
    Client authentication types.
       NONE: no authentication check
       LDAP: LDAP/AD based authentication
       KERBEROS: Kerberos/GSSAPI authentication
       CUSTOM: Custom authentication provider
               (Use with property hive.server2.custom.authentication.class)
       PAM: Pluggable authentication module.
  </description>
</property>
<property>
  <name>hive.server2.authentication.kerberos.principal</name>
  <value>hive/[email protected]</value>
  <description>
    Kerberos server principal
  </description>
</property>

<property>
  <name>hive.server2.authentication.kerberos.keytab</name>
  <value>/home/hzfengyu/hive.keytab</value>
  <description>
    Kerberos keytab file for server principal
  </description>
</property>

この3つの構成項目はそれぞれhiveserver 2を構成する認証方式であり、構成が適切でなければクライアントに多くの問題が発生し、デフォルトでは認証方式はCUSTOMである.ここではKERBEROSに構成し、kerberos認証に必要なkeytabファイルとprincipalを構成し、一般的にkinitを実行するにはこの2つのものが必要である.しかし違いはここのprincipalが完了を指定する必要があることです.@記号の前のものだけでなく(kinitの場合は前のものだけを指定すれば良い)ということに注意したいのは、ここのkeytab対応のユーザはhadoop上でエージェント実行可能な権限を持たなければならないことです.これはhiveserver 2に必要なものです.つまり、hiveserver 2は指定エージェントのサーバーにすぎず、異なるユーザはjdbcを介してhiveserver 2に接続され、クライアントによって異なるkeytabユーザですエージェントの異なるユーザーは、特定の操作を実行します.このユーザーにエージェントの権限がない場合、jdbcとhiveserver 2を使用して接続を確立するときに認証エラーが発生します.エラーのスタックは次のとおりです.
15/05/01 17:32:33 [main]: ERROR transport.TSaslTransport: SASL negotiation failure
javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Server not found in Kerberos database (7) - UNKNOWN_SERVER)]
     at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:212)
     at org.apache.thrift.transport.TSaslClientTransport.handleSaslStartMessage(TSaslClientTransport.java:94)
     at org.apache.thrift.transport.TSaslTransport.open(TSaslTransport.java:253)
     at org.apache.thrift.transport.TSaslClientTransport.open(TSaslClientTransport.java:37)
     at org.apache.hadoop.hive.thrift.client.TUGIAssumingTransport$1.run(TUGIAssumingTransport.java:52)
     at org.apache.hadoop.hive.thrift.client.TUGIAssumingTransport$1.run(TUGIAssumingTransport.java:49)
     at java.security.AccessController.doPrivileged(Native Method)

ここではhiveユーザーを使用しています.このユーザーはエージェント権限を持っていますが、jdbc接続のマシンを使用しているユーザーはinternです.まずhiveマシンでhiveserver 2を起動するコマンドを実行します.
./bin/hive --service hiveserver2

その後、クライアントのマシンにhiveが持参したbeelineで接続します.
./bin/beeline

次にconnectコマンドを使用してhiveserver 2に接続します.
beeline> !connect jdbc:hive2://hiveserver2-ip:10000/foodmart;principal=hive/[email protected];
scan complete in 34ms
Connecting to jdbc:hive2://bitest0.server.163.org:10000/foodmart;principal=hive/[email protected];
Enter username for jdbc:hive2://bitest0.server.163.org:10000/foodmart;principal=hive/[email protected];:
Enter password for jdbc:hive2://bitest0.server.163.org:10000/foodmart;principal=hive/[email protected];:
Connected to: Apache Hive (version 0.14.0)
Driver: Hive JDBC (version 0.14.0)
Transaction isolation: TRANSACTION_REPEATABLE_READ
0: jdbc:hive2://bitest0.server.163.org:10000/> 

接続するときはjdbcのurlを指定する必要があります(デフォルトのポート番号は10000で、hiveserver 2のプロファイルで構成することもできます)また、サーバのprincipal、すなわち上に構成されたhive.server 2.authentication.kerberos.principalを作成する必要があります.クライアントユーザーが使用するユーザーは、クライアント側の現在のユーザーであり、klistを使用して表示することができます.
独自のbeeline接続に加えて、jdbcを使用してプログラムに接続することもできます.テストコードは次のとおりです.
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.security.UserGroupInformation;

public class TestHive {

  public static void main(String[] args) throws SQLException {
    try {
      Class.forName("org.apache.hive.jdbc.HiveDriver");
    } catch (ClassNotFoundException e) {
      e.printStackTrace();
    }
    

Configuration conf = new Configuration();
conf.setBoolean("hadoop.security.authorization", true);
conf.set("hadoop.security.authentication", "kerberos");
UserGroupInformation.setConfiguration(conf);
try {
UserGroupInformation.loginUserFromKeytab("intern/bigdata", "C:\\Users\\Administrator\\Desktop\\intern.keytab");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
    Connection conn = DriverManager
        .getConnection(
            "jdbc:hive2://hiveserver2-ip:10000/foodmart;principal=hive/[email protected];User=;Password=;",
            "", "");
    Statement stmt = conn.createStatement();
    String sql = "select * from account limit 10";
    System.out.println("Running: " + sql);
    ResultSet res = stmt.executeQuery(sql);
    while (res.next()) {
      System.out.println(String.valueOf(res.getInt(1)) + "\t"
          + res.getString(2));
    }
  }
}

では、kerberos認証を使用したhiveserver 2を構築する方法について説明します.次は、mondrianのデータソースとしてhiveを使用してMDXクエリーを実行する方法について説明します.
最後の最後に、kerberos認証を構成する際に使用するhiveバージョンは0.13です.1.上記の構成では、次のような問題が発生しています.
2015-04-30 17:02:22,602 ERROR [Thread-6]: thrift.ThriftCLIService (ThriftBinaryCLIService.java:run(93)) - Error: 
java.lang.NoSuchFieldError: SASL_PROPS
        at org.apache.hadoop.hive.thrift.HadoopThriftAuthBridge20S.getHadoopSaslProperties(HadoopThriftAuthBridge20S.java:126)
        at org.apache.hive.service.auth.HiveAuthFactory.getSaslProperties(HiveAuthFactory.java:116)
        at org.apache.hive.service.auth.HiveAuthFactory.getAuthTransFactory(HiveAuthFactory.java:133)
        at org.apache.hive.service.cli.thrift.ThriftBinaryCLIService.run(ThriftBinaryCLIService.java:43)
        at java.lang.Thread.run(Thread.java:701)
2015-04-30 17:02:22,605 INFO  [Thread[Thread-7,5,main]]: delegation.AbstractDelegationTokenSecretManager (AbstractDelegationTokenSecretManager.java:updateCurrentKey(
222)) - Updating the current master key for generating delegation tokens
2015-04-30 17:02:22,612 INFO  [Thread-3]: server.HiveServer2 (HiveStringUtils.java:run(623)) - SHUTDOWN_MSG: 
/************************************************************
SHUTDOWN_MSG: Shutting down HiveServer2 at bitest0.server.163.org/10.120.36.85
************************************************************/

最後にgoogleで関連する誤りを探して、HIVEのこのbugを発見しました:https://issues.apache.org/jira/browse/HIVE-7620
私が出会ったのがこの問題なのかどうか分かりませんが、どうしてもこの問題を解決できません(実は手の施しようがないと言えます)、hiveのバージョンを変えて、0.14.0で解決したと見て、私は新しいバージョンに変えました.やはりこの問題はもう現れません.このバグが原因なのかどうかは分かりません.