共用 Hive

Prev Next

VPC環境で利用できます。

Data Forestで Hiveデータベースとテーブルを作成して使用する方法を説明します。

参考

UDF、Storage Handler機能は準備中です。

Hiveコマンドの実行

HiveServerに初めてアクセスする場合は、Hiveを使用するをご参考ください。Kerberos認証はアカウント作成と管理をご参考ください。

Devアプリで、以下のように Hiveコマンドを実行できます。

$ kinit example -kt df.example.keytab # Kerberos 認証
$ beeline -u "jdbc:hive2://zk1.kr.df.naverncp.com:2181,zk2.kr.df.naverncp.com:2181,zk3.kr.df.naverncp.com:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2" -n example -p 'PASSWORD'

データベースの作成

参考

Data Forestユーザーは Hiveのディフォルト値のデータベースを利用できません。ルールに沿ってユーザーのデータベース新たに作成します。

Data Forestで Hiveデータベースを作成するためには、以下のルールに従います。

  • データベース名の形式は{USER}__db_*です。ユーザーのアカウント名がexampleである場合、以下のように DB名を指定できます。

    example__db_foo
    example__db_bar
    example__db_hello_foo
    example__db_hello_foo_bar
    
  • データベース名に-(ハイフン)は入力できません。ユーザー名に-(ハイフン)が入力されている場合、_(アンダースコア)に置換します。ユーザーのアカウント名がexample-exである場合、以下のように DB名を指定できます。

    example_ex__db_foo
    

    このルールに反する DB名の例は、以下のとおりです。

    example_db_foo  # _(アンダーバー)数を間違った場合
    example__DB_foo # dbを大文字で表記している場合
    example-ex__db_foo # -(ハイフン)を_(アンダーバー)に直してない場合
    
  • Hiveテーブルデータは HDFSに保存されます。データベースを作成する時は、必ず LOCATION 設定でパスを指定します。このパスは、ユーザーのホームディレクトリの下の warehouse 下位パスに制限されます。

    • まず、ユーザーのホームディレクトリの下位にwarehouseディレクトリを作成します。
      $ hadoop fs -mkdir warehouse
      $ hadoop fs -ls
      Found 4 items
      ...
      drwx------   - example hdfs          0 2021-03-29 16:18 warehouse
      
    • Beelineコマンドで以下のようにデータベースを作成できます。
      # データベースの作成
      CREATE DATABASE example__db_foo LOCATION   '/user/example/warehouse/example__db_foo.db';
      # データベースの使用
      USE example__db_foo;
      
注意

Beelineコマンドでデータベースを照会する場合、他のユーザーのデータベースは確認できません。ただし、Spark SQLではすべてのデータベースリストが返されるため、データベース名に個人情報が含まれないようご注意ください。

テーブルの作成

テーブルの作成時にネーミングの制約はありません。LOCATIONオプションは必須ではありませんが、別途指定したい場合は /user/example/warehouse の下位のパスに指定します。

CREATE TABLE `table1` (`id` BIGINT) LOCATION '/user/example/warehouse/table1';

コマンドの制限

SETTRANSFORM節は使用できません。 専用キューを導入してSETコマンドを使用できるようにアップデートする予定です。

Spark-Hiveへのアクセスの設定

Sparkで Hiveの Managed Tableデータを読み込むために、LLAPを使用します。Interactive Hiveを用いて Hiveにアクセスするように設定する方法を説明します。

アクセス情報の確認

設定できるアクセス情報は、以下のとおりです。

