■ はじめに
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