E-MapReduce (EMR) クラスター内の Hive には、Hive クライアント、Beeline、または Java Database Connectivity (JDBC) を使用して接続します。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
-
Hive がインストール済みの EMR クラスターがあり、マスターノードで パブリックネットワーク IP の割り当て スイッチが有効になっていること。クラスターの作成手順については、「クラスターの作成」をご参照ください。
-
クラスターのマスターノードにログイン済みであること。「クラスターへのログイン」をご参照ください。
本トピックで言及されるクラスタータイプ:
| クラスタータイプ | 説明 |
|---|---|
| 一般クラスター | Kerberos 認証 および 高可用性サービス の両方が無効になっています。 |
| 高セキュリティクラスター | Kerberos 認証 が有効になっています。 |
| 高可用性クラスター | 高可用性サービス が有効になっており、クラスター作成時に ZooKeeper を選択する必要があります。 |
注意事項
-
マスターノード名とパブリック IP アドレスは、ノード タブで確認できます。「クラスターへのログイン」をご参照ください。デフォルトのマスターノード名は
master-1-1です。Hadoop クラスターの場合はemr-header-1です。
-
HiveServer2 では、デフォルトでユーザー名とパスワードによる認証は実行されません。認証を有効にするには、Lightweight Directory Access Protocol (LDAP) 認証を有効化します。「LDAP 認証の使用」をご参照ください。
一般クラスターへの Hive 接続
Hive クライアントの使用
次のコマンドを実行します。
hive
終了するには、quit; または exit; を実行します。
Beeline の使用
次のコマンドを実行します。
beeline -u jdbc:hive2://master-1-1:10000
終了するには、!quit または !exit を実行します。
JDBC の使用
続行する前に、Java 環境の設定、Java 開発ツールのインストール、および環境変数の設定が完了していることを確認してください。
-
hadoop-commonおよびhive-jdbcを、pom.xmlファイルの依存関係として追加します。<dependencies> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>3.1.3</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>3.2.1</version> </dependency> </dependencies>バージョンは、EMR コンソールの ソフトウェア情報 セクション(基本情報 タブ内)に表示される Hadoop-Common および Hive のバージョンと一致していることを確認してください。
-
HiveServer2 への接続およびデータクエリを行うコードを作成します。
import java.sql.*; public class App { private static String driverName = "org.apache.hive.jdbc.HiveDriver"; public static void main(String[] args) throws SQLException { try { Class.forName(driverName); } catch (ClassNotFoundException e) { e.printStackTrace(); } // <マスターノードのパブリック IP アドレス> を実際のパブリック IP アドレスに置き換えます Connection con = DriverManager.getConnection( "jdbc:hive2://<マスターノードのパブリック IP アドレス>:10000", "root", ""); Statement stmt = con.createStatement(); String sql = "select * from sample_tbl limit 10"; ResultSet res = stmt.executeQuery(sql); while (res.next()) { System.out.println(res.getString(1) + "\t" + res.getString(2)); } } }説明この方法では、ポート 10000 が開放されている必要があります。「セキュリティグループの管理」をご参照ください。
-
プロジェクトを JAR ファイルとしてパッケージ化し、実行するホストにアップロードします。
重要JAR ファイルの実行には、hadoop-common および hive-jdbc が必要です。実行環境の環境変数にこれらの依存関係パッケージが含まれていない場合、個別にダウンロード・設定するか、JAR ファイルに同梱する必要があります。JAR ファイル実行時にこれらの依存関係が不足していると、以下のエラーが報告されます。
-
hadoop-common が不足:
java.lang.NoClassDefFoundError: org/apache/hadoop/conf/Configuration -
hive-jdbc が不足:
java.lang.ClassNotFoundException: org.apache.hive.jdbc.HiveDriver
本例では、生成された JAR ファイルは
emr-hiveserver2-1.0.jarです。この JAR ファイルを E-MapReduce クラスターのマスターノードにアップロードします。 -
-
JAR ファイルを実行します。
重要JAR ファイルを実行するサーバーと E-MapReduce クラスターは、同一の VPC およびセキュリティグループに属し、ネットワーク接続が確立されている必要があります。異なる VPC やネットワーク環境にある場合は、パブリック IP アドレスを使用してアクセスします。あるいは、ネットワーク製品を用いて相互接続を構築したうえで、内部ネットワーク経由でのアクセスを実現することも可能です。ネットワーク接続のテスト方法は以下のとおりです。
-
パブリックネットワーク:
telnet <master-1-1 のパブリック IP アドレス> 10000 -
内部ネットワーク:
telnet <master-1-1 の内部 IP アドレス> 10000
java -jar emr-hiveserver2-1.0.jar -
高セキュリティクラスターへの Hive 接続
高セキュリティクラスターでは Kerberos 認証が必須です。Hive クライアントまたは Beeline を使用して接続する前に、Kerberos プリンシパルを設定し、チケット発行チケット (TGT) を取得してください。
Kerberos 認証の設定
-
Kerberos 管理 CLI を起動します。
-
master-1-1(キー配布センター (KDC) ノード)で、root ユーザーとして実行します。kadmin.local出力に以下が含まれている場合、CLI が準備完了です。
Authenticating as principal hadoop/admin@EMR.C-85D4B8D74296****.COM with password. kadmin.local: -
その他の任意のノードまたはゲートウェイで実行します。
kadmin -p <admin-user> -w <admin-password>プレースホルダーを以下の値に置き換えます。
プレースホルダー 値 <admin-user>root/admin(EMR 内で自己管理される KDC の場合)<admin-password>EMR コンソールの Kerberos サービスの 設定 タブに表示される admin_pwd出力に以下が含まれている場合、CLI が準備完了です。
Authenticating as principal root/admin with password. kadmin:
-
-
testという名前の Kerberos プリンシパルを作成します。説明ユーザー名とパスワードは必ず保存してください。TGT の作成に必要です。
addprinc -pw 123456 testプリンシパルは、出力に以下が含まれる場合に作成されます。
Principal "test@EMR.C-85D4B8D74296****.COM" created.管理 CLI を終了するには、
quitを実行します。 -
システムユーザーを作成し、そのユーザーに切り替えます。
useradd test su test -
TGT を作成します。
kinitプロンプトが表示されたら、
testユーザーのパスワード(本例では123456)を入力します。
Hive クライアントの使用
上記の Kerberos 設定を完了した後、次のコマンドを実行します。
beeline -u "jdbc:hive2://master-1-1.c-56187feb57f0****.cn-hangzhou.emr.aliyuncs.com:10000/;principal=hive/_HOST@EMR.c-56187feb57f0****.COM"
Beeline の使用
上記の Kerberos 設定を完了した後、次のコマンドを実行します。
beeline -u "jdbc:hive2://master-1-1.c-56187feb57f0****.cn-hangzhou.emr.aliyuncs.com:10000/;principal=hive/_HOST@EMR.c-56187feb57f0****.COM"
クラスターに応じて、以下の値を置き換えてください。
| プレースホルダー | 取得方法 |
|---|---|
master-1-1.c-56187feb57f0****.cn-hangzhou.emr.aliyuncs.com |
HiveServer2 ノードの完全修飾ホスト名(通常は master-1-1)。該当ノードで hostname -f コマンドを実行すると取得できます。 |
EMR.c-56187feb57f0****.COM |
領域名です。「realm」パラメーターを、EMR コンソールの Kerberos サービスの [設定] タブで検索します。 |
高可用性クラスターへの Hive 接続
高可用性クラスターでは、複数の HiveServer2 インスタンスが公開されています。クラスターの構成に合ったサービス検出モードで Beeline を使用します。
ZooKeeper サービス検出による Beeline の使用
beeline -u 'jdbc:hive2://master-1-1:2181,master-1-2:2181,master-1-3:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2'
マルチサーバー方式のサービス検出による Beeline の使用
beeline -u 'jdbc:hive2://master-1-1:10000,master-1-2:10000,master-1-3:10000/default;serviceDiscoveryMode=multiServers'
トラブルシューティング
ポート 10000 で Hive に接続できない
症状: HiveServer2 へのポート 10000 経由の接続がタイムアウトするか、拒否されます。
原因: HiveServer2 が実行されていないか、セキュリティグループがポート 10000 のトラフィックを許可していません。
解決策:
-
HiveServer2 が実行中であることを確認します。HiveServer2 がデプロイされているノードで、次のコマンドを実行します。
netstat -tulnp | grep 10000プロセスが表示されない場合、HiveServer2 は実行されていません。問題の診断には、HiveServer2 の起動ログを確認してください。
-
セキュリティグループでポート 10000 が開放されていることを確認します。EMR コンソールで 基本情報 タブに移動し、クラスターセキュリティグループ の横にあるリンクをクリックします。セキュリティグループの詳細 タブで、ポート 10000 が開放されていることを確認します。開放されていない場合は、有効化してください。「セキュリティグループの管理」をご参照ください。
高可用性および Kerberos 認証の両方が有効になっている
症状: クラスターで 高可用性サービス および Kerberos 認証 の両方が有効になっており、Hive への接続が必要です。
原因: この組み合わせでは、Kerberos 認証情報および負荷分散された HiveServer2 エンドポイントが必要となりますが、標準の Beeline コマンドでは自動的に処理されません。
解決策: Kerberos プリンシパルを作成し TGT を取得したうえで、JDBC を使用して接続します。「HiveServer2 の負荷分散」をご参照ください。