我尝试使用 Presto 和 Amazon EMR 上的 Hive 引擎(如 ETL)将数据从 S3 存储桶导出到其他 S3 存储桶,但在导出数据时发生了 FileAlreadyExistsException。如何使用 Presto 导出数据?
环境
- EMR-4.3.0
- 蜂巢 1.0.0
- 普雷斯托沙盒 0.130
错误
我尝试了以下操作:
$ 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 Hive连接器不喜欢EMR(4.2和4.3)用于hive.s3.staging-directory
/tmp/
符号链接引起的,您可以使用配置API覆盖hive.s3.staging-directory
并将其设置为/mnt/tmp/
,如下所示:
classification=presto-connector-hive,properties=[hive.s3.staging-directory=/mnt/tmp/]
我已经通过以下命令解决了这个问题:
presto-cli --catalog hive --schema default --execute 'select log from logs' | aws s3 cp - s3://foo-bucket/export/data.txt