ablog

不器用で落着きのない技術者のメモ

Presto on EMR で "deserializer does not exist: org.openx.data.jsonserde.JsonSerDe" と怒られる

事象

Presto on EMR で JSON の外部テーブルにクエリを実行すると "deserializer does not exist: org.openx.data.jsonserde.JsonSerDe" と怒られる。

$ hive
hive> CREATE EXTERNAL TABLE IF NOT EXISTS sh10.json_sales(
(中略)  
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
LOCATION 's3://バケット名/data/json/sh10/sales/';
hive> exit;

$ presto-cli
presto> use hive.sh10;
presto:sh10> select count(*) from json_sales limit 10;

Query 20181121_173221_00003_j9ti8, FAILED, 2 nodes
Splits: 473 total, 0 done (0.00%)
0:06 [0 rows, 0B] [0 rows/s, 0B/s]

Query 20181121_173221_00003_j9ti8 failed: deserializer does not exist: org.openx.data.jsonserde.JsonSerDe

解決策

全て(マスター/コア/タスク)のノードで以下を実行する。

$ cd  /usr/lib/presto/plugin/hive-hadoop2/
$ sudo wget http://www.congiu.net/hive-json-serde/1.3.6-SNAPSHOT/cdh5/json-serde-1.3.6-SNAPSHOT-jar-with-dependencies.jar
$ sudo initctl stop presto-server
$ sudo initctl start presto-server

環境

  • emr-5.19.0
  • Hive 2.3.3, Spark 2.3.2, Presto 0.212, Ganglia 3.7.2, Tez 0.8.4