Property Value
spark.sql.hive.hiveserver2.jdbc.url (Interactive) jdbc:hive2://zk1.kr.df.naverncp.com:2181,zk2.kr.df.naverncp.com:2181,zk3.kr.df.naverncp.com:2181/;serviceDiscoveryMode=zooKeeperHA;zooKeeperNamespace=df-interactive
spark.sql.hive.hiveserver2.jdbc.url (Batch) jdbc:hive2://zk1.kr.df.naverncp.com:2181,zk2.kr.df.naverncp.com:2181,zk3.kr.df.naverncp.com:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2
spark.datasource.hive.warehouse.metastoreUri thrift://hms1.kr.df.naverncp.com:9083,thrift://hms2.kr.df.naverncp.com:9083
spark.datasource.hive.warehouse.load.staging.dir /user/ {dataforestアカウント名} /tmp
spark.hadoop.hive.zookeeper.quorum zk1.kr.df.naverncp.com:2181,zk2.kr.df.naverncp.com:2181,zk3.kr.df.naverncp.com:2181
spark.hadoop.hive.llap.daemon.service.hosts @df-llap
principal {dataforestアカウント名} @KR.DF.NAVERNCP.COM
keytab {dataforesアカウントの keytabファイルのパス}
jars {hwc jarファイルのパス}
  • 表の内容から、spark.sql.hive.hiveserver2.jdbc.urlに interactiveと batchの2種類の Connection Stringが存在することが確認できます。
  • Interactive Hiveでタスクを実行するために、interactive Connection Stringを使用します。Sparkシェルや PySparkでも同じ設定値を使用してタスクを実行できます。
  • principalキータブは Spark Executorを YARNで実行するための設定として、Data Forestの Kerberosアカウントを使用します。
  • spark.sql.hive.hiveserver2.jdbc.urlの userと passwordは、Executor内で Interactive Hiveにアクセスするための認証情報です。Data Forestのアカウント名(Kerberos IDと同一)と Rangerパスワードを使用します。

Interactive Hiveでタスクを実行する例

Spark-shellを用いて Interactive Hiveでタスクを実行する例は、以下のとおりです。

spark-shell \
  --master local[2] \
  --conf spark.sql.hive.hiveserver2.jdbc.url="jdbc:hive2://zk1.kr.df.naverncp.com:2181,zk2.kr.df.naverncp.com:2181,zk3.kr.df.naverncp.com:2181/;serviceDiscoveryMode=zooKeeperHA;zooKeeperNamespace=df-interactive" \
  --conf spark.datasource.hive.warehouse.metastoreUri="thrift://hms1.kr.df.naverncp.com:9083,thrift://hms2.kr.df.naverncp.com:9083" \
  --conf spark.datasource.hive.warehouse.load.staging.dir=/user/example/tmp \
  --conf spark.hadoop.hive.zookeeper.quorum="zk1.kr.df.naverncp.com:2181,zk2.kr.df.naverncp.com:2181,zk3.kr.df.naverncp.com:2181" \
  --conf spark.hadoop.hive.llap.daemon.service.hosts=@df-llap \
  --conf spark.security.credentials.hiveserver2.enabled=false \
  --conf spark.sql.hive.hiveserver2.jdbc.url.principal="hive/_HOST@KR.DF.NAVERNCP.COM" \
  --principal example@KR.DF.NAVERNCP.COM \
  --keytab ./df.example.keytab \
  --jars /usr/hdp/current/hive_warehouse_connector/hive-warehouse-connector-assembly-1.0.0.3.1.0.0-78.jar

アクセスが完了すると、以下のような画面が表示されます。

Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://ambari1.kr.df.naverncp.com:4040
Spark context available as 'sc' (master = local[2], app id = local-1624438130183).
Spark session available as 'spark'.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.3.2.3.1.0.0-78
      /_/

Using Scala version 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_112)
Type in expressions to have them evaluated.
Type :help for more information.

scala> import com.hortonworks.hwc.HiveWarehouseSession
import com.hortonworks.hwc.HiveWarehouseSession

scala> import com.hortonworks.hwc.HiveWarehouseSession._
import com.hortonworks.hwc.HiveWarehouseSession._

scala>  val hive1 = HiveWarehouseSession.session(spark).build()
hive1: com.hortonworks.spark.sql.hive.llap.HiveWarehouseSessionImpl = com.hortonworks.spark.sql.hive.llap.HiveWarehouseSessionImpl@3da61af2