当我使用 Amazon EMR 上的 Hive 引擎从 Presto 导出数据时发生 FileAlreadyExistsException

FileAlreadyExistsException occurred when I was exporting data from Presto with Hive engine on Amazon EMR

我尝试使用 Presto 和 Amazon EMR 上的 Hive 引擎将数据从 S3 存储桶导出到其他 S3 存储桶,如 ETL,但在我导出数据时发生 FileAlreadyExistsException。 如何使用 Presto 导出数据?

环境

错误

我尝试了以下操作:

$ hive
hive> CREATE EXTERNAL TABLE logs(log string)
   -> LOCATION 's3://foo-bucket/logs/';

hive> CREATE EXTERNAL TABLE s3_export(log string)
   -> ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
   -> LOCATION 's3://foo-bucket/export/';

hive> exit;

$ presto-cli --catalog hive --schema default
presto:default> INSERT INTO s3_export SELECT log FROM logs;
Query 20160203_125741_00018_ba5sw, FAILED, 3 nodes
Splits: 7 total, 1 done (14.29%)
0:01 [39 rows, 4KB] [49 rows/s, 5.13KB/s]

Query 20160203_125741_00018_ba5sw failed: java.nio.file.FileAlreadyExistsException: /tmp

我已经通过以下命令解决了问题:

presto-cli --catalog hive --schema default --execute 'select log from logs' | aws s3 cp - s3://foo-bucket/export/data.txt

这是由于 Presto Hive 连接器不喜欢符号链接 /tmp/ EMR(4.2 和 4.3)用于 hive.s3.staging-directory,您可以使用配置 API 覆盖 hive.s3.staging-directory 并将其设置为 /mnt/tmp/,如下所示:

classification=presto-connector-hive,properties=[hive.s3.staging-directory=/mnt/tmp/]