Sparkに組み込まれているThrift Serverを起動した時の手順のメモ。
環境
- Spark3.0.0 (Pre-build for Apache Hadoop 3.2 and later)
- MySQL 5.7.24 (Hiveメタストアとして利用)
MySQLユーザー、データベース作成
MySQL側でhiveユーザーとmetastoreデータベースを作成する。Hiveにはデータベースを自動作成する機能があるが、それを使うとデータベースの文字コードがlatin1になってしまったので、マルチバイトユーザーは手で作成したほうが良いと思われる。
CREATE USER 'hive'@'%' IDENTIFIED BY 'hivepass';
CREATE DATABASE metastore DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL ON metastore.* TO 'hive'@'%';
MySQL テーブル作成
これもデータベースと同様、Hiveにはテーブルを自動作成する機能があるのだが、バグっているのかうまく動かないためこれも手で作成した。Spark組み込みのHiveのバージョンが2.3.7だったため、GitHubの以下からDDLをダウンロードしてMySQL上で実行した。
hive/hive-schema-2.3.0.mysql.sql at master · apache/hive
実行する前にlatin1
をutf8
に、latin1_bin
をutf8_general_ci
にそれぞれ置換した。また、utf8の場合インデックスに指定できるカラムの最大長が256バイトであるため、varchar(767)
をvarchar(256)
に置換した。
MySQLドライバのインストール
Mavenのリポジトリからダウンロードして所定の場所に置く。
curl -o ${SPARK_HOME}/jars/mysql-connector-java-8.0.21.jar https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.21/mysql-connector-java-8.0.21.jar
hive-site.xmlを作成
${SPARK_HOME}/conf/hive-site.xml を作成して以下の設定を記述。
<configuration>
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://{hostname}/metastore</value>
</property>
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>hivepass</value>
</property>
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
</configuration>
Thrift serverを起動
下記スクリプトを実行してThrift serverを起動する。(オプション省略)
${SPARK_HOME}/sbin/start-thriftserver.sh \
--name spark-thrift-server \
--master <master-uri> \
...
懸念点1
hive.metastore.schema.verification
オプションをfalseにしないと現状起動しない。falseにしてもログファイルに以下のログが出力される。恐らくメタストアのバージョンが取得できていないことが原因と思われるが、なぜ取得できないのかが不明。(情報求む)
WARN ObjectStore: Version information not found in metastore. hive.metastore.schema.verification is not enabled so recording the schema version 2.3.0
懸念点2
Setting up hidden External Hive Metastore (MySQL),ADLS access configuration in Databricks Spark Cluster によると、lower_case_table_names 2
に設定したほうが良いらしい。