はじめに
扱っているデータの性質上、どうしてもオンプレミスでHadoop Clusterの運用を行っています。(クラウドがいい...)
今まではSpark, Hiveでバッチ処理をメインで行ってきましたが、最近インタラクティブにクエリを実行したいとの要望があり、今更ながらPrestoをKerberized Hadoop ClusterのHive metastoreに接続します。
環境
今回の接続に使用した環境は下記です。
Kerberized Hadoop Cluster
サービス、ユーザ認証にKerberosを利用したHadoop Cluster(レルム: EXAMPLE.COM)
OS: CentOS 7.7
Hadoopディストリビューション: CDH6.2.1
master node: 3台
worker node: 6台
Presto
Presto: version 333(prestosql)
coordinator: 1台(master nodeのうち1台)
worker: 6台(worker nodeと同様)
前提条件
- Kerberized Hadoop Clusterを構築済み
- Prestoを導入済み
- presto-cliが利用可能
- Kerberized前にHiveに接続済み
Hadoop ClusterのKerberosの設定はAmbariやCloudera Managerから簡単に可能です。
また、Prestoの導入もpresto-adminを利用することで、coordinator, workerをCLIで一元管理可能です。(GUIがないのはネック!)
KDCにPresto用のプリンシパルを登録、keytabの生成
Kerberized Hadoop Clusterで使用している、KDCにPrestoの設定を行います。
KCDのサーバで下記のコマンドを実行。
kadmin: addprinc -randkey presto@EXAMPLE.COM
kadmin: xst -k presto.keytab presto@EXAMPLE.COM
生成したpresto.keytab
をprestoのcoordinator, workerの/etc/presto/presto.keytab
に配置します。
(配置場所は任意の場所で問題ありません。)
/etc/krb5.confの設定(CentOS7のみ)
下記の設定をcoordinator, workerから削除
renew_lifetime = 7d
ここでかなりハマりました。この設定をしないとCentOSではpresto-cliの接続でMessage stream modified (41)
のエラーが発生します。
core-site.xmlの設定
impersonationを有効にするため、下記の設定をCloudera Managerで行います。
<property>
<name>hadoop.proxyuser.presto.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.presto.groups</name>
<value>*</value>
</property>
hive.propertiesの設定
下記の設定を追加します。
# Hive
hive.metastore.authentication.type=KERBEROS
hive.metastore.thrift.impersonation.enabled=true # prestosqlのみの設定, prestodbの方はなし
hive.metastore.service.principal=hive/_HOST@EXAMPLE.COM
hive.metastore.client.principal=presto@EXAMPLE.COM
hive.metastore.client.keytab=/etc/presto/presto.keytab
# HDFS
hive.hdfs.authentication.type=KERBEROS
hive.hdfs.impersonation.enabled=true
hive.hdfs.presto.principal=presto@EXAMPLE.COM
hive.hdfs.presto.keytab=/etc/presto/presto.keytab
設定したhive.propertiesをcoordinator, workerに配布し、Prestoを再起動します。
接続確認
presto-cliを利用して接続確認を行います。
./presto-cli --server {coordinatorのIPアドレス or ホスト名}:8080 --catalog hive --schema default --user {user}
presto:default> show schemas; # Hive上のデータベースが表示
--user
で指定したuserは、Hive, HDFS上で適切な権限が付与されてている必要があります。
最後に
公式ドキュメントに従って、接続設定を行いました。
PrestoでKerberized Hadoop ClusterのHive metastoreの接続を解説しているサイトがほとんどなかったので、参考になれば幸いです。
また、Kerberized Hadoop ClusterのHive metastoreにPrestoを接続するだけであれば、Presto自体のKerberos, SSL/TLS設定は不要です。
参考