【トラブル】【AWS】EMR / DBアクセス に関するトラブルシューティング

■ はじめに

Amazon EMR 上で
エラー「Error encountered near token 'TOK_TMP_FILE'」や
エラー「NoRouteToHostException: No route to host」が発生した。
その際の調査方法や解決案などを記しておく。

目次

【1】発生現象 / エラー内容
 1)Create table + Select insert 時のエラー
 2)Create table 時のエラー
【2】原因
【3】調査方法
【4】解決案

【1】発生現象 / エラー内容

以下、2つの現象があった。

1)Create table + Select insert 時のエラー
2)Create table 時のエラー

1)Create table + Select insert 時のエラー

以下「エラーが発生したHQL例」を EMR 上で実行したら、
エラー「Error encountered near token 'TOK_TMP_FILE'」が発生した。

エラーが発生したHQL例

use sample_db;

create table person as
select * from tmp_person;

エラー内容

FAILED: SemanticException 0:0 Error creating temporary folder on:
hdfs://ip-XX-XX-XX-XXX.aws.xxxxx:8020/user/hive/warehouse/sample_db.db.
Error encountered near token 'TOK_TMP_FILE'

2)Create table 時のエラー

以下「エラーが発生したHQL例」を EMR 上で実行したら、
エラー「NoRouteToHostException: No route to host」が発生した。

エラーが発生したHQL例

create table sample_db2.employee
(
 id string,
 name string
)
PARTITIONED BY
(
  create_at string
);

エラー内容

FAILED: Exception Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask.
MetaException(message: Got exeception: java.net.NoRouteToHostException:
No Route to Host from
ip-10-152-xx.xxxxx/10.152.2.00 to ip-10-153-xx.xxxxx:8020
failed on socket timeout exception: java.net.NoRouteToHostException:
No route to host;
For more details see:  http://wiki.apache.org/hadoop/NoRouteToHost

【2】原因

 対象DB(今回の場合、「sample_db」「sample_db2」)の実体が
一時的に起動したEMR(今回の場合、「ip-XX-XX-XX-XXX.aws.xxxxx」)上で
指定されており、実行時には存在していなかったため。

  => 詳細は、以下「【3】調査方法」を参照。

メモ(こぼれ話)

 エラー発生して調査した当初、
エラー「Error encountered near token 'TOK_TMP_FILE'」を
キーワードで調べた際に、以下のサイトから
権限問題かと思ってハマってしまった、、、

https://stackoverflow.com/questions/51535822/hive-create-table-sematicexception-00

 「2)Create table 時のエラー時」が発生したのは、
既に原因が分かっていたので、こちらが先に発生していれば、
まだ追いやすかったと思うが、、、

【3】調査方法

以下、確認手順。

[1] AWS management consoleの AWS Glueの画面に遷移
[2] 右側の [Databases]をクリック
[3] 対象DBを選択
 => 今回の場合、「sample_db」や「sample_db2」。
[4] Locationを確認する
 => 今回の場合、
 「hdfs://ip-XX-XX-XX-XXX.aws.xxxxx:8020/user/hive/warehouse/sample_db.db」
 と指定されていた。
=> ちなみに、今回は、S3上の外部テーブルとして作成したいので、
 これではまずかった。

【4】解決案

AWS management consoleの AWS Glueの画面を使って
正しいLocationを指定する。

DB Location 修正手順例

[1] AWS management consoleの AWS Glueの画面に遷移
[2] 右側の [Databases]をクリック
[3] 対象DBを選択
 => 今回の場合、「sample_db」
[4] 「Edit database」を選択
[5] 正しいLocationを指定する
 => 今回の場合、「s3://your-s3-bucket-name/xxx/sample_db」

関連記事

テーブルアクセス時に例外「Vertex failed, ... InvalidInputException」が発生する
https://dk521123.hatenablog.com/entry/2021/07/06/120134
Amazon EMR に関するトラブルシューティング
https://dk521123.hatenablog.com/entry/2020/08/05/144724
Hive に関するトラブルシューティング
https://dk521123.hatenablog.com/entry/2020/11/20/174039
Hive / Partition に関するトラブルシューティング
https://dk521123.hatenablog.com/entry/2020/05/28/175428
エラー「SemanticException Cartesian products are disabled for safety reasons」が発生する
https://dk521123.hatenablog.com/entry/2021/06/12/093